在MySQL层面上日志有错误日志、查询日志、二进制日志、慢查询日志。在存储引擎层面有redo log、undo log。文中案例均在MySQL8.0.34下进行。
错误日志
- 错误日志:记录了MySQL服务器启动、停止、运行中发生严重错误、警告的相关信息,当数据库系统无法使用时可以查看此错误文件的内容。
- 错误日志的查看:
- 打开MySQL服务器的配置文件,查看错误日志的位置
vim /etc/mysql/mysql.conf.d/mysqld.cnf # 可以看到log_error的默认值 log_error = /var/log/mysql/error.log
- 可以查看该文件的内容
查询日志
- 查询日志记录了MySQL客户端下所有关于SQL的操作,这个查询日志对系统性能的影响较大,建议关闭,默认也是关闭的。
- 查询日志的配置
# Log all queries
# Be aware that this log type is a performance killer.
# 查询日志的保存位置
# general_log_file = /var/log/mysql/query.log
# 是否开启查询日志
# general_log = 1
二进制日志(binlog 日志)
二进制日志记录了所有的DDL语句和DML语句(select数据查询语句除外),它对于数据恢复以及MySQL集群下的主从复制起着重要作用。
- binlog日志的相关配置项
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
# other settings you may need to change.
# server-id = 1
# binlog的保存位置
# log_bin = /var/log/mysql/mysql-bin.log
# binlog的过期时间
# binlog_expire_logs_seconds = 2592000
# binlog日志的大小
max_binlog_size = 100M
# 指定哪个数据库下所有表的DDL和DML语句(select除外)记录在binlog中
# binlog_do_db = include_database_name
# 忽略哪个数据库的相关操作记录在binlog中
# binlog_ignore_db = include_database_name
- binlog日志的读取:
# 1.将MySQL服务器的配置文件关于binlog的配置如下
service-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_expire_logs_seconds = 600
max_binlog_size = 100M
binlog_do_db = test_binlog
# 2.在操作系统终端下重启MySQL服务器,重启后会在/var/log/mysql/目录下生成mysql-bin.index文件以及mysql-bin.xxx两个文件
# 后缀为index的文件记录最大的日志序号
# xxx为数字编号
service mysql restart;
# 3. 在一个MySQL客户端依次执行如下语句
create database test_binlog;
use test_binlog;
create table student(uid int unsigned primary key auto_increment,name varchar(32),sex enum('male','female') default 'male');
insert into student(name,sex)values('张三','male'),('李四','male'),('小红','female');
select * from student;
# 4. 使用mysqlbinlog工具读取binlog文件
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.00000x
- binlog日志的删除:
- 将指定日志序号之前的binlog日志全部删除。在MySQL客户端下执行
# 表示将00000x之前的binlog日志全部删除 purge master logs to 'mysql-bin.00000x';
- 设置日志的过期天数:在MySQL服务器的配置文件中设置expire_logs_days的值,如果设置了这个值将会覆盖掉binlog-expire-logs-seconds的值
--expire-logs-days=# If non-zero, binary logs will be purged after expire_logs_days days; If this option alone is set on the command line or in a configuration file, it overrides the default value for binlog-expire-logs-seconds. If both options are set to nonzero values, binlog-expire-logs-seconds takes priority. Possible -- expire-logs-days 0
- 从binlog日志文件进行数据的恢复:参看MySQL之数据备份与恢复这一篇
慢查询日志
- 慢查询日志用以记录超过我们定义的慢查询时间的SQL语句。在优化SQL时这个慢查询日志很有用。通过查看慢查询日志找出SQL执行效率低的SQL,然后使用explain分析这些SQL的执行计划。
- 慢查询日志的配置:
- 查找MySQL服务器的配置文件:
find / -name *.cnf
,我的是在/etc/mysql/mysql.conf.d/mysqld.cnf
这个文件中。 - 将如下注释的内容打开
# Here you can see queries with especially long duration # 值为1表示开启慢查询日志 slow_query_log = 1 # 慢查询日志文件的保存位置 slow_query_log_file =/var/log/mysql/mysql-slow.log # 慢查询时间的定义,单位为秒 long_query_time = 0.2 # 是否记录未使用索引的查询SQL # log-queries-not-using-indexes
- 配置好后,重启MySQL服务器:
service mysql restart;
- 查找MySQL服务器的配置文件:
- 案例:
# t_user表包含2000000条记录
select * from t_user;
# 上面这条语句执行0.81秒,则会记录到mysql-slow.log文件中
select * from t_user where age = 1000000;
# 上面这条语句执行也超过200毫秒,则也会记录到mysql-slow.log文件中
# 该文件内容如下
/usr/sbin/mysqld, Version: 8.0.34-0ubuntu0.22.04.1 ((Ubuntu)). started with:
Tcp port: 3306 Unix socket: /var/run/mysqld/mysqld.sock
Time Id Command Argument
# Time: 2023-10-03T10:27:30.955335Z
# User@Host: root[root] @ localhost [] Id: 9
# Query_time: 0.842519 Lock_time: 0.000004 Rows_sent: 2000000 Rows_examined: 2000000
use test;
SET timestamp=1696328850;
select * from t_user;
# Time: 2023-10-03T10:44:26.611835Z
# User@Host: root[root] @ localhost [] Id: 9
# Query_time: 0.473494 Lock_time: 0.000003 Rows_sent: 1 Rows_examined: 2000000
SET timestamp=1696329866;
select * from t_user where age = 1000000;
redo log(重做日志)
- 重做日志:用于记录事务操作的变化,确保事务的持久性。重做日志在事务开启后就开始往重做日志缓存这个缓存中记录。
undo log(回滚日志)
- 回滚日志:保存了事务发生之前的数据的一个版本,用于事务执行失败时进行回滚到上一个版本。
- 回滚日志主要用于事务执行失败时(保证事务的原子性)回滚和MVCC