【MySQL】MySQL5.6新特性之crash-safe

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 一 介绍  MySQL 5.6 针对复制功能提供了新特性: slave支持crash-safe. 该功能可以解决之前版本中系统异常断电可能导致的SQL thread 信息不准确的问题。
一 介绍
  MySQL 5.6 针对复制功能提供了新特性: slave支持crash-safe. 该功能可以解决之前版本中系统异常断电可能导致的SQL thread 信息不准确的问题。本文从原理方面对该特性进行介绍。
二 原理
  在了解crash-safe slave 之前,我们先分析一下MySQL 5.6 之前的版本出现 crash-unsafe 的原因。在slave上,复制包含两个线程:即replication中的IO thread和SQL thread。
IO thread负责从master拷贝binlog文件并保存到本地,拷贝过来的binlog称为relay-log. 
SQL thread负责执行relay-log.
两个线程的执行进度(偏移量)都保存在文件中.IO thread的执行状态信息保存在master.info文件,SQL thread的执行状态信息保存在relay-log.info文件。系统运行正常的情况下,这种模式到目前为止还没有问题。 需要注意的是这些文件被修改后不是同步写入磁盘的,每当系统发生crash,存储的偏移量可能都不准确.MySQL 5.5通过两个参数修复了该问题,使用sync_master_info=1和sync_replay_log_info=1 来保证Slave 的两个线程每次写一个事务就分别向两个文件同步一次 IO thread和SQL thread当前执行的信息。当然同步操作不是免费的,频繁更新磁盘文件需要消耗性能,如果你的RAID设备的IO策略设置为WRITEBACK 模式,那么这种方法便可以接受的。
 但是,即使设置了sync_master_info=1和sync_relay_info=1, 问题还是会出现,因为复制信息是在transactions提交后写入的,如果crash发生在事务提交和OS写文件之间,那么relay-log.info就可能是错误的。当slave从新启动的时候,最后那个事务可能会被执行两次.具体的影响取决于事务的具体操作.复制可能会继续运行比如update/delete,或者报错 比如insert操作,此时主从数据的一致性可能会被破坏。
 MySQL 5.6版本通过将复制信息存放到表中来解决此问题.通过配置两个参数 relay_log_info_repository=TABLE,master_info_repository=TABLE,relay log info 会存放到 mysql.slave_relay_log_info表中,master info 会存放mysql.slave_master_info表中。就是把SQL线程执行事务和更新mysql.slave_replay_log_info的语句看成一个事务处理,这样就会一直同步的.
我们可以通过伪代码来了解crash-safe 的原理
crash-unsafe情况下 SQL_thread 的 的工作模式
  1. START TRANSACTION;
  2.  Statement 1
  3.   ...
  4.  Statement N
  5.  COMMIT;
  6. Update replication info files
crash-safe情况下 SQL_thread 的 的工作模式
  1. START TRANSACTION;
  2.   Statement 1
  3.   ...
  4.   Statement N
  5.   Update replication info
  6. COMMIT
crash-safe就是将relay-info.log的信息保存在InnoDB的事务表中,这时执行relay log中的事务和写relay info在一个事务中,就能得到原子性保证。从而避免已执行的binlog位点和写入relay log info 的位点信息不一致的情况发生。看到这里也请各位读者思考一下 ,现在的这种方案是否完美,有哪些问题?
 从上面的改变解决了SQL thread记录执行状态可能导致不一致的风险,但是对于IO thread 依然存在问题 。IO thread 从master上拷贝binlog写入 relay log中,每个二进制日志由多个log event组成,所以每接收到一个log event就需要更新master-info.log而且该是写入操作系统缓存。从IO thread的工作原理来看,它没有办法 将写入master info和拉取binlog放到同一个事务中而保持原子操作,因此IO thread 的行为是会对数据一致性会产生影响,设想一个log event传送到了relay log中两次的情形。 如何解决呢?
 方案一 通过参数sync_master_info可以控制fdatasync的时间。默认值是10000,表示IO线程的偏移量每10000个事务更新一次 ,通过设置其为1,每写一次事务便同步到master.info 。
 方案二 通过MySQL 5.5版本开始提供的参数relay_log_recovery ,当slave发生crash后重启之后重连master时,slave不根据master-info.log的信息进行重连,而是根据relay-info中执行到master的位置信息重新开始拉master上的日志数据。


三 如何使用 
  1 停止slave的mysql实例
  2 my.cnf文件中添加
     master-info-repository=TABLE
     relay-log-info-repository=TABLE
     relay-log-recovery
  3 重启slave的mysql实例
注意:
如果是MySQL 5.6.5 或者更早期。slave_master_info 和 slave_relay_log_info 表默认使用MyISAM 引擎。所以还得修改成innodb,如下:        
  1. ALTER TABLE mysql.slave_master_info ENGINE=InnoDB;
  2. ALTER TABLE mysql.slave_relay_log_info ENGINE=InnoDB
四 小结 
   MySQL 5.6 版本为MySQL的稳定性做出了很多改进,这点值得MySQL DBA 去关注,也值得大家去思考,这些改善点还有那些不足之处?有如何解决?

五 参考文章
 1  MySQL 5.6 Manual --slave logs  
 2  MySQL crash-safe replication  
 3  Enabling crash-safe slaves with MySQL 5.6 
 4  MySQL5.6 crash-safe replication一个坑
 5  Crash-safe Replication --推荐
 6  Better Crash-safe replication for MySQL

如果您觉得从这篇文章受益,可以赞助  北在南方  一瓶饮料 ^_^

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
关系型数据库 MySQL
MySQL 的 crash-safe 原理解析
MySQL作为当下最流行的开源关系型数据库,有一个很关键和基本的能力,就是必须能够保证数据不会丢。那么在这个能力背后,MySQL是如何设计才能保证不管在什么时间奔溃,恢复后都能保证数据不会丢呢?有哪些关键技术支撑了这个能力?本文将为我们一一揭晓。
1059 0
|
关系型数据库 MySQL 存储
MySQL 5.6的crash-safe slaves新特性
     5.6之前的mysql版本。master info log和relay log info log,都是存储在文件master.info和relay-log.info中。但这个对于服务器掉电的问题,是不能保证relay log info 一致性,为了保证这个crash-safe。
1020 0
|
存储 关系型数据库 MySQL
[转载]MySQL crash-safe replication
MySQL crash-safe replication September 5, 2013May 13, 2014 姜 承尧   InnoDB, MySQL, Replication MySQL数据库的成功离不开其replicaiton,相对于Oracle DG和Microsoft SQL Server Log Shipping来说,其简单易上手,基本上1,2分钟内根据手册就能完成环境的搭建。
943 0
|
12天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
39 3
|
12天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
42 3
|
12天前
|
SQL 关系型数据库 MySQL
数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog
《数据库灾难应对:MySQL误删除数据的救赎之道,技巧get起来!之binlog》介绍了如何利用MySQL的二进制日志(Binlog)恢复误删除的数据。主要内容包括: 1. **启用二进制日志**:在`my.cnf`中配置`log-bin`并重启MySQL服务。 2. **查看二进制日志文件**:使用`SHOW VARIABLES LIKE 'log_%';`和`SHOW MASTER STATUS;`命令获取当前日志文件及位置。 3. **创建数据备份**:确保在恢复前已有备份,以防意外。 4. **导出二进制日志为SQL语句**:使用`mysqlbinlog`
54 2
|
25天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
177 15
|
19天前
|
SQL 关系型数据库 MySQL
数据库数据恢复—Mysql数据库表记录丢失的数据恢复方案
Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表中无任何数据或只有部分数据。 2、客户端无法查询到完整的信息。
|
26天前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。
|
30天前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。