dilema do formato binlog do MySQL?

3

Versão do MySQL: 5.5.13

Se eu definir o formato do log binário como STATEMENT , recebi os seguintes avisos no mestre :

[Warning] Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it uses a system function that may return a different value on the slave...

Eu também li as limitações de procedimentos e funções de repositórios de replicação: link

Mas se eu alternar para MIXED , mysqld.log no escravo será exibido:

[Warning] Slave SQL: Could not execute Update_rows event on table hdcn.sessions; Can't find record in 'sessions', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.003834, end_log_pos 602692401, Error_code: 1032

[Warning] Slave SQL: Could not execute Delete_rows event on table reportingdb.102_rpt_clickview; Can't find record in '102_rpt_clickview', Error_code: 1032; handler error HA_ERR_END_OF_FILE; the event's master log mysql-bin.003834, end_log_pos 725203511, Error_code: 1032

Parece que o formato MIXED binlog faz com que o mestre não seja replicado completamente como escravo.

Voltei para o formato STATEMENT . Posso ignorar os avisos inseguros?

    
por quanta 29.09.2011 / 05:47

2 respostas

3

Suponho que você fez isso em uma configuração sem limpar o escravo e configurá-lo do zero.

Como a mensagem de erro para a replicação baseada em instruções informa que seu aplicativo usou alguns comandos que não podem ser replicados usando a replicação baseada em instruções. Um exemplo é uma consulta como

INSERT INTO t (t) VALUES(NOW())

onde NOW() retornará valores diferentes quando executados no mestre e no escravo.

Ao fazer isso, você tem dados diferentes sobre o mestre e o escravo. O que é ruim, já que dependendo do seu escravo, seus clientes lerão dados diferentes e as gravações subseqüentes mudarão outros dados, então você acaba com dados que são ainda mais diferentes.

Agora você passa para a replicação mista, que pode usar a replicação baseada em linha para algumas instruções. Com o RBR, você realmente precisa dos mesmos dados, já que é difícil identificar as linhas que foram alteradas e atualizá-las.

Então o que você deve fazer? - Configure seu mestre para usar registros mistos e, em seguida, configure o escravo usando um instantâneo consistente.

    
por 29.09.2011 / 11:03
1

Você deve eliminar todas as chances de inserções, atualizações, tabelas temporárias abertas, etc.

  1. em escravo (s):
stop slave;
flush tables with read lock;
  1. no mestre:
flush tables with read lock;
set global binlog_format='MIXED';
unlock tables;
  1. em escravo (s):
unlock tables;
start slave;
    
por 06.12.2012 / 22:22