MySQL的日志种类

日志种类大体分为以下几种

  • 错误日志 (Error Log):就像快递公司的客服投诉和系统故障记录本。

  • 二进制日志 (Binlog):就像快递公司的所有包裹出入库的流水账。

  • 重做日志 (Redo Log):就像快递仓库门口的临时装卸记录板。

  • 回滚日志 (Undo Log):就像快递公司的包裹退回记录单。

  • 慢查询日志 (Slow Query Log):就像快递公司的效率监控报告。

  • 通用查询日志 (General Query Log):就像快递公司的全方位监控录像。

分析

  1. Error Log
    他主要是记录MySQL服务器启动、运行、停止过程中一些严重的警告和错误信息

再my.cnf中配置:

[mysqld]
log-error = /var/log/mysql/error.log # 指定错误日志文件路径
  1. Binlog - 核心
    这是一个逻辑日志,记录所有更改数据的SQL语句或数据行,但不包括SELECT和SHOW这类的查询

主要应用场景有

  1. 主从复制
  2. 数据恢复
  3. 审计

在my.cnf中配置

[mysqld]
server-id = 1 # 主从复制中服务器的唯一ID
log_bin = /var/log/mysql/mysql-bin # 启用并指定Binlog文件路径和前缀
expire_logs_days = 7 # 自动清理7天前的日志
sync_binlog = 1 # 每次事务提交都刷盘,最安全但性能略有损耗
  1. Redo Log
    这是一个物理日志,记录的是数据页的物理变化
    先写日志,再写磁盘。通过顺序IO写日志代替随机IO写数据页,提升了事务提交速度
[mysqld]
innodb_log_file_size = 256M # 每个Redo Log文件的大小
innodb_log_files_in_group = 2 # Redo Log文件组数量,通常为2

通常是默认打开的,无需改动
Redo Log是循环写入的,写满第一个文件ib_logfile0后再写第二个ib_logfile1,全部写满后回溯到第一个文件覆盖写入

  1. Undo Log - InnoDB特有
    这是一个逻辑日志,记录的是SQL的反向操作,比如INSERT INTO t VALUES(1,2,3),Undo Log记录的是DELETE FROM t WHERE id = 1
    主要用于事务回滚以及MVCC(实现一致读)
    不需要额外配置,完全由InnoDB管理。当事务回滚或该版本无人使用时,对应的UndoLog空间会被自动清理

  2. Slow Query Log
    记录执行时间超过阈值(long_query_time)的SQL语句

 [mysqld]
slow_query_log = 1 # 开启慢查询日志
slow_query_log_file = /var/log/mysql/mysql-slow.log # 指定文件
long_query_time = 2 # 设置慢查询阈值,单位秒。执行时间超过2秒的SQL会被记录
log_queries_not_using_indexes = 1 # 记录未使用索引的查询(慎用,可能记录很多)
  1. General Query Log
    记录所有客户端链接和执行的SQL语句,信息量太大,严重影响性能
 [mysqld]
general_log = 1 # 开启通用日志
general_log_file = /var/log/mysql/mysql-general.log # 指定文件

相关资料

binlog还能干什么