2010-04-17 13 views
6

Sé que hay general_log que registra todas las consultas, pero quiero averiguar qué consulta tiene un error y obtener el mensaje de error. He intentado ejecutar una consulta de error a propósito, pero se registra como una consulta normal y no informa con error. ¿Algunas ideas?Cómo registrar consultas de error en mysql?

Respuesta

4

Sé que esto es antiguo ahora, pero para cualquiera que tenga el mismo problema que aterriza aquí desde Google, aquí está mi granito de arena.

Si está utilizando el cliente de cli, simplemente puede redirigir su sterr a un archivo, y luego analizarlo.

mysql -u user -p 2> errors.log 
+0

Gracias, no sabía que podría hacer esto, en lugar de iniciar sesión en un archivo. Lo hice registrar en una base de datos en su lugar. Aclamaciones. –

1

he intentado ejecutar una consulta de error en propósito, pero registra como una consulta normal y no los comunique con error. ¿Alguna idea de ?

así que lo hiciste mal. Ninguna otra idea sin el código.

en PHP que estoy haciendo de esta manera (se supone que está utilizando el controlador MySQL):

$res=mysql_query($sql) or trigger_error(mysql_error().$sql); 

se registrará todas las consultas erróneas si tiene log_errors opción está activada (y tienes que)

EDITAR: Veo ahora, desea el registro de nivel global, m no el nivel de aplicación. ¿Pero puede ser que el nivel de aplicación también se adapte a usted?

+0

Ingresé sql a phpmyadmin 3.3.2 ¿lo están haciendo mal? –

+0

@user phpmyadmin es una aplicación para un solo usuario, por lo tanto no necesita ningún registro. –

+0

Ahora veo, he editado mi respuesta –

6

There is no functionality in MySQL to do this.

Tendrá que seguir con el registro de la capa de la aplicación.

+0

¿por qué? una pregunta, ¿por qué? ¿es demasiado difícil ... hacer? simplemente registre la consulta y el error cuando lo devuelva al cliente. –

+0

@Serge: No lo sé. Parece que no debería ser demasiado difícil de implementar. Tal vez una cuestión de separación de preocupaciones (es decir, es responsabilidad del cliente obtener la declaración SQL correcta, y es libre de registrar la falla como lo desee). –

2

Aunque esta pregunta es bastante antigua, espero que sea útil para alguien que buscó consultas de error de registro de mysql o términos similares.

No hace mucho tiempo, también necesitaba que mysqld registrara solo consultas erróneas. He descubierto que mysql-proxy le permite hacer eso y escribió un pequeño script LUA:

local err_flag = false 
function read_query(packet) 
    if packet:byte() == proxy.COM_QUERY then 
     local user = proxy.connection.client.username 
     local host = proxy.connection.client.src.name 
     if user:lower() == 'someuser' then -- change this to any condition where errors should be logged 
      proxy.queries:append(1, packet, {resultset_is_needed = true}) 
      proxy.queries:append(2, string.char(proxy.COM_QUERY) .. "SET @last_query = '" .. string.sub(packet, 2) .. "'", {resultset_is_needed = true}) 
      proxy.queries:append(3, string.char(proxy.COM_QUERY) .. "SHOW WARNINGS", {resultset_is_needed = true}) 
     end 
     return proxy.PROXY_SEND_QUERY 
    end 
end 


function insert_query(err_t, err_n, err_m) 
    local query = "INSERT INTO `somedb`.`mysql_error` " .. -- change log destination 
    "(`date`, `err_num`,`err_type`, `err_message`, `problem_query`, `conn_id`)" .. 
    " VALUES (NOW(), " .. 
    err_n .. "," .. "\"" .. 
    err_t .."\"" .. "," .. "\"" .. 
    err_m .. "\"" .. "," .. 
    "@last_query" .. "," .. 
    proxy.connection.server.thread_id .. ")" 
    proxy.queries:append(4, string.char(proxy.COM_QUERY) .. query, {resultset_is_needed = true}) 
    return proxy.PROXY_SEND_QUERY 
end 


function read_query_result(inj) 
    local res = assert(inj.resultset) 
    if inj.id == 1 then 
     err_flag = false 
     if res.query_status == proxy.MYSQLD_PACKET_ERR then 
      err_flag = true 
      return proxy.PROXY_IGNORE_RESULT 
     end 
    elseif inj.id == 2 then 
     return proxy.PROXY_IGNORE_RESULT 
    elseif inj.id == 3 then 
     if err_flag == true then 
      for row in res.rows do 
       proxy.response.type = proxy.MYSQLD_PACKET_ERR 
       proxy.response.errmsg = row[3] 
       insert_query(row[1], row[2], row[3]) 
      end 
      return proxy.PROXY_SEND_RESULT 
     end 
     return proxy.PROXY_IGNORE_RESULT 
    elseif inj.id == 4 then 
     return proxy.PROXY_IGNORE_RESULT 
    end 
end 

DDL necesario para la tabla de registro, ajustar somedb. mysql_error a la que le gusta, pero no olvide hacerlo también en el script LUA anterior.

CREATE TABLE `somedb`.`mysql_error` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `date` datetime NOT NULL, 
    `err_num` smallint(6) NOT NULL, 
    `err_type` varchar(10) COLLATE utf8_unicode_ci NOT NULL, 
    `err_message` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `problem_query` varchar(8000) COLLATE utf8_unicode_ci NOT NULL, 
    `conn_id` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

Para utilizar la secuencia de comandos, ejecute

/path/to/mysql-proxy --proxy-lua-script=/path/to/mysql-proxy-log-error-queries.lua

o si eso no funciona (> = v0.9)

/path/to/mysql-proxy --proxy-lua-script=/path/to/mysql-proxy-log-error-queries.lua --plugins=proxy

El proxy ejecuta en el puerto por defecto 4040 , para probar:

mysql -u username -p --host=127.0.0.1 --port=4040

y ejecuta algunos SQL defectuosos.

Cuando todo parece estar en orden, establezca el puerto en su aplicación en 4040 en lugar del puerto mysqld real y tiene el registro de errores mysql en el nivel de la base de datos.

Nota final: mysql-proxy es beta. Usar con precaución, supongo. He estado corriendo aquí por casi medio año ahora sin problemas, sin embargo, YMMV.

+0

Bueno, tuve suerte y tardé un poco en que finalmente funcionara, pero funciona como un encanto. Por cierto, ni siquiera es beta, sigue siendo alfa. http://dev.mysql.com/downloads/mysql-proxy/ –

+0

¿No es un asesino de rendimiento? Creo que el manejo de errores en el lado del cliente estaría bien – Zaffy

+0

Funciona. ¡Estupendo! – hellojinjie

1

Es posible registrar consultas de error con el MariaDB Audit Plugin.

El complemento de auditoría MariaDB funciona para MariaDB, MySQL y Percona Server.

Por ejemplo, para estas consultas

select now(); 
select now()+(); 
select 9+(); 
select 'hello'; 

registro parece así:

20150807 23:00:36,mnv-Satellite-L300D,root,localhost,82,377,QUERY,`test`,'select now() 
LIMIT 0, 1000',0 
20150807 23:00:37,mnv-Satellite-L300D,root,localhost,82,379,QUERY,`test`,'select now()+()',1064 
20150807 23:00:37,mnv-Satellite-L300D,root,localhost,82,382,QUERY,`test`,'select 9+()',1064 
20150807 23:00:38,mnv-Satellite-L300D,root,localhost,82,383,QUERY,`test`,'select \'hello\' 
LIMIT 0, 1000',0 

Última columna es el código de retorno. 0 está bien. De lo contrario, error.

Cuestiones relacionadas