【MYSQL】日志结构

在这里插入图片描述

Binlog 是逻辑日记

用于记录数据库执行的写入操作(查询不记录)信息,
Server层记录和引擎层无关,并且是以追加方式进行写入,
可以通过参数 max_binlog_size 设置每个Binlog文件的大小,
文件大小达到设定值时会生成新的文件来保存日记。

binlog的三种模式

statement;

内容:binlog 只会记录可能引起数据变更的 sql 语句
优势:该模式下,因为没有记录实际的数据,所以日志量和 IO 都消耗很低,性能是最优的
劣势:但有些操作并不是确定的,比如 uuid() 函数会随机产生唯一标识,当依赖 binlog 回放时,该操作生成的数据与原数据必然是不同的,此时可能造成无法预料的后果。
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

raw

内容:在该模式下,binlog 会记录每次操作的源数据与修改后的目标数据,StreamSets就要求该模式。
优势:可以绝对精准的还原,从而保证了数据的安全与可靠,并且复制和数据恢复过程可以是并发进行的
劣势:缺点在于 binlog 体积会非常大,同时,对于修改记录多、字段长度大的操作来说,记录时性能消耗会很严重。阅读的时候也需要特殊指令来进行读取数据。

Mixed

内容:是对上述STATEMENT 跟 ROW 两种模式的混合使用。
细节:对于绝大部分操作,都使用 STATEMENT 来进行 binlog 的记录,只有以下操作使用 ROW 来实现:表的存储引擎为 NDB,使用了uuid() 等不确定函数,使用了 insert delay 语句,使用了临时表

主要用在两个场景:主从复制和数据恢复

对于Binlog,MySQL是通过参数sync_binlog参数来控制刷盘时机,取值是0、1和N三种值。0表示由系统自行判断何时调用sync()写入磁盘;1表示每次事务commit都要调用fsync()写入磁盘;N表示每N个事务,才会调用fsync()写入磁盘。

MySQL5.7.7版本之前默认格式是STATEMENT,版本之后默认是ROW,可以通过参数 binlog-format指定。

Undo log是逻辑日记、回滚日记

比如一条修改+3的逻辑语句,Undo log会记录对应一条-3的逻辑日记,一条插入语句则会记录一条删除语句,这样发生错误时,根据执行Undo log就可以回滚到事务之前的数据状态。
Undo log 作用
回滚数据:当程序发生异常错误时等,根据执行Undo log就可以回滚到事务之前的数据状态,保证原子性,要么成功要么失败。
MVCC一致性视图:通过Undo log找到对应的数据版本号,是保证MVCC视图的一致性的必要条件。
在这里插入图片描述

Redo log 是重做日记,属于InnoDB引擎的日记

Redo log 作用

前滚操作:具备crash-safe能力,提供断电重启时解决事务丢失数据问题。
提高性能:先写Redo log记录更新。当等到有空闲线程、内存不足、Redo log满了时 “刷脏”。写Redo log是顺序写入,刷脏是随机写,节省的是随机写磁盘的 IO 消耗(转成顺序写),所以性能得到提升。此技术称为WAL技术:Write-Ahead Logging,它的关键点就是先写日记磁盘,再写数据磁盘。

Redo log 的两阶段提交
更新内存后引擎层写Redo log将状态改成prepare为预提交第一阶段,Server层写Binlog,将状态改成commit为提交第二阶段。两阶段提交可以确保Binlog和Redo log数据一致性。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值