Mysql初探:三大日志概述
一、redo log1.概述redo log又叫重做日志,提供的是数据丢失后的前滚操作。 redo log是innodb引擎独有的日志,使用了 WAL 技术(Write-Ahead Logging),也就是预写日志。它的关键点就是先写日志,再写磁盘。对应到Mysql中具体操作,就是每次更新操作,先写日志,然后更新内存数据,最后等系统压力小的时候再进行IO更新磁盘数据。避免了每一次更新都需要进行IO操作。redo log 是保证了事务持久性的关键。 redo log 一般用在数据库恢复的情况:
另外,redo log与undo log都被叫做事务日志。 2.组成首先 redo log 包括两部分:
由于有时候一次事务可能有多次更新,比如:
这个事务要往两个表中插入记录,插入数据的过程中,生成的日志都得先保存起来,但又不能在还没 commit 的时候就直接写到 redo log 文件里。所以就有了 log buffer 这么一块内存,用来先存 redo 日志的。记录了一部分后,根据一定的条件,再最后写入磁盘上的日志文件 log file。 3.日志刷盘策略由于log buffer处于用户工作空间的内存中,要写入磁盘上的日志文件log file还需要经过操作系统内核空间的os buffer。因此需要调用操作系统的fsync()来完成这一过程。 我们可以简单的理解为os buffer到log files这一过程——也就是日志从内存刷入磁盘的过程——为刷盘。每次事务的提交必然会产生log buffer,但是刷入磁盘的动作却不一定与事务提交同步进行。 InnoDB 有个关键的参数 innodb_flush_log_at_trx_commit 控制 Redo Log 的刷盘策略,该参数有三个取值:
4.写入策略redo log是一个物理日志,我们知道数据库引擎加载是按“页”来的,redo log记录的就是每个“页”上的数据发生的变化。但是不像 binlog 那样,redo log 不记录 sql,而是以类似 session_id + date + file_id + block_id + 修改数据这样的格式去记录数据。 redo log的日志文件大小是根据配置固定的,如果有一组有四个文件,每个文件的大小是 1GB,那么总共就只能记录4GB的日志。 因为redo log是前滚日志,也就是说一旦事务成功提交且数据持久化落盘之后,此时日志中的对应事务数据记录就失去了意义。所以redo log类似一个环形链表,从前往后写,到底了就删除最前面的再回到开头往后写。 有了 redo log,InnoDB 就可以保证即使数据库发生异常重启,之前提交的并且在日志中有记录都数据可以找回,这个能力称为crash-safe。 二、undo logundo log又叫回滚日志。事务未提交之前,undo log保存了未提交之前的版本数据,可作为数据旧版本快照供其他并发事务进行快照读。 因此,他能够提供两个功能:
undo log保证了事务的原子性。 三、binlogbinlog 又叫二进制日志。是 Server 层特有的日志,无论哪个引擎都能使用。 它被用于记录 mysql 的数据更新(即使更新零条或者删除零条也会记录)。 binlog有三种工作模式:
四、redo log 和 binlog
五、两阶段提交1.概述当innodb执行修改时,会经历一个两阶段提交的过程:
那么如果事务提交过程中出现了异常,数据库崩溃了,就会有以下几种情况:
2.为什么需要两阶段提交我们举个反例,说明一下他的必要性。假设我们要更新某条数据的A字段由0变为2:
之所以这样做,归根结底是为了保证数据库事务的一致性: 因为不管是从库或者备份库都需要通过读取 binlog 来同步数据,所以为了保证保证和主库数据一致,binlog 里记录的每一条事务就必须是已经提交了的,也就是一定要保证往 binlog 里写入数据以后事务不能回滚。 总结
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |