General log:
1 2 3 4 5 6 |
Geleral log记录了服务器接收到的每一个查询或是命令,无论这些查询或是命令是否正确,甚至是否包含语法错误,general log 都会将其记录下来 . 记录的格式为 {Time ,Id ,Command,Argument }. 也正因为mysql服务器需要不断地记录日志,开启General log会产生不小的系统开销。 因此,Mysql默认是把General log关闭的。 我们可以通过修改Mysql全局变量来开启General log功能或是更改日志存放路径。 注意:mysql5.0版本,如果要开启slow log、general log,需要重启,从MySQL5.1.6版开始,general query log和slow query log开始支持写到文件或者数据库表两种方式,并且日志的开启,输出方式的修改,都可以在Global级别动态修改。 |
日志内容格式
1.General query log可以记录在文件中,也可以记录在表中
在文件中会记录时间、线程ID、命令类型以及执行的语句
2.当日志记录在表中时,还会记录账号信息,示例如下:
记录时间
General Query Log在数据库接收到客户端发来的语句时进行记录。这意味着General Query Log的顺序可能和实际语句执行的顺序是不同的。
设置方法
General Query Log可以在数据库启动时开启,也可以在数据库运行时开启。
1、首先查看log_output,确认日志输出到文件还是数据库。
2. 接下来通过如下命令可以查看 mysql默认的 General log 配置
1 |
show global variables like '%general%'; |
3.要开启General_log日志,有这么几种情况(如下)
<1>.在数据库启动前开启:
1 2 3 4 5 |
设置--general_log来开启日志 设置--log_output=[FILE,TABLE,NONE]来确定日志存放的位置。 设置--general_log_file=file_name来确定日志文件的名称和目录。 /usr/local/mysql/bin/mysqld --general_log=on --log_output='FILE' --general_log_file='/data/mysql/log_output/slt.log' |
<2>.在数据库运行时:
1 2 3 4 5 6 |
#修改全局变量来修改日志设置 #修改general_log、log_output、general_log_file的值来修改相关设置,例如: set global general_log_file='/data/mysql/log_output/slt.log'; #设置日志保存路径 SET GLOBAL log_output='FILE'; #通用查询日志输出格式 set global general_log=on; #开启general log模式 此外,可以通过设置sql_log_off的值为ON或OFF来禁用或启用当前连接的General query log。 |
设置FILE日志分割(每天) 这日志比较大,建议还是分割处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/data/mysql/log_output/*.log{ notifempty daily rotate 99 copytruncate #把正在输出的日志拷(copy)一份出来,再清空(trucate)原来的日志。 nocreate #不创建 missingok dateext postrotate #如果mysql还在运行,就刷新一下日志(下面if条件输出的结果可以用echo $?查看) if test -x /usr/local/mysql/bin/mysqladmin && /usr/local/mysql/bin/mysqladmin -ushooter -p5950996 ping &> /dev/null then #/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true #/bin/kill -HUP $(/bin/cat /data/mysql/mysql.pid) /usr/local/mysql/bin/mysqladmin -ushooter -p5950996 flush-logs fi endscript } |
将上面脚本保存至 /etc/logrotate.d 下 命名为mysql_general
1 2 |
测试: logrotate -f /etc/logrotate.d/mysql_general #强制轮循 |
查看日志目录
当然mysql的其他日志也可以分割
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
样例:(自己看着用) /data/mysql/mysql_error.log /data/mysql/mysql_slow.log /data/mysql/log_output/mysql_general.log{ notifempty daily rotate 99 copytruncate #把正在输出的日志拷(copy)一份出来,再清空(trucate)原来的日志。 nocreate #不创建 missingok dateext postrotate #如果mysql还在运行,就刷新一下日志 if test -x /usr/local/mysql/bin/mysqladmin && /usr/local/mysql/bin/mysqladmin -ushooter -p5950996 ping &> /dev/null then #/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true #/bin/kill -HUP $(/bin/cat /data/mysql/mysql.pid) /usr/local/mysql/bin/mysqladmin -ushooter -p5950996 flush-logs fi endscript } |
3.TABLE模式日志
<1> 查看当前日志输出方式
1 |
show variables like '%log_output%'; |
1 |
show global variables like '%general%'; |
1 2 3 4 5 6 7 8 9 |
TABLE模式日志(修改为日志输出方式为表方式) set global log_output='TABLE'; set global general_log=on; #然后查询mysql数据库里的general_log表 desc mysql.general_log; #从通用查询日志表里查看通用查询日志的内容 select *from mysql.general_log where limit 0,10; select thread_id,command_type,argument from mysql.general_log\G; |
关闭通用查询日志(这个东西开起来还是很耗资源空间的)
可以通过设置系统变量general_log来关闭通用查询日志,此时日志输出设置为FILE 或 TABLE 或 FILE,TABLE
1 |
show variables like 'log_output'; |
1 2 |
set global general_log=off; set global log_output=none; |
执行完上面2条语句,然后你再随便插入一条数据,再去日志表里查找,就找不到任何日志记录了。
- 本文固定链接: https://www.yoyoask.com/?p=1752
- 转载请注明: shooter 于 SHOOTER 发表