2012-09-05 16 views
7

Estoy usando el error de registro para escribir advertencias/errores en un archivo. Cuando realizo la instrucción INSERT IGNORE..SELECT, simplemente sigue escribiendo estos mensajes de advertencia.Desactivar instrucción de advertencia insegura de mysql

120905 3:01:23 [Warning] Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. INSERT IGNORE... SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are ignored. This order cannot be predicted and may differ on master and the slave. 

Quiero dejar de mysql logwriter sigue escribiendo el error una y otra vez. (No puedo ver otro registro porque rellenan todo el archivo de registro ...)

En primer lugar, inserto (a, b, c) en una tabla. c debe ser único en la tabla, y a, b se utilizan para seleccionar. Consulta será así

SELECT c FROM table WHERE a=value1 AND value2<b AND b<value3 

Y mi consulta de inserción es

INSERT IGNORE INTO table VALUES (,,),(,,)...(,,) 

pensé que podría cambiar la consulta no producir advertencia, pero mis datos contienen campo único y tengo que garantizar que la presentada es único en la tabla. Y 500 ~ 2000 filas deben insertarse cada pocos segundos, así que tengo que hacer una inserción masiva.

Si ya hay una docena de millones de filas insertadas, y necesito insertar otras 2000 filas en pocos segundos. ¿Cómo puedo insertarlos de forma segura en la tabla sin llenar el archivo de registro con las advertencias?

(no puedo apagar el registro binario porque necesito utilizar la replicación de MySQL.)

+0

¿Está replicando las tablas? Porque si lo es, este error es significativo. –

+0

Sí, estoy usando la replicación de mysql para copia de seguridad, por razones de escalabilidad – user1640242

+0

¿Entonces ha leído el mensaje de error? – zerkms

Respuesta

13

Usted puede utilizar

SET GLOBAL LOG_WARNINGS = 0 

para desactivar el registro y

SET GLOBAL LOG_WARNINGS = 1 

a vuelve a encenderlo Mi sugerencia personal es envolver la consulta ofensiva con estos en lugar de establecerla globalmente para que pueda rastrear si otras consultas también causan el problema.

Tenga en cuenta que las versiones anteriores de MySQL no son compatibles.

+2

Como variable global, esto desactivará las advertencias para todas las sesiones conectadas a la base de datos, ¿verdad? – rjh

+0

Desde MySQL 5.6.4 esta variable solo se define como GLOBAL. – BoraMa

0

Creo que esta pregunta aún está abierta. Uso set max_error_count=0; your unsafe queries; set max_error_count=64;

antes de las consultas que desea ejecutar es una variable de sesión, por lo que no es necesario ser superusuario para su uso. No solo, no se emitirán advertencias cuando llame a show warnings limit 5; pero tales advertencias no informan en los archivos de registro de mysql. también puede usarlo en procedimientos almacenados. Después de sus consultas, sabe que no son seguras, puede volver a colocar esta variable en su valor original.

Cuestiones relacionadas