Чи нормально копіювати базу даних mysql?


15

Коли я оригінально налаштовував реплікацію «master-to-master», я використовував:

binlog-ignore-db=mysql

і синхронізували облікові записи користувачів та надавали вручну. Це просто, як це робилося в тому, як я використовував у той час. Але чи є причина, чому я не повинен видаляти цей рядок і дозволити самій mysqlбазі даних копіюватися?

Якщо так: Перш ніж внести зміни, окрім того, щоб переконатися, що всі гранти однакові для обох (або краще сказати, що вся база даних mysql однакова), чи є ще щось, що я повинен двічі перевірити чи знати?


Протягом останніх 4,5 років я постійно боровся з проблемами реплікації під час оновлення mysql, навіть при незначних оновленнях. Причина полягає в тому, що apt-get upgrade(власне, mysql-сервер .deb postinst script) виконує ALTER TABLE userзаяви, які неможливо повторити. Я опублікував робоче рішення на сервері defaultfault.com/questions/686025/…
dlo

Відповіді:


12

Надати собі дозволу mysql цілком можливо, не знаючи команд SQL GRANT .

Приклад. Ось, щоб створити власного користувача з повними привілеями, використовуючи SQL GRANT з будь-якого місця, яке називається superdba з паролем ClarkKent:

GRANT ALL PRIVILEGES ON *.* TO superdba@'%' IDENTIFIED BY 'ClarkKent' WITH GRANT OPTION; 

Ось як це можна зробити без команди GRANT:

Перш за все, ось mysql.user для MySQL 5.1.51

mysql> desc mysql.user;
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Field                 | Type                              | Null | Key | Default | Extra |
+-----------------------+-----------------------------------+------+-----+---------+-------+
| Host                  | char(60)                          | NO   | PRI |         |       |
| User                  | char(16)                          | NO   | PRI |         |       |
| Password              | char(41)                          | NO   |     |         |       |
| Select_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Insert_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Update_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Delete_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Create_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Drop_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Reload_priv           | enum('N','Y')                     | NO   |     | N       |       |
| Shutdown_priv         | enum('N','Y')                     | NO   |     | N       |       |
| Process_priv          | enum('N','Y')                     | NO   |     | N       |       |
| File_priv             | enum('N','Y')                     | NO   |     | N       |       |
| Grant_priv            | enum('N','Y')                     | NO   |     | N       |       |
| References_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Index_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Alter_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Show_db_priv          | enum('N','Y')                     | NO   |     | N       |       |
| Super_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Create_tmp_table_priv | enum('N','Y')                     | NO   |     | N       |       |
| Lock_tables_priv      | enum('N','Y')                     | NO   |     | N       |       |
| Execute_priv          | enum('N','Y')                     | NO   |     | N       |       |
| Repl_slave_priv       | enum('N','Y')                     | NO   |     | N       |       |
| Repl_client_priv      | enum('N','Y')                     | NO   |     | N       |       |
| Create_view_priv      | enum('N','Y')                     | NO   |     | N       |       |
| Show_view_priv        | enum('N','Y')                     | NO   |     | N       |       |
| Create_routine_priv   | enum('N','Y')                     | NO   |     | N       |       |
| Alter_routine_priv    | enum('N','Y')                     | NO   |     | N       |       |
| Create_user_priv      | enum('N','Y')                     | NO   |     | N       |       |
| Event_priv            | enum('N','Y')                     | NO   |     | N       |       |
| Trigger_priv          | enum('N','Y')                     | NO   |     | N       |       |
| ssl_type              | enum('','ANY','X509','SPECIFIED') | NO   |     |         |       |
| ssl_cipher            | blob                              | NO   |     | NULL    |       |
| x509_issuer           | blob                              | NO   |     | NULL    |       |
| x509_subject          | blob                              | NO   |     | NULL    |       |
| max_questions         | int(11) unsigned                  | NO   |     | 0       |       |
| max_updates           | int(11) unsigned                  | NO   |     | 0       |       |
| max_connections       | int(11) unsigned                  | NO   |     | 0       |       |
| max_user_connections  | int(11) unsigned                  | NO   |     | 0       |       |
+-----------------------+-----------------------------------+------+-----+---------+-------+
39 rows in set (0.00 sec)

Просто виконайте ці команди SQL:

INSERT INTO mysql.user SET
Host='%',User='superdba',Password=PASSWORD('ClarkKent'),
Select_priv='Y',Insert_priv='Y',Update_priv='Y',Delete_priv='Y',
Create_priv='Y',Drop_priv='Y',Reload_priv='Y',Shutdown_priv='Y',
Process_priv='Y',File_priv='Y',Grant_priv='Y',References_priv='Y',
Index_priv='Y',Alter_priv='Y',Show_db_priv='Y',Super_priv='Y',
Create_tmp_table_priv='Y',Lock_tables_priv='Y',Execute_priv='Y',
Repl_slave_priv='Y',Repl_client_priv='Y',Create_view_priv='Y',
Show_view_priv='Y',Create_routine_priv='Y',Alter_routine_priv='Y',
Create_user_priv='Y',Event_priv='Y',Trigger_priv='Y';
FLUSH PRIVILEGES;

Цей INSERT - це законний оператор SQL, який може знаходитись у бінарному журналі. Ви хочете, щоб хтось запускав це і мав видимий пароль подорожі по мережі? сидіти в двійковому журналі на майстра? сидіти в журналі ретрансляції на раба?

Маючи цю директиву

binlog-ignore-db=mysql       

запобігає наданню дозволів mysql за допомогою такого SQL. Однак ГРАНТів не можна зупинити таким чином. Тому переконайтеся, що ви виконуєте такі гранти:

SET SQL_LOG_BIN=0;
GRANT ...

щоб запобігти переходу ГРАНТів від ведучого до раба.


О, зачекайте ... Я розгублений: Ви говорите, що заяви GRANT повторюються незалежно від того, що говорить конфіденція binlog-ignore-db? Я знаю, що якщо я зробити нового користувача на одному сервері, він не з’являється на іншому. То, можливо, ви маєте на увазі, що ГРАНТ передається та зберігається, але просто не застосовується до раба?
dlo

ГРАНТИ застосовуються без будь-яких дорожніх блоків. Ось чому потрібно запустити SET SQL_LOG_BIN = 0; в сеансі mysql, щоб запобігти введенню будь-яких команд GRANT у бінарні журнали.
RolandoMySQLDBA

ГРАНТИ застосовуються без будь-яких дорожніх блоків на ведучому та рабі. Ось чому потрібно запустити SET SQL_LOG_BIN = 0; у сеансі mysql, щоб запобігти введенню будь-яких команд GRANT у бінарні журнали та перехід до журналів ретрансляції підлеглого.
RolandoMySQLDBA

1
Добре. Для того, щоб зрозуміти іншим, я вважаю, що ви попереджаєте мене про ГРАНТИ, що відкривають паролі під час транзиту (які можна вирішити за допомогою пропозиції SSL від Скотта) та зберігати чіткий текст у бінлозі. Ви припускаєте, що якщо це стосується мене, то я повинен використовувати як binlog-ignore-db = mysql, так і SET SQL_LOG_BIN = 0 ;. Але якщо я добре з цими умовами, немає особливої ​​проблеми з реплікацією GRANT, видаляючи рядок binlog-ignore-db. Виправте мене, якщо це неточне резюме.
dlo

@dlo - ствердно !!!
RolandoMySQLDBA

4

У мене не було проблем з тиражуванням бази даних mysql, але знову ж таки, моя інфраструктура надає додатковий рівень безпеки за допомогою брандмауерів та проксі-пристроїв, коли ніхто, крім людей з інфраструктури, неможливо навіть підключитися до будь-якого з портів, які MySQL використовує . Це додає додатковий рівень зручності, знаючи, що ви повинні надати дозволи лише лише один раз та повторити їх. Коли воно зводиться до нього, якщо ви правильно встановили хоста, щоб не виставляти його нікому, крім наміченого (наприклад, ви, раб тощо), вам слід добре.

Якщо ви надто переймаєтесь людиною в середині перехоплення, завжди є можливість надсилання реплікації через SSL .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.