今天研究MySQL主从同步的同事问了一个问题,如果InnoDB写完ib_logfile后,服务异常关闭。会不会由于主库能够根据ib_logfile恢复数据,而由于bin-log没写导致从库同步时少了这个事务?或者反之,bin-log写成功,而ib_logfile没有写完,导致从库执行事务,而主库不执行? 这会导致主从不一致。
本文简要说明下这个问题。
1、 写入流程
源码sql/handler.cc:
ha_commit_trans
{
…
if ((err= ht->prepare(ht, thd, all)))
…
tc_log->log_xid(thd, xid)
…
error=ha_commit_one_phase(thd, all)
…
}
|
说明:
实际上ib_logfile的两步写策略避免了上述的两个问题。流程大致如下:
a) [ib_logfile] 写入当前事务的更新数据,并标志为事务准备(trx_prepare).
b) 写入bin-log。
c) [ib_logfile] 当前事务提交结束(trx_commit)
2、 恢复流程
实际上,若ib_logfile已经写入trx_prepare,则在恢复过程中,会根据bin-log中该事务是否存在来恢复数据(见函数xarecover_handlerton)。
流程如下(sql/handler.cc)
xarecover_handlerton
{
sql_print_information("Found %d prepared transaction(s) in %s", got, ha_resolve_storage_engine_name(hton));
foreach (trx)
{
If (found in bin-log)
{
sql_print_information("commit xid %s", xid_to_str(buf, info->list+i));
hton->commit_by_xid(hton, info->list+i);
}
Else
{
sql_print_information("rollback xid %s",xid_to_str(buf, info->list+i));
hton->rollback_by_xid(hton, info->list+i);
}
}
}
|
说明:从启动日志中能够看到上述代码输出的日志。
☆ 假设在阶段a)结束之后程序异常, 此时没有写入bin-log。 则从库不会同步这个事务。 主库上,在重启之后,从恢复日志中这个事务没有trx_commit,因此会被回滚。 逻辑上主从库都不会执行这个事务。
☆ 假设在阶段b)结束后程序异常,此时bin-log已经写入,则从库会同步这个事务。 主库上,根据恢复日志和bin-log,也能够正常恢复此事务。
也就是说,若bin-log写入完成,则主从库都会正常完成事务;bin-log没有写入,则主从库都回滚事务。不会出现主从不一致的问题。
3、 操作系统崩溃造成的不一致
上述的流程并不是天衣无缝的。ib_logfile的写盘是能够被设置成非实时flush的。假设在bin-log写入完成后,系统崩溃,则可能出现这样的情况:bin-log写入所以从库能够执行事务。但主库中trx_prepare的日志没有被写入到ib_logifle中,导致主库不执行事务。这样就会出现主从不一致的情况。
解决方案:增加启动检测,将ib_logfile中不存在的事务,从bin-log删除掉。这样主从库都不执行此事务。
分享到:
相关推荐
InnoDB: Error: log file ./ib_logfile0 is of different size 0 5242880 bytes 现在需要做的事情就是把原来的 innodb 的ib_logfile×备份到一个目录下,然后删除掉原来的文件,重启 mysql。 你会看到ib_logfile*...
身份识别系统演示(用于纸张) 运行当前可用的客户端:ganache,geth v1.7.3之前,请确保已安装python3和MySQL,并且以太坊已打开。python版本:3.5 brew安装python3.5(或python3)以太坊:盖纳什-克里,盖斯npm ...
分析从库1062问题,解析从库binlog日志,报错如下[root@xxxdb0402 tmp]# mysqlbinlog mysql-bin.004271 > 4.logERROR: Error in Log_event::read_log_event(): ‘read error’, data_len: 438, event_type: 2[root@...
mysql 有关“InnoDB Error ib_logfile0 of different size”错误的解决方法,需要的朋友可以参考下。
LNH_MySQL 06-企业场景MySQL主从复制最牛部署方案.mp4
Your MySQL connection id is 4 to server version: 3.23.25-beta-log Type help or \h for help. Type \c to clear the buffer mysql> 然后发布查询,直接键入题目中的语句: mysql> SELECT User,Host FROM...
Mysql2QueryFilter::Plugin::CasualLog 为的错误查询着色的。 它是移植。 见 安装 将此行添加到应用程序的 Gemfile 中: gem 'mysql2_query_filter-plugin-casual_log' 然后执行: $ bundle 或者自己安装: ...
docker-compose搭建mysql主从环境.md
关于博客: https://blog.csdn.net/qq_42413011/article/details/126914080 的搭建脚本
Mysql主从同步备份策略 五月 18th, 2009 at 17:30 - 3,803 views 环境: 主从服务器上的MySQL数据库版本同为5.1.34 主机IP:192.168.0.1 从机IP:192.168.0.2 一. MySQL主服务器配置 1.编辑配置文件/etc/my.cnf # ...
支持从裸磁盘、分区、文件中搜索所有IBD page碎片。 1、输入字母a-z :搜索对应的逻辑分区A-Z。此模式请以管理员身份运行。 2、输入数字1-9 :搜索...page.bin、frm.bin、search.log 压缩后发送到 568229095@qq.com
Linux运维-运维课程d6-MySQL主从复制架构-06-MySQL主从复制核心思路.mp4
如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致slave mysql容器配置配置Dockerfile设置server_id,一般设置为
Linux运维-运维课程d6-MySQL主从复制架构-08-MySQL主从复制之SLAVE从服务器软件的
mysql-replication mysql数据库主从复制步骤
代码如下:ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_...
LNH_MySQL 11-忽略MySQL主从复制主库授权表同步实战.mp4
数据库安装文件名(需要放在files目录)mysql_tar: mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz socket连接信息 socket: /tmp/mysql.sock 主库地址 master_ip: 192.168.252.212 从库地址 slave_ip: 192.168.252.213...