手机版

MySQL之存储引擎(11)

发布时间:2021-06-08   来源:未知    
字号:

无法确定,很有可能是先从磁盘上读一份,然后发送。

4.relaylog使用WAL吗?

Yes。从库接收到日志后,会先写relay log。

5.binlog和relaylog的SQL是否一致?

在网络传输正确性可靠的前提下,yes。

提一个问题:既然binlog不使用WAL,那么在主从场景下,mysql异常之后,主库和从库是否会不一致呢?

之前有个问题一直没弄明白:既然mysql是先做数据操作、再写binlog,如果写binlog的时候失败,mysql又crash,数据怎么办?

答案是由存储引擎决定数据。可以把mysql和它的存储引擎分开看,因为mysql只是一个框架,而不是一个实现。binlog是mysql自己的日志,而事务是由存储引擎本身保证的。 以update为例,mysql做的事情简单分为:

1. 修改数据update。

2. 写binlog。

3. 如果当前处理的表是一个事务性的表,则commit或rollback。

注意此处的update和commit/rollback都由存储引擎实现,mysql只是站在逻辑的高度上理解这些操作。

对于事务型的引擎innodb,它本身有日志保证数据的一致性。在innodb的实现中,update修改数据之前,会新建一个事务,并建立一个回滚点。而在innodb提供的commit/rollback接口会提交/回滚事务。

因此对innodb而言,每条SQL语句的事务,其实包含了binlog的写操作。然而即使是这样,innodb仍然无法保证binlog和数据的一致性,因为innodb在写commit成功后crash,回滚操作不会回滚binlog。按照手册上的说法,把--innodb-support-xa设置为1,同时保证sync_binlog=1,才能保证innodb的binlog和数据一致。

对于非事务型的引擎myisam,没有commit/rollback的机会,因此在异常情况下,数据会和binlog不一致。

一、简介

binlog又叫二进制日志文件,它会将mysql中所有修改数据库数据的Query以二进制的形式记录到日志文件中,如:create,insert,drop,update等;(对于select操作则不会被记录到binlog里,因为它并没有修改数据库的数据)。binlog一般存储在数据目录下,并且命名为:mysql-bin.***(这个可以在配置文件中修改f:log-bin=mysql-bin,就是文件名的前缀;mysqld在每个 binlog 名后面添加一个数字扩展名。每次启动服务器或刷新日志时增加文件的大小大于max_binlog_size,一个事务不会被拆分开)。

MySQL之存储引擎(11).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
×
二维码
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)