mysql:排错技巧(1)general_log的使用

来源:<<MySql排错指南>>

作用: 从mysql.general_log(mysql自带的) 表里找到出错时执行的完整sql语句,提取出来手动执行,看看到底发生了什么。

使用方法:
注意事项:
1.建议不要在生产环境使用,因为每条通过该数据库的语句都会被记录到general_log表里。
2.使用前用 truncate 清理下 general_log。
步骤一:set GLOBAL general_log = ‘on’; #开启通用日志
set GLOBAL log_output = ‘table’ #将日志输出到表
步骤二://运行出错的程序或者执行相关的操作来复现问题
步骤三:set GLOBAL general_log = ‘off’ #关闭日志
步骤四:select *from general_log where event_time > ‘2018-01-16 15:08:00’ and argument like ‘%xxx%’ #查询需要的记录

mysql 库的 general_log表的结构如下:
/DDL 信息/------------
CREATE TABLE general_log (
event_time timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
user_host mediumtext NOT NULL,
thread_id bigint(21) unsigned NOT NULL,
server_id int(10) unsigned NOT NULL,
command_type varchar(64) NOT NULL,
argument mediumblob NOT NULL COMMINT “执行阶段的sql”
) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT=‘General log’

示例:
mysql:排错技巧(1)general_log的使用
应用场景:
上图示例只是一个简单测试,该排错方法一般用于如下条件的场景:
sql语句(也可以是存储过程,因为 call 存储过程也是一句sql)是在应用程序的内部调用,语句复杂且有参数拼接,参数个数很多…等等情况,使得我们不能简单的通过sql应用层的调用返回的错误码来分析问题,可以通过此方法获取到执行阶段(应用程序内部的参数已经填充之后的)的完整sql语句,然后可以通过查看填充的参数信息或者手动调用来获取详细的错误信息(例如:Unknown column ‘xxx’ in ‘where clause’)。