Можно ли копировать базу данных mysql?

15

Когда я изначально настраивал репликацию мастер-мастер, я использовал:

binlog-ignore-db=mysql

и синхронизировать учетные записи пользователей и гранты вручную. Это просто, как это было сделано в том, как я использовал в то время. Но есть ли причина, по которой мне не следует удалять эту строку и разрешать mysqlкопировать и саму базу данных?

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

ДЛО
источник
В течение последних 4,5 лет я постоянно боролся с проблемами репликации при обновлении mysql, даже при незначительных обновлениях. Причина в том, что apt-get upgrade(на самом деле сценарий mysql-server .deb postinst) выполняет ALTER TABLE userоператоры, которые не могут быть реплицированы. Я отправил рабочий раствор на serverfault.com/questions/686025/...
ДЛО

Ответы:

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 ...

предотвращает прохождение грантов от главного к подчиненному.

RolandoMySQLDBA
источник
Ой, подождите ... Я в замешательстве: вы говорите, что операторы GRANT копируются независимо от того, что говорит conf binlog-ignore-db? Я знаю, что если я создаю нового пользователя на одном сервере, этот пользователь не появляется на другом сервере. Так что, возможно, вы имеете в виду, что GRANT передается и хранится, а просто не применяется к ведомому?
ДЛО
ГРАНТЫ применяются без каких-либо дорожных преград. Вот почему вы должны запустить SET SQL_LOG_BIN = 0; в сеансе mysql, чтобы предотвратить попадание любых команд GRANT в двоичные журналы.
RolandoMySQLDBA
Гранты применяются без каких-либо дорожных преград на хозяина и раба. Вот почему вы должны запустить SET SQL_LOG_BIN = 0; в сеансе mysql для предотвращения попадания любых команд GRANT в двоичные журналы и их передачи в журналы ретрансляции ведомого устройства.
RolandoMySQLDBA
1
Ok. Просто чтобы быть понятным для других, я полагаю, что вы предупреждаете меня о том, что GRANTS раскрывает пароли в пути (которые могут быть решены с помощью предложения SSL Скоттом) и храните открытый текст в binlog. Вы предлагаете, чтобы, если это касается меня, я должен использовать binlog-ignore-db = mysql и SET SQL_LOG_BIN = 0 ;. Но если я согласен с этими условиями, нет особой проблемы с репликацией GRANT путем удаления строки binlog-ignore-db. Поправьте меня, если это неточное резюме.
ДЛО
@dlo - утвердительно !!!
RolandoMySQLDBA
4

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

Если вы чрезмерно озабочены человеком, находящимся на среднем перехвате, всегда есть возможность отправить репликацию по SSL .

Скотт
источник