Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Código de aviso do MySQL 1592 Instrução não segura gravada no log binário usando o formato de instrução


Você provavelmente está familiarizado com os dois formatos de log binário , baseado em instrução -- que registra as consultas reais que modificam dados no mestre para que possam ser executadas no escravo e baseado em linha -- que registra imagens anteriores e/ou posteriores dos dados de linha reais que foram alterado pela consulta, para que o escravo possa aplicar diretamente essas alterações aos seus dados... e modo misto, onde o otimizador e o mecanismo de armazenamento determinam qual formato é o formato ideal em uma base de consulta por consulta.

A instrução que você está executando não é segura em princípio porque você está usando INSERT ... SELECT em uma tabela com uma coluna de incremento automático. Se uma consulta dessa forma geral foram usados ​​em um STATEMENT ambiente baseado e o SELECT não retornasse as linhas na mesma ordem no mestre e no escravo, as linhas poderiam ser selecionadas em uma ordem diferente e, portanto, acabariam com valores de incremento automático diferentes.

Na prática, o específico consulta que você está executando é determinístico porque você está inserindo apenas uma linha e especificando explicitamente o valor de incremento automático. Eu suspeito que é a causa de sua confusão. No entanto, parece que você ainda está acionando o aviso porque está fazendo INSERT ... SELECT em uma tabela com um incremento automático, e o servidor parece estar aplicando a determinação "insegura" generalizada à consulta por uma questão de princípio, em vez de precisão.

Alternando seu binlog_format para MIXED deve fazer com que o aviso desapareça, já que o servidor pode alternar os modos a seu critério... e é muito improvável que tenha efeitos colaterais negativos. Se não fosse o fato de que STATEMENT sempre foi o padrão (já que inicialmente esse era o único tipo de replicação disponível), suspeito que eles teriam feito MIXED o padrão há muito tempo... na verdade, se você se familiarizar com os internos dos logs binários, provavelmente estará inclinado a fazer como eu e usar ROW em quase tudo... tende a ser um log binário muito mais útil para solucionar problemas e evitar problemas, porque os dados de linha "antigos" são registrados em DELETE e UPDATE .