一、通用查询日志
用来记录用户的所有操作 ,包括启动和关闭MySQL服务、所有用户的连接开始时间和截止时间、发给 MySQL 数据库服务器的所有 SQL 指令等。当我们的数据发生异常时,查看通用查询日志,还原操作时的具体场景,可以帮助我们准确定位问题。
问题场景
在电商系统中,购买商品并且使用微信支付完成后,却发现支付中心的记录并没有新增,此时用户再次使用支付宝支付,就会出现重复支付的问题。但是当天去数据库中查询数据的时候,就会发现只有一条记录存在,那么此时给到的现象就是只有一条支付记录,但是用户却支付了两次。
对系统进行了仔细检查,没有发现数据问题,因为用户编号和订单编号以及第三方流水号都是对的,可是用户确实支付了两次,这个时候,我们想到检查通用查询日志,看看当天到底发生了什么。
查询后,发现用户使用微信支付完以后,出现网络故障,支付中心没有及时收到微信的支付的回调信息通知,导致当时没有写入数据。用户又使用支付宝支付,此时记录更新到支付中心。晚上微信的回调通知来了,但是支付中心已经存在支付宝的记录,所以覆盖了原始记录。
二、开启通用查询日志
1、通用查询日志默认是关闭的
SHOW VARIABLES LIKE '%general%';
1、永久性方式
修改my.cnf或者my.ini配置文件来设置。在[mysqld]组下加入log选项,并重启MySQL服务。格式如下
[mysqld]
general_log=ON
general_log_file=[path[filename]] #日志文件所在目录路径,filename为日志文件名
如果不指定目录和文件名,通用查询日志将默认存储在MySQL数据目录中的hostname.log文件中,hostname表示主机名
2、临时性方式
SET GLOBAL general_log=on; # 开启通用查询日志
SET GLOBAL general_log_file=’path/filename’; # 设置日志文件保存位置
三、查看日志
在通用查询日志里面,我们可以清楚地看到,什么时候开启了新的客户端登陆数据库,登录之后做了什么 SQL 操作,针对的是哪个数据表等信息
四、停止日志
1、永久性方式
修改 my.cnf 或者 my.ini 文件,把[mysqld]组下的 general_log 值设置为 OFF 或者把general_log一项注释掉。修改保存后,再 重启MySQL服务 ,即可生效
[mysqld]
general_log=OFF或者
[mysqld]
#general_log=ON
2、临时性方式
SET GLOBAL general_log=off;
五、删除\刷新日志
如果数据的使用非常频繁,那么通用查询日志会占用服务器非常大的磁盘空间。数据管理员可以删除很长时间之前的查询日志,以保证MySQL服务器上的硬盘空间
1、删除日志
通用查询日志的目录默认为MySQL数据目录。在该目录下手动删除通用查询日志
2、刷新日志
刷新MySQL数据目录,发现创建了新的日志文件。前提一定要开启通用日志
mysqladmin -uroot -p flush-logs