É bom replicar o banco de dados `mysql`?

15

Quando configurei originalmente minha replicação mestre para mestre, usei:

binlog-ignore-db=mysql

e foram sincronizando as contas de usuário e concessões manualmente. Isto é simplesmente como foi feito no tutorial que eu estava usando na época. Mas existe alguma razão para eu não remover essa linha e permitir que o mysqlpróprio banco de dados seja replicado também?

Se assim for: Antes de fazer a alteração, além de garantir que todas as concessões sejam iguais em ambas (ou melhor, que todo o banco de dados mysql é idêntico), há mais alguma coisa que eu deva verificar ou estar ciente?

dlo
fonte
Nos últimos 4,5 anos, tenho lutado constantemente com problemas de replicação ao atualizar o mysql, mesmo em pequenas atualizações. O motivo é que apt-get upgrade(na verdade, o script mysql-server .deb postinst) executa ALTER TABLE userinstruções que não podem ser replicadas.
Publiquei

Respostas:

12

É inteiramente possível conceder a você permissões de mysql sem conhecer os comandos SQL GRANT .

Exemplo: Aqui está para criar seu próprio usuário com privilégios totais usando o SQL GRANT de qualquer lugar chamado superdba com uma senha do ClarkKent:

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

Aqui está como você pode fazer isso sem o comando GRANT:

Primeiro de tudo, aqui está o mysql.user for 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)

Basta executar estes comandos 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;

Esse INSERT é uma instrução SQL legal que pode pousar em um log binário. Deseja que alguém execute isso e tenha uma senha visível viajando pela rede? sentar em um log binário no mestre? sentar em um relé log no escravo?

Tendo esta diretiva

binlog-ignore-db=mysql       

impede a concessão de permissões mysql usando esse SQL. No entanto, os GRANTs não podem ser parados dessa maneira. Portanto, certifique-se de realizar concessões como esta:

SET SQL_LOG_BIN=0;
GRANT ...

para impedir que os GRANTs atravessem de mestre para escravo.

RolandoMySQLDBA
fonte
Ah, espere ... Estou confuso: você está dizendo que as instruções GRANT se replicam, não importa o que o conf binlog-ignore-db diz? Sei que, se criar um novo usuário em um servidor, esse usuário não aparecerá no outro. Então, talvez você queira dizer que o GRANT é transmitido e armazenado, mas simplesmente não aplicado ao escravo?
dlo 12/09
AS SUBSÍDIOS são aplicadas sem nenhum bloqueio na estrada. É por isso que você deve executar o SET SQL_LOG_BIN = 0; na sessão do mysql para impedir que qualquer comando GRANT entre nos logs binários.
RolandoMySQLDBA
Os GRANTS são aplicados sem bloqueios de estradas no mestre e no escravo. É por isso que você deve executar o SET SQL_LOG_BIN = 0; na sessão mysql para impedir que qualquer comando GRANT entre nos logs binários e passe para os logs de retransmissão do escravo.
RolandoMySQLDBA
1
Está bem. Para deixar claro para os outros, acredito que você esteja me avisando sobre o GRANTS expondo senhas em trânsito (que podem ser tratadas com a sugestão de SSL por Scott) e armazenado em texto não criptografado no binlog. Você está sugerindo que, se essas são preocupações para mim, eu devo usar binlog-ignore-db = mysql e SET SQL_LOG_BIN = 0 ;. Mas se eu estiver de acordo com essas condições, não haverá nenhum problema específico com a replicação de GRANTs removendo a linha binlog-ignore-db. Corrija-me se este for um resumo impreciso.
dlo 12/09
@dlo - Afirmativo !!!
RolandoMySQLDBA
4

Não tive problemas com a replicação do banco de dados mysql, mas, novamente, minha infraestrutura empresta um nível adicional de segurança com firewalls e dispositivos proxy, onde é impossível para alguém que não seja o pessoal da infraestrutura se conectar a qualquer uma das portas que o MySQL usa. . Ele adiciona um nível extra de conveniência, sabendo que você só precisa conceder permissões uma vez e replicá-lo. Quando tudo se resume a isso, desde que você tenha configurado corretamente o host para não expô-lo a ninguém além do pretendido (por exemplo, você, o escravo, etc ...), você deve ficar bem.

Se você está muito preocupado com o homem nas interceptações intermediárias, sempre há a opção de enviar replicação pelo SSL .

Scott
fonte