前言
前面我们讲了MySQL的主从复制、双主复制以及有哪些隔离级别。今天我们来讲讲MySQL的几个非常重要的日志。
一、二进制日志(Binary Log / Binlog)
1、记录所有数据库的操作(DDL、DML);主要用于数据备份和恢复、以及主从复制和数据迁移的场景。
- DDL,数据定义语言,如CREATE、ALTER、DROP等;
- DML,数据操作语言,如INSERT、UPDATE、DELETE等;
2、开启二进制日志
(1)需要在配置文件(通常是my.cnf
或my.ini
)当中增加或修改配置项。
[mysqld]
log-bin=mysql-bin
(2)设置日志的格式,可以通过设置binlog_format来控制记录的二进制日志格式,常见的格式有STATEMENT、ROW 和 MIXED 三种模式。
[mysqld]
# 配置下面其中一种方式
binlog_format=STATEMENT
binlog_format=ROW
binlog_format=MIXED
- STATEMENT,这种格式记录了执行的SQL语句本身;优点在于日志文件相对较小;缺点是在某些情况下可能导致主从复制数据不一致;
- ROW,这种格式不记录SQL,记录的是受影响的每一行数据的具体变化;优点可以保证数据的一致性;缺点日志文件相对较大;
- MIXED,这种格式是MySQL的默认格式,它结合了STATEMENT和ROW的优点;根据SQL语句的内容智能选择记录方式;
二、慢查询日志(Slow Query Log)
1、记录执行时间超过阀值的SQL,主要用于识别分析优化性能瓶颈。
2、配置慢查询日志
(1)开启慢查询日志,慢查询日志默认情况是不开启的,需要在配置文件增加配置项。
[mysqld]
# 开启慢查询日志
slow_query_log=1
(2)设置慢查询阀值,使用long_query_time参数设置记录执行超过多少时间的SQL会被记录到慢查询日志当中。
[mysqld]
# 设置超过1秒的查询被记录,默认值可能为10秒,单位为秒
long_query_time=1
(3)设置慢查询日志文件,使用slow_query_log_file参数设置日志文件的路径及名称。
[mysqld]
# 指定慢查询日志文件路径和文件名
slow_query_log_file=/var/log/mysql/slow-query.log
三、事务日志(Transaction Log)
1、重做日志(Redo Log)。
- 记录数据库事务的所有变更,用于保障事务的持久性。即使数据库宕机了也能通过重放重做日志恢复还未写入数据库文件的事务数据。
- 属于物理日志,记录的是数据页的物理修改,而不是具体的数据变更内容。
- 重做日志配置说明。
# 重做日志文件大小 # 默认48M,根据实际情况调整,例如设置为512MB innodb_log_file_size = 512M # 重做日志文件组中的文件数量 # 默认2个,通常情况下保持默认即可 innodb_log_files_in_group = 2 # 重做日志缓冲区大小 # 默认8M,根据更新操作的频率和数据量适当调整 innodb_log_buffer_size = 64M # 控制事务提交时redo log的刷新策略 # 默认1,提供最高的事务安全性,但可能会牺牲一些性能 innodb_flush_log_at_trx_commit = 1
2、回滚日志(Undo Log)。
- 记录数据库事务修改前的版本,用于保障事务的原子性以及支持多版本并发控制(MVCC)。因为记录了多个版本的数据,所以方便事务回滚的时候获取旧版本的数据。
- 属于逻辑日志,记录的是逻辑操作,即数据变更前的状态,而不是物理页的修改。
- Undo Log的具体管理主要由InnoDB内部机制负责,无需像Redo Log那样显式配置文件大小等属性。
总结
今天我们讲了MySQL的三个重要的日志以及各日志的用途。
1、二进制日志(Binary Log / Binlog),主要用途数据备份恢复。
2、慢查询日志(Slow Query Log),主要用途分析性能瓶颈。
3、事务日志(Transaction Log),主要用途保障数据一致性、持久性、原子性。
最后因本人能力有限,写的内容如果有不对的地方还望大家指出来好让我改进,希望大家多多包含,谢谢大家。