MySQL中的redo log、undo log和bin log是三种重要的日志,它们在数据库事务处理、数据持久性和复制等场景中发挥着关键作用。
1. Redo Log(重做日志)
-
- 作用:Redo log用来保证事务的持久性。当数据库发生故障时,可以使用redo log来恢复数据到最后一次提交的状态。它记录了数据页的物理修改,即事务对数据页所做的更改。
-
- 何时生成:在事务执行过程中,每当有数据页被修改时,对应的redo log就会被生成,并存储在内存中的redo log buffer里。
-
- 参数变量: -
innodb_log_buffer_size
:控制redo log buffer的大小。 -innodb_flush_log_at_trx_commit
:控制事务提交时redo log的刷盘行为,可以设置为0、1或2。 -innodb_log_file_size
:定义单个redo log文件的大小
- 参数变量: -
2. Undo Log(回滚日志)
-
- 作用:Undo log用于事务的原子性和MVCC(多版本并发控制)。如果事务需要回滚或数据库崩溃,undo log可以用于恢复原始数据。同时,它支持在读取操作中提供数据的旧版本,使得在高并发环境下,不同的事务可以看到数据的不同版本。
-
- 何时生成:在事务开始时创建,事务的每个修改操作都会生成undo log。
-
- 参数变量: - 没有特定的参数直接控制undo log的大小,但它受
innodb_buffer_pool_size
的影响,因为undo log存储在buffer pool中。
- 参数变量: - 没有特定的参数直接控制undo log的大小,但它受
3. Binlog(二进制日志)
-
- 作用:Binlog是MySQL服务器层的日志,用于记录所有数据库表结构变更和数据修改的日志(不包括SELECT和SHOW这类操作)。它主要用于数据的复制和恢复。
-
- 何时生成:在事务提交时生成,记录了该事务期间所有修改数据的操作。
-
- 参数变量: -
expire_logs_days
:设置binlog文件的过期天数。 -max_binlog_size
:定义单个binlog文件的最大大小。 -sync_binlog
:控制每次事务写入binlog后是否进行fsync同步到磁盘。
- 参数变量: -
4.总结
这些日志共同工作,确保了MySQL数据库的稳定性和数据的一致性。Redo log和undo log是InnoDB存储引擎特有的日志,而binlog则是MySQL服务器层的日志,它们之间的区别主要在于作用、生成时机和适用对象。
5.完整的流程
1. 开始事务
- 描述:这是数据库事务的起点,标志着一系列操作的开始,这些操作将作为一个整体被执行。
2. 生成Undo Log
- 描述:在事务开始时创建,用于记录事务对数据的每个修改操作的反向操作。如果事务需要回滚或数据库需要恢复到某个一致的状态,Undo Log将被用来撤销已经进行的修改。
3. 事务修改数据
- 描述:在事务中,数据被修改。这可能包括插入、更新或删除操作。
4. 生成Redo Log
- 描述:每当事务修改数据时,相应的Redo Log会被生成。Redo Log记录了数据页的物理修改,确保在发生故障时可以从日志中重放操作,恢复到最后一次提交的状态。
5. 事务提交
- 描述:当事务中的所有操作成功完成,并且用户或应用程序发出提交指令时,事务将被标记为提交。这通常意味着所有更改都将被永久保存到数据库中。
6. 刷写Redo Log到磁盘
- 描述:在事务提交时,为了保证持久性,Redo Log从内存中的Redo Log Buffer刷写到磁盘上的日志文件中。这个过程确保了即使在数据库服务器崩溃的情况下,修改也能被恢复。
7. 生成Bin Log
- 描述:在事务提交时生成,Bin Log记录了该事务期间所有修改数据的操作。它是MySQL复制和数据恢复的关键组成部分,因为它提供了一种机制来复制和恢复在主服务器上执行的操作。
8. 事务完成
- 描述:一旦Redo Log被刷写到磁盘,并且Bin Log被生成,事务就被认为是完整且持久化的。此时,事务的所有操作都已经被安全地保存,并且可以被系统其他部分访问。
Redo Log 参数变量
- innodb_log_buffer_size:控制Redo Log Buffer的大小,这个缓冲区用于在将日志写入磁盘之前存储Redo Log。
- innodb_flush_log_at_trx_commit:控制事务提交时Redo Log的刷盘行为。可以设置为0(不刷盘)、1(每次事务提交都刷盘)或2(每秒刷盘一次)。
- innodb_log_file_size:定义单个Redo Log文件的大小,影响Redo Log文件的总量和刷盘操作的频率。
Undo Log 参数变量
- innodb_buffer_pool_size:虽然Undo Log的大小没有直接的参数控制,但它存储在Buffer Pool中,因此这个参数影响Undo Log的存储和性能。
Bin Log 参数变量
- expire_logs_days:设置Binlog文件的过期天数,之后这些文件将被自动删除。
- max_binlog_size:定义单个Binlog文件的最大大小,达到这个大小时,Binlog将被旋转。
- sync_binlog:控制每次事务写入Binlog后是否进行fsync同步到磁盘,以确保数据的持久性。
这些步骤和参数共同确保了MySQL数据库的稳定性和数据的一致性,无论是在正常操作还是在系统故障后。