MySQL(二十二)其他数据库日志(一)通用查询日志和错误日志
1 MySQL支持的日志
1.1 日志类型
- 慢查询日志:记录执行时间超过
long_query_time
的所有查询,方便我们对查询进行优化 - 通用查询日志:记录所有连接的起始和终止时间,以及连接发送给数据库的所有指令,对复原操作的实际场景、发现问题甚至是对数据库操作的审计都有很大的作用
- 错误日志:记录MySQL服务的启动、运行或停止MySQL服务时出现的问题,方便了解服务器的状态,从而对服务器进行维护
- 二进制日志:记录所有更新数据的语句,可以用于主从服务器之间的数据同步以及服务器遇到故障的时候数据的无损失恢复
- 中继日志(MySQL8.0新增):用于主从服务器架构中,从服务器用来存放主服务器二进制文件内容的一个中间文件,从服务器通过读取中继日志的内容,来同步主服务器上的操作
- 数据定义语句日志(MySQL8.0新增):记录数据定义语句执行的元数据操作
除了二进制日志外,其他的文件都是文本文件。默认情况下,所有的日志文件都创建于MySQL数据目录中。
1.2 日志的弊端
- 日志功能会降低MySQL的性能。例如在查询频繁的数据库中开启通用查询日志和慢查询日志,MySQL数据库会花费很多时间去记录日志
- 日志文件会占据大量的磁盘空间
2 慢查询日志
详见MySQL(十三)MySQL性能分析工具:慢查询日志与PROFILE查询成本
3 通用查询日志
通用查询日志记录所有连接的起始和终止时间,以及连接发送给数据库的所有指令,对复原操作的实际场景、发现问题甚至是对数据库操作的审计都有很大的作用
3.1 问题场景
3.2 查看当前状态
mysql> show variables like '%general%';
+------------------+---------------------------------+
| Variable_name | Value |
+------------------+---------------------------------+
| general_log | OFF |
| general_log_file | /var/lib/mysql/89d64201156e.log |
+------------------+---------------------------------+
2 rows in set (0.00 sec)
general_log:通用日志状态,默认是关闭的
general_log_file:通用日志生成路径,没有开启通用日志是查不到的
3.3 启动日志
-
永久修改,在
my.conf
配置文件中的[mysqld]组下加入log选项,并重启MySQL服务[mysqld] genral_log = on genral_log_file = xxx # 如果不指定,默认为hostname.log
-
临时性方式
mysql> set global general_log = on; Query OK, 0 rows affected (0.00 sec) mysql> cat /var/lib/mysql/89d64201156e.log; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'cat /var/lib/mysql/89d64201156e.log' at line 1 mysql> show variables like '%general%'; +------------------+---------------------------------+ | Variable_name | Value | +------------------+---------------------------------+ | general_log | ON | | general_log_file | /var/lib/mysql/89d64201156e.log | +------------------+---------------------------------+ 2 rows in set (0.01 sec)
设置完成后即可查看:
bash-4.4# cat /var/lib/mysql/89d64201156e.log /usr/sbin/mysqld, Version: 8.0.31 (MySQL Community Server - GPL). started with: Tcp port: 3306 Unix socket: /var/run/mysqld/mysqld.sock Time Id Command Argument 2023-05-09T06:38:42.730222Z 3596 Query show variables like '%general%'
3.4 停止日志
-
永久修改,在
my.conf
配置文件中的[mysqld]组下加入log=off选项或者注释掉,并重启MySQL服务[mysqld] general_log = off #general_log = off
-
临时性方式
SET GLOBAL general_log = off;
3.5 删除、刷新日志
如果数据使用特别频繁,那么通用查询日志会占用服务器特别大的磁盘空间,数据管理员可以删除很长时间之前的通用查询日志,以保证MySQL服务器上的磁盘空间。
然后使用下面的命令重新生成通用查询日志文件,前提是一定要开启通用日志。
mysqladmin -uroot -p flush-logs;
如果希望备份原文件:
bash-4.4# cd /var/lib/mysql/
bash-4.4# ls
'#ib_16384_0.dblwr' 89d64201156e.log binlog.000007 binlog.000011 binlog.000015 ca.pem dbtest2 grainmall_sms ibdata1 mysql.sock public_key.pem sys
'#ib_16384_1.dblwr' atguigudb binlog.000008 binlog.000012 binlog.index client-cert.pem document grainmall_ums ibtmp1 mysqlTest renren_fast undo_001
'#innodb_redo' atguigudb1 binlog.000009 binlog.000013 blog client-key.pem grainmall_oms grainmall_wms mysql performance_schema server-cert.pem undo_002
'#innodb_temp' auto.cnf binlog.000010 binlog.000014 ca-key.pem dbtest1 grainmall_pms ib_buffer_pool mysql.ibd private_key.pem server-key.pem
# 备份日志文件
bash-4.4# mv /var/lib/mysql/89d64201156e.log /var/lib/mysql/89d64201156e.log.bak
# 重新生成
bash-4.4# mysqladmin -uroot -p flush-logs;
Enter password:
bash-4.4# cat /var/lib/mysql/89d64201156e.log;
/usr/sbin/mysqld, Version: 8.0.31 (MySQL Community Server - GPL). started with:
Tcp port: 3306 Unix socket: /var/run/mysqld/mysqld.sock
Time Id Command Argument
2023-05-09T06:53:27.135253Z 3613 Quit
4 错误日志
错误日志
记录MySQL服务的启动、运行或停止MySQL服务时出现的问题,方便了解服务器的状态,从而对服务器进行维护。如果MySQL服务出现异常,错误日志是发现问题解决问题的首选。
4.1 启动日志
在MySQL中错误日志功能是默认开启的,并且无法关闭。默认情况下错误日志存储在mysql数据目录下的mysqld.log
(linux系统)或hostname.err(mac系统)。如果需要更改可以在my.cnf
配置文件中进行配置:
[mysqld]
log-error=xxxx
4.2 查看日志
mysql> show variables like 'log_err%';
+---------------------+---------------------+
| Variable_name | Value |
+---------------------+---------------------+
| log_error | /var/log/mysqld.log |
| log_error_verbosity | 3 |
+---------------------+---------------------+
2 rows in set (0.02 sec)
可以看到错误日志中记录了服务器启动的时间,以及存储引擎InnoDB
启动和停止的时间,最初在做初始化的时候生成的数据库初始密码也是放在mysqld.log
文件中的。
4.3 删除、刷新日志
和上面通用日志差不多,但是这里可能会报错,这是由于flush-logs的更新:
-
MySQL5.5.7以前的版本,flush-logs会将错误日志重命名为
filename.err_old
,并创建新的日志 -
MySQL5.5.7开始,flush-logs只是重新打开日志文件,并不会做日志的备份和创建工作,所以需要自行创建新日志文件
install -omysql -gmysql -m0644 /dev/null /var/log/mysqld.log
mysqladmin -uroot -p flush-logs;