二进制安全与MySQL的关系_<<MySQL的1000个疑问>> 系列二:你的MySQL 二进制文件安全吗?...

二进制文件是什么

二进制文件就是类似于mysql-bin.000001,mysql-bin.000002这样的文件。在my.cnf配置log-bin指定二进制文件位置与名称及开启二进制文件。

二进制文件的作用

我想大家都知道二进制文件的好处,主从数据同步,数据恢复都需要用到二进制文件。开启它会对性能一定影响,官网给的数据是影响1%,不过考虑到主从结构以及非常重要的数据恢复,这点影响完全有必要承受。

二进制文件的工作方式

我这里不对日志内部结构做说明,因为这涉及到日志格式。这里我只说明它的基本工作思路。也就是数据是怎么写到日志里面去的。

首先,MySQL会针对每一个事务,向二进制文件写入这条SQL。从库就可以利用这条SQL,在从库上执行来达到与主库数据同步的效果。在事务还没有提交commit之前,这条SQL会先被写入到二进制缓存里,就是binlog-cache.其大小由binlog_cache_size参数设置。在事务提交之后,再把二进制缓存里的数据写到二进制文件中。大体的工作方式就是这样。

二进制文件的危害

但问题来了,把二进制缓存里的数据写到二进制文件中,因为操作系统有Buffer的原因,其实这时数据并没有真正落地,也就是没有真正写入到日志中。如果这个时候断电,数据就会丢失。那么这种情况就会造成,数据库的数据与二进制文件里的数据无法对应,到时候从库通过执行二进制文件中的SQL就会与主库数据不同步。那么有没有解决办法?有,有个参数sync_binlog.这个参数表示,当执行多少条事务之后,将操作系统中的缓冲写刷新到磁盘。一般将值设为0,或者1。

sync_binlog = 0,完全由操作系统来负责将Buffer刷新到磁盘。

sync_binlog = 1,每次事务提交后就同步到磁盘。这种方式最安全,保证事务不会丢失。

这样做就能保证绝对安全吗?

NO。上文我提到Innodb的日志缓冲。将innodb_log_at_trx_commit=1,每次事务提交就将日志缓冲的数据刷新到日志文件中。那么现在,我们就至少知道,在事务提交后,需要做两个操作,一个是将二进制文件缓存刷新到磁盘上的二进制文件,另一个就是日志缓冲。那么有没有可能出现,这两个操作一个被执行了,而另一个没有被执行的情况呢?有,肯定有。如果二进制文件缓存刷写成功之后,突然MySQL进程崩溃,事务日志缓冲没有被刷写到磁盘上的日志文件,那么下次重启后,因为二进制文件存在最后一条SQL,而由于日志缓冲丢失,数据库中数据并没有被修改,那么就造成数据不一致。那有没有解决办法?有,肯定有。让这两个操作处于一个事务里面,要么同时成功,要么都失败。这样一来,问题就解决了。 MySQL提供了这个参数设置innodb_support_xa。将innodb_support_xa=1,就能保证这两个操作处在一个事务里。问题也就解决了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值