Impedir gravações sem replicação no escravo do MySQL?

12

Temos alguns servidores de banco de dados MySQL configurados com replicação baseada em linhas, para desempenho. O software grava no mestre e lê do mestre ou do escravo. Tudo está funcionando muito bem, na maior parte.

Entendo que o MySQL permitirá gravações para o escravo, mesmo sabendo que é um escravo do MySQL. Idealmente, eu gostaria de fechar isso, portanto, mesmo que alguém escreva algum código incorreto que obtenha uma conexão de leitura e faça um UPDATE, isso gera um erro em vez de colocar dados no escravo.

Existe uma maneira de fazer isso no MySQL? Obviamente, também gostaríamos de tornar isso impossível em nosso software, mas como um firewall em nossos servidores, eu gostaria de ser o mais defensivo possível.

Obrigado!


fonte

Respostas:

13

Habilite a read-onlyopção em my.cnf. Também pode ser especificado como um sinalizador na linha de comando usando o --read-onlymysqld.

Warner
fonte
5
Observe que isso não funcionará para superusuários (ou seja: usuário root no MySQL), pois não obedece somente leitura.
vmfarms
5

Como alternativa à configuração read_only=1(por exemplo, quando existem outros bancos de dados de scratchpad / relatório / desenvolvimento na instância escrava), às vezes retiro todos os privilégios, exceto SELECT, de todos os usuários para o banco de dados que estou replicando.

Ou seja, depois de executar o comando GRANT no mestre, eu executo o comando REVOKE no escravo.

Riedsio
fonte
2

A partir do MySQL 5.7.8 , agora existe uma super_read_onlyopção que impede até mesmo os usuários SUPER de executar atualizações de clientes. Não interrompe o processo de replicação. Como em outras configurações, ele pode ser definido:

  • no formato de linha de comando ( --super_read_only=ON),
  • como uma variável em my.cnf ( super_read_only=1) ou
  • no prompt do cliente ( SET GLOBAL super_read_only = 1;).

Observe que:

  • Ativar habilita super_read_onlyimplicitamenteread_only
  • Desativar read_onlydesativa implicitamentesuper_read_only

Algumas advertências:

  • Nem read_onlynem super_read_onlyimpedirá operações em tabelas temporárias.
  • Eles não impedirão operações de metadados como ANALYZE TABLE e OPTIMIZE TABLE.
  • Os erros de determinadas consultas com super_read_onlyativado foram relatados.

Referência: https://www.percona.com/blog/2016/09/27/using-the-super_read_only-system-variable/

billyw
fonte
1

Como o primeiro post sugere, você faz isso com permissões. A opção somente leitura não funciona para superusuários como FYI e também não é realmente uma solução viável para um escravo no qual você deseja impedir gravações. Você precisa impedir gravações com permissões de usuário / banco de dados / tabela. Por um lado, o usuário de replicação ainda deve poder gravar no escravo para mantê-lo sincronizado com o mestre. A melhor maneira de controlar as gravações é a necessidade de revogar opções que permitam gravações (ou seja, inserções, cria etc.) para o usuário em questão que deveria fazer leituras apenas no escravo.

Jeff
fonte
0

Conceda apenas direitos relacionados à replicação para os usuários no escravo. Você ainda tem o problema de direitos de usuário root, mas pode remover o acesso root remoto ao servidor DB.

Craig
fonte