摘要
REDO LOG 称为 重做日志 ,提供再写入操作,恢复提交事务修改的页操作,用来保证事务的持久性。 UNDO LOG 称为 回滚日志 ,回滚行记录到某个特定版本,用来保证事务的原子性、一致性。 BIN LOG称为 二进制日志,mysql集群数据同步以及数据恢复功能。
REDO LOG(重做日志)
事务包含 持久性 的特性,就是说对于一个已经提交的事务,在事务提交后即使系统发生了崩溃,这个事务对数据库中所做的更改也不能丢失。
解决的思路(采用REDO LOG日志) :我们对每次修改操作都记录到REDO LOG中 比如,某个事务将系统表空间中 第10号 页面中偏移量为 100 处的那个字节的值 1 改成 2 。我们只需要记录一下:将第0号表空间的10号页面的偏移量为100处的值更新为 2 。
有了REDO LOG日志即使后来系统崩溃(事务提交但是没来得及持久化数据),在重启后执行REDO LOG日志的操作就可以恢复数据。
redo log的刷盘策略
redo log的写入并不是直接写入磁盘的,InnoDB引擎会在写redo log的时候先写redo log buffer(缓存),之后以 一定的频率 刷入到真正的redo log file 中。
这里的一定频率怎么看待呢?这就是我们要说的刷盘策略。
注意,redo log buffer刷盘到redo log file的过程并不是真正的刷到磁盘中去,只是刷入到 文件系统缓存(page cache)中去(这是现代操作系统为了提高文件写入效率做的一个优化),真正的写入会交给系统自己来决定(比如page cache足够大了)。那么对于InnoDB来说就存在一个问题,如果交给系统来同步,同样如果系统宕机,那么数据也丢失了(虽然整个系统宕机的概率还是比较小的)。 针对这种情况,InnoDB给出 innodb_flush_log_at_trx_commit 参数,该参数控制 commit提交事务时,如何将 redo log buffer 中的日志刷新到 redo log file 中。 它支持三种策略:
innodb_flush_log_at_trx_commit | 说明 |
---|
0 | 表示每次事务提交时不进行刷盘操作。(系统默认master thread每隔1s进行一次重做日志的同步) | 1 | 表示每次事务提交时都将进行同步,刷盘操作( 默认值 ) | 2 | 表示每次事务提交时都只把 redo log buffer 内容写入 page cache,不进行同步。由os自己决定什么时候同步到磁盘文件。 |
效率上的话就是0>2>1 安全就是1>2>0 不管哪种策略系统默认master thread每隔1s进行一次重做日志的同步
undo log(回滚日志 )
作用1:回滚数据(就是事务回滚操作会执行undo log日志恢复到事务开始前) 作用2:MVCC(记录多版本数据-解决事务的隔离性) 在InnoDB存储引擎中,undo log分为: insert undo log update undo log undo log的删除 1.针对于insert undo log 因为insert操作的记录,只对事务本身可见,对其他事务不可见。故该undo log可以在事务提交后直接删除,不需要进行purge操作。 2.针对于update undo log 该undo log可能需要提供MVCC机制,因此不能在事务提交时就进行删除。提交时放入undo log链表,等待purge线程进行最后的删除。
binlog(二进制日志)
binlog即binary log,二进制日志文件,也叫作变更日志(update log)。它记录了数据库所有执行的DDL 和 DML 等数据库更新事件的语句,但是不包含没有修改任何数据的语句(如数据查询语句select、show等)。 binlog主要应用场景: 一是用于 数据恢复 二是用于 数据复制(集群数据同步作用)
刷盘策略
参数 sync_binlog 控制
sync_binlog | 说明 |
---|
0 | 为0的时候,表示每次提交事务都只write,由系统自行判断什么时候执行fsync。虽然性能得到提升,但是机器宕机,page cache里面的binglog 会丢失(默认值) | 1 | 表示每次提交事务都会执行fsync,安全性最高 | n>1 | 表示每次提交事务都write,但累积N个事务后才fsync。 |
只有提交事务才会涉及到刷盘。
binlog与redolog对比
binlog | redolog |
---|
redo log 它是 物理日志 ,记录内容是“在某个数据页上做了什么修改”,属于 InnoDB 存储引擎层产生的。 | binlog 是 逻辑日志 ,记录内容是语句的原始逻辑,类似于“给 ID=2 这一行的 c 字段加 1”,属于MySQL Server 层。 | redo log在事务执行过程中可以不断写入 | binlog只有在提交事务时才写入 | binlog 所用存储引擎都有 | redo log是innodb特有的 |
两阶段提交
在执行更新语句过程,会记录redo log与binlog两块日志,以基本的事务为单位,redo log在事务执行过程中可以不断写入,而binlog只有在提交事务时才写入,所以redo log与binlog的 写入时机 不一样。 redo log与binlog两份日志不一样,会导致主和从数据不一致如下图: redo log写入了但是binlog没有写入 主机采用redo log恢复数据 从机采用binlog做数据恢复 redo log与binlog两份日志不一样,要引入两阶段提交
|