在默认情况下,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