1592: ER_BINLOG_UNSAFE_STATEMENT: Unsafe statement written to the binary log (sentencia no segura escrita en el binary log)
MySQL¿Qué significa?
Con el formato de binlog basado en STATEMENT, se ejecutó una sentencia de resultado no determinista (que podría producir un resultado distinto en la réplica). MySQL emite una advertencia al escribirla en el binlog porque hay riesgo de inconsistencia de datos entre el source y la réplica.
¿Por qué ocurre?
Con binlog_format=STATEMENT: funciones no deterministas como UUID(), SYSDATE() o USER() (NOW() se replica de forma segura con STATEMENT), UPDATE/DELETE con LIMIT pero sin ORDER BY, INSERT combinados con AUTO_INCREMENT o ciertas funciones definidas por el usuario/del sistema. Estas sentencias pueden no producir el mismo resultado en todos los servidores.
Cómo solucionarlo
Cambie el formato de binlog a basado en filas (recomendado; ROW es el valor predeterminado desde MySQL 5.7.7): binlog_format=ROW en my.cnf o SET PERSIST binlog_format = ROW; (la variable binlog_format está obsoleta desde 8.0.34; el cambio surte efecto en las sesiones nuevas). El formato ROW replica de forma segura las sentencias no deterministas. Si debe seguir con STATEMENT, sustituya las funciones/expresiones no deterministas por valores constantes y añada un ORDER BY determinista al DML con LIMIT.
Más entradas de este motor
- 3819ER_CHECK_CONSTRAINT_VIOLATED: Check constraint is violated (se infringe la restricción CHECK)
- 1118ER_TOO_BIG_ROWSIZE: Row size too large
- 1170ER_BLOB_KEY_WITHOUT_LENGTH: BLOB/TEXT column used in key specification without a key length (columna BLOB/TEXT usada en una clave sin longitud de clave)
- 3140ER_INVALID_JSON_TEXT: Invalid JSON text
- 1526ER_NO_PARTITION_FOR_GIVEN_VALUE: Table has no partition for value (la tabla no tiene ninguna partición para el valor)
- 1049Unknown database 'name'
- 1364Field 'name' doesn't have a default value (el campo no tiene valor predeterminado)