微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在MySQL中logging错误查询?

我知道有general_loglogging所有的查询,但我想找出哪个查询错误,并得到错误消息。 我试图运行一个错误查询的目的,但它作为一个普通的查询日志,并没有报告错误。 有任何想法吗?

估计NTFS卷上的USNlogging数

在syslog消息中添加一年(linux)

如何获取特定的日志文件并在jenkins控制台输出显示内容

如何突出文件中后续行之间的差异?

用Django,Nginx,Gunicorn和主pipe清空日志

我知道现在这是古老的,但是对于有同样问题的人来说,从谷歌到这里,这是我的两分钱。

如果你使用cli客户端,你可以简单地将你的sterr重定向一个文件,然后解析。

MysqL -u user -p 2> errors.log

MysqL没有这样做的功能

你将不得不坚持应用层日志记录。

即使这个问题是相当古老的,我希望这将是有用的搜索MysqL日志错误查询或类似的条款。

不久之前,我还要求MysqLd只记录错误查询。 我发现MysqL-proxy可以让你做到这一点,并写了一个小的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,调整somedb 。 MysqL_error喜欢,但不要忘记在上面的LUA脚本也这样做。

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

要使用该脚本,请运行

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

或者如果失败(> = v0.9)

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

代理认在端口4040上运行,以测试:

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

并运行一些错误sql

当一切似乎都是为了将​​您的应用程序中的端口设置为4040而不是实际的MysqLd端口,并且在数据库级别上有MysqL错误日志记录。

最后说明: MysqL-proxy是测试版。 我猜,谨慎使用。 在这里跑了近半年,现在没有问题,但是YMMV。

我试图运行一个错误查询的目的,但它作为一个普通的查询日志,并没有报告错误。 有任何想法吗?

所以,你做错了。 没有代码没有其他的想法。

PHP中我这样做(假设你正在使用MysqL驱动程序):

$res=MysqL_query($sql) or trigger_error(MysqL_error().$sql);

它会记录所有错误查询,如果你有log_errors设置(你必须)

编辑:我现在看到,你想全球水平的日志记录,米不是应用程序级别。 但可能是应用程序级别会适合你呢?

可以使用MariaDB审计插件记录错误查询

MariaDB审计插件适用于MariaDB,MysqL和Percona服务器。

例如,对于这些查询

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

日志看起来像这样:

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

最后一列是返回码。 0是好的。 否则 – 错误

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐