mysql数据库日志

img

记录顺序undolog -> redolog -> binlog

redo log

策略:WAL Write Ahead Log
所属层次:存储引擎
存储形式:物理日志,记录对磁盘中每一个数据页的修改
概念:
有Redo log Buffer和Redo log,
mysql为了提高性能不直接将数据写入磁盘,而是通过buffer pool,后台线程定期刷新到磁盘数据页,
redo log buffer则是顺序io写入redo log;
写入:
Innodb引擎(独有)进行事务提交时(一个事务会有多条不连续的日志),先写到redo log file持久化,最后刷到磁盘。
读取:
数据库宕机重启后通过该log可以完成数据恢复
总结:
实现了事务的持久性;

undo log

策略:WAL Write Ahead Log
所属层次:存储引擎
存储形式:逻辑日志
写入:
事务开启前会将当前事务版本生成undolog;
总结:
用于实现回滚,从而实现事务原子性;
也用来做数据多版本MVVC下的读,也就是非锁定读;

bin log

策略:WAL Write Ahead Log
所属层次:mysql server
存储形式:逻辑日志
模式
statement:省磁盘空间和io次数;但对上下文有要求,容易造成复制问题;
row:与statement相反;
mixed:根据具体sql来选择是statement还是row模式
写入:
事务提交后一次性写入,与存储引擎无关,任何数据更改都会产生binlog;
总结:
用于实现主从一致性,还可以用来进行数据恢复;

事务提交时先写binlog还是redolog?

内部实现了xa规范的两阶段事务2pc
一阶段记录完整的redolog(没有commit标签)
二阶段记录binlog后再记录redolog的commit标签
恢复时会查看没有commit标签的redolog(也就是prepare状态的数据),去找对应binlog,若能找到则提交,否则回滚事务。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注