在MySQL层面上日志有错误日志、查询日志、二进制日志、慢查询日志。在存储引擎层面有redo log、undo log。文中案例均在MySQL8.0.34下进行。

错误日志

  1. 错误日志:记录了MySQL服务器启动、停止、运行中发生严重错误、警告的相关信息,当数据库系统无法使用时可以查看此错误文件的内容。
  2. 错误日志的查看:
    1. 打开MySQL服务器的配置文件,查看错误日志的位置
    vim /etc/mysql/mysql.conf.d/mysqld.cnf
    # 可以看到log_error的默认值
    log_error = /var/log/mysql/error.log
    
    
    1. 可以查看该文件的内容

查询日志

  1. 查询日志记录了MySQL客户端下所有关于SQL的操作,这个查询日志对系统性能的影响较大,建议关闭,默认也是关闭的。
  2. 查询日志的配置
# 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集群下的主从复制起着重要作用。

  1. 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

  1. 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

  1. binlog日志的删除:
    1. 将指定日志序号之前的binlog日志全部删除。在MySQL客户端下执行
    # 表示将00000x之前的binlog日志全部删除
    purge master logs to 'mysql-bin.00000x';
    
    1. 设置日志的过期天数:在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
    
  2. 从binlog日志文件进行数据的恢复:参看MySQL之数据备份与恢复这一篇

慢查询日志

  1. 慢查询日志用以记录超过我们定义的慢查询时间的SQL语句。在优化SQL时这个慢查询日志很有用。通过查看慢查询日志找出SQL执行效率低的SQL,然后使用explain分析这些SQL的执行计划。
  2. 慢查询日志的配置:
    1. 查找MySQL服务器的配置文件:find / -name *.cnf,我的是在/etc/mysql/mysql.conf.d/mysqld.cnf这个文件中。
    2. 将如下注释的内容打开
    # 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
    
    1. 配置好后,重启MySQL服务器:service mysql restart;
  3. 案例:
# 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(重做日志)

  1. 重做日志:用于记录事务操作的变化,确保事务的持久性。重做日志在事务开启后就开始往重做日志缓存这个缓存中记录。

undo log(回滚日志)

  1. 回滚日志:保存了事务发生之前的数据的一个版本,用于事务执行失败时进行回滚到上一个版本。
  2. 回滚日志主要用于事务执行失败时(保证事务的原子性)回滚和MVCC