成都做网站的公司哪家好,机械公司企业简介模板,门店充值会员卡系统,凡科网注册聊聊BINLOG
binlog记录什么#xff1f;
MySQL server中所有的搜索引擎发生了更新#xff08;DDL和DML#xff09;都会产生binlog日志#xff0c;记录的是语句的原始逻辑
为什么需要binlog#xff1f;
binlog主要有两个应用场景#xff0c;一是数据复制#xff0c;在…聊聊BINLOG
binlog记录什么
MySQL server中所有的搜索引擎发生了更新DDL和DML都会产生binlog日志记录的是语句的原始逻辑
为什么需要binlog
binlog主要有两个应用场景一是数据复制在MySQL主从复制的场景下我们通过master来写binlogslaver
读取master的binlog来完成数据一致性。二是数据恢复通过mysqlbinlog工具来恢复数据通过确定start-position和end-position来执行
binlog的记录格式
statement
设置为statement记录的是语句SQL语句原文同步数据时会执行记录的SQL语句但是有一些语句直接执行会和原语句不同比如UUIDupdate_time now()等所以这种简单的记录形式无法保证数据的一致性我们有row格式
row
row格式记录的是修改的具体数据这样保证了数据库恢复和复制的数据的可靠性但是这种格式需要占用大量的容量来记录并且恢复和同步更消耗IO资源。所以又有了一种折中方案设置为mixed记录的内容是前两者的混合。
mixed
MySQL会判断这条SQL语句是否会引起数据不一致如果是就用row格式否则就用statement格式。
binlog的写入机制
一个事务的binlog不能被拆开无论这个事务多大也要确保一次性写入所以系统会给每个线程分配一块内存作为binlog cache。可以通过binlog_cache_size参数控制单线程binlog_cache大小如果存储内容超过了这个参数就要暂存到磁盘。
binlog的写入时机是事务执行中在执行事务中第一个dml语句时会分配空间binlog cache将日志写到binlog cache事务提交的时候再把binlog cache写到binlog文件中同时释放binlog cache write是指将日志写入到系统的page cache
fsync是将日志刷新到binlog日志文件中完成持久化
write和fsync的时机可以由参数sync_binlog控制可以配置成0、1、N(N1)。
设置成0时表示每次提交事务都只会write由系统自行判断什么时候执行fsync。设置成1时表示每次提交事务都会执行fsync就和redo log日志刷盘流程一样。设置成N时表示每次提交事务都会write但是积累N个事务后才fsync。
什么是两阶段提交
在执行更新语句时会记录到redo log和binlog两块日志以基本事务为单位redo log在事务的执行过程中能够不断写入binlog只能在事务提交的时候写入 为了解决两份日志之间逻辑一致问题innodb存储引擎采用了两阶段提交方案将redo log写入拆成了prepare和commit两个阶段这就是两阶段提交 使用两阶段提交后写入binlog发生异常也没有影响因为MySQL根据redo log恢复数据时发现redo log还处于prepare阶段没有对应的binlog日志则回滚事务 binlog和redo log的区别
binlog是逻辑日志记录的是原始语句属于MySQL server层所有存储引擎有更新操作都会记录redo log是物理日志记录的是在某个数据页上做的修改属于innodb存储引擎层
虽然它们都是持久化的保证但侧重点有所不同
redo log使innodb有了崩溃后恢复的能力
binlog保证了集群架构下数据一致性