关于MySQL的general_log
在默认情况下,MySQL是不会打开general log的,这个log里面会记录MySQL所有的SQL语句,不管是查询语句,还是DML语句,还是DDL语句,还是DCL语句,这些语句统统都会被记录在general log文件中。就连我们连接和断开MySQL数据库的这些语句。
MySQL会把它收到的所有SQL语句按照接收的顺序依次记录在general log中。我们需要注意的是,这里接受的SQL语句的顺序,并不等于SQL语句就是按照这个接受的顺序来执行,因为有的时候,一些SQL可能需要等待其他锁被释放后才会被真正的执行,SQL语句的执行顺序是和binlog中的顺序是相匹配的。
假如我们执行一个select查询语句,在binlog中不会记录这样的SQL语句,但是在general log中就会记录这个select查询语句。
General_log默认不开启的原因有两个:
日志将会非常大,对磁盘是一个很大的压力。因为所有的操作都会被记录下来。 对MySQL数据的性能有一定的影响。
所以,我们一般不会开启这个general log记录的功能,只有在排查某些错误的时候,才会临时打开一下,等到debug完成之后,再把它关闭。
general_log的参数
general log的参数主要有以下几个:
genral_log:用于控制是否开启general log。等于0表示关闭,等于1表示开启。默认是0。
general_log_file:general log日志的文件名是什么,如果不配置这个参数的话,默认会以MySQL服务器的hostname作为general log日志的文件名称,具体文件为:<hostname>.log,general log日志的存放路径。如果不指定,则默认放在datadir参数所指定的目录下。也可以在这个参数中指定具体的路径+名称。
log_output:general log输出的方式,是输出表中,还是保存到文件中。这个参数的取值范围为:table,或者file。默认是保存到file文件中。这个参数是和慢查询日志是共用的,慢查询的日志是记录在表中还是只记录在文件中,也是用这个参数来控制。如果配置为table,就会把慢查询日志和general log日志都写在mysql.geneal_log表中。如果这个参数配置为table,file则表示即写入表中,也写入日志文件中,两个地方都写入日志。
在开启了general log的前提下,如果在某个session连接中,不想让此次操作的所有SQL被记录在general log中,则可以在session中执行set session sql_log_off=on就可以关闭当前session的操作被记录在general log中。
如何永久开启 general_log
如果在配置文件中永久开启:
[mysqld]
general_log=1
general_log_file=/home/mysql_general_log.log #自定义
log_output='FILE' #FILE 或者 TABLE
在SQL命令行中临时开启
mysql> show variables like 'general_log'; -- 查看日志是否开启
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| general_log | OFF |
+---------------+-------+
1 row in set (0.02 sec)
mysql>
mysql> show variables like 'general_log_file'; -- 看看日志文件保存位置
+------------------+-------------------------+
| Variable_name | Value |
+------------------+-------------------------+
| general_log_file | /var/lib/mysql/test.log |
+------------------+-------------------------+
1 row in set (0.02 sec)
mysql>
mysql> show variables like 'log_output'; -- 看看日志输出类型 table或file
+---------------+------------+
| Variable_name | Value |
+---------------+------------+
| log_output | FILE,TABLE |
+---------------+------------+
1 row in set (0.01 sec)
#设置日志输出方式为文件(如果设置log_output=table的话,则日志结果会记录到名为gengera_log的表中,这表的默认引擎都是CSV):
mysql>set global log_output=file;
#设置general log的日志文件路径:
mysql>set global general_log_file='/tmp/general.log';
#开启general log:
mysql>set global general_log=on;
Query OK, 0 rows affected (0.02 sec)
#关闭general log:
mysql>set global general_log=off;
清理general_log
清除general_log日志时不能rm -rf直接将日志删除,直接删除日志不会自动生成,除非重启mysqls实例,正确的清除方法是:
echo "" > **general_log #使用重定向的方法清理**
日志切割脚本
如需debug或查询某一时间段日志,使用日志切割脚本实现
#!/bin/bash
A=/home/epan/general_log ###文件夹路径
logname=general.log ###日志名称
date_dir=`date +%Y%m%d` ###按小时分割
tag=`date +%Y%m%d%H --date="-1 hour"` ###分割出来的减1小时
#这句用于判断,当时间为凌晨00:00时,将date_dri设为昨天
if [ "`date +%H`" = "00" ]; then ###判断是否为00点
date_dir=`date -d "yesterday" +%Y%m%d` ###遇到00点时,时间更改为昨天
fi
if [ -z "$A/$logname" ] ###判断gif.log是否为空
then
exit 0 ###为空退出
fi
if [ -n "$A/$logname" ] ###判断gif.log是否不为空
then
cp $A/$logname $A/general_${tag}.log ###不为空执行复制,复制
A到B.小时.log
> $A/$logname ###清空A
exit 0
fi
#配合crontab实现每小时切割日志
* */1 * * * sh /home/epan/general_log/splie.sh