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
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
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?
Ingresé sql a phpmyadmin 3.3.2 ¿lo están haciendo mal? –
@user phpmyadmin es una aplicación para un solo usuario, por lo tanto no necesita ningún registro. –
Ahora veo, he editado mi respuesta –
There is no functionality in MySQL to do this.
Tendrá que seguir con el registro de la capa de la aplicación.
¿por qué? una pregunta, ¿por qué? ¿es demasiado difícil ... hacer? simplemente registre la consulta y el error cuando lo devuelva al cliente. –
@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). –
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.
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/ –
¿No es un asesino de rendimiento? Creo que el manejo de errores en el lado del cliente estaría bien – Zaffy
Funciona. ¡Estupendo! – hellojinjie
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.
- 1. Cómo registrar consultas mySQL sin índices?
- 2. Cómo registrar consultas lentas en MySQL de alojamiento compartido?
- 3. ¿Cómo registrar consultas SQL de CoreData?
- 4. Cómo registrar consultas sql generadas de Simple.Data ORM para .NET
- 5. ¿Cómo rastrear consultas MySql usando MySql-Proxy?
- 6. ¿Cómo registrar todas las consultas de Doctrine en el archivo?
- 7. Consultas jerárquicas en MySQL
- 8. ¿Cómo puedo registrar consultas en Sqlite3 con Python?
- 9. herramienta de depuración de MySQL consultas lentas?
- 10. ¿Cómo depurar las consultas de MySQL/Doctrine2?
- 11. Caché de consultas MySQL
- 12. ¿Cómo priorizar ciertas consultas en MySQL?
- 13. Cómo monitorear consultas MySQL en Windows
- 14. Registrar consultas erróneas solo en el servidor SQL
- 15. Analizador de consultas MySQL
- 16. Simular consultas de mysql
- 17. ¿Cómo ejecutar dos consultas mysql como una en PHP/MYSQL?
- 18. ¿Es posible registrar consultas sql en tareas de rake?
- 19. MySQL consultas lentas
- 20. Consultas MySQL anidadas
- 21. Creador de consultas PHP MySQL
- 22. funciones de MySQL Doctrina de consultas de
- 23. Importancia de DONDE 1 en consultas MySQL
- 24. cómo escribir expresiones regulares en consultas de selección de MySQL?
- 25. IntelliJ - Persistencia QL Consultas de error sobre consultas de hibernación
- 26. Tiempo de ejecución de consultas MySql
- 27. MySQL Registro de Consultas no válidas
- 28. Cómo acelerar SELECT .. LIKE consultas en MySQL en varias columnas?
- 29. Múltiples consultas MySQL con Ruby
- 30. Consultas de búsqueda de PHP mysql
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. –