mysql数据丢失_图解MySQL | 「原理解析」 MySQL使用固定的server_id导致数据丢失
原创作者:爱可生开源社区
本文我们来看一个场景,两台MySQL实例使用主从复制,当master故障,触发高可用切换,新master上线后,通过备份重建旧master并建立复制后,数据发生丢失。
以下我们通过图解还原一遍当时的场景:
注:图中标注的id指的是MySQL的server_id
server_id配置:
- 默认值1或0
- 需要配置时通过参数server-id指定
背景:
- 当配置MySQL复制时,server_id是必填项,用来区分复制拓扑中的各个实例,例如在循环的级联复制中(A=>B=>C=>A),避免重复数据不必要的复制(C=>A数据重复,不必要)
- 当slave的io线程发现binlog中的server_id与自身一样时,默认不会将该binlog写入自身的relay log中,即跳过了该数据的复制,同时也能减少写relay log对磁盘的压力
- 然而这种机制在高可用切换场景下会引入潜在的隐患:
- 隐患一:
- 如上图所示,从备份恢复的旧master仍沿用了原来的server_id A,导致io线程跳过了A:2事务,最终丢失了A:2的数据
- 隐患二:
- 级联复制中,当不相邻实例的server_id相同时,也会出现复制数据丢失
- 上述两种隐患的存在都是因为在复制拓扑中非直接相连的MySQL server_id重复。在普通的一对主从复制中,slave的io线程会检查与自己相连的master的server_id是否与自身重复,若发现重复会停止复制抛出错误
- 注:可通过配置--replicate-same-server-id改变以上默认行为
使用建议:
- 配置MySQL复制时,为每个实例配置不同的server_id
- 通过备份工具还原实例后,为实例配置一个新的server_id
附加题:
除了server_id,MySQL5.6起引入了server_uuid
server_uuid配置:
当MySQL启动时
- 尝试从 data_dir/auto.cnf中读取 uuid
- 如果1尝试失败,则生成一个新的uuid并写入data_dir/auto.cnf
背景:
- 主从复制中,要求master和slave的server_uuid不同,否则在复制初始化时会出现报错
- GTID就是使用了server_uuid做为全局唯一的标识
使用建议:
- 如果直接拷贝master的数据文件来建立slave,注意要删除auto.cnf,重启使MySQL重新生成一个新的server_uuid,否则复制将会异常
本文参考:
https://dev.mysql.com/doc/refman/8.0/en/replication-options-slave.html
mysql数据丢失_图解MySQL | 「原理解析」 MySQL使用固定的server_id导致数据丢失相关推荐
- mysql新增列并同时增加数据_图解MySQL | 「原理解析」 MySQL 为表添加列 是怎么立刻完成的...
原创作者:图解MySQL 在上一期图解 图解MySQL | MySQL DDL为什么成本高?中,我们介绍了: 传统情况下,为表添加列需要对表进行重建 腾讯团队为 MySQL 引入了 Instant A ...
- mysql 查看server id_图解MySQL | [原理解析] MySQL使用固定的server_id导致数据丢失
原创作者:黄炎 王悦 周海鸣 本文我们来看一个场景,两台MySQL实例使用主从复制,当master故障,触发高可用切换,新master上线后,通过备份重建旧master并建立复制后,数据发生丢失. 以 ...
- MySQL百一题库_「灵魂拷问」MySQL面试高频一百问(工程师方向)
前言 每当我们在生产环境服务器上执行rm命令时,总是提心吊胆的,因为一不小心执行了误删,然后就要准备跑路了,毕竟人不是机器,更何况机器也有bug,呵呵. 那么如果真的删除了不该删除的文件,比如数据库. ...
- promise用法_图解 Promise 实现原理(四):Promise 静态方法实现
作者:Morrain 转发链接:https://mp.weixin.qq.com/s/Lp_5BXdpm7G29Z7zT_S-bQ 前言 Promise 是异步编程的一种解决方案,它由社区最早提出和实 ...
- 0配置EF连接MySql数据库_第八节:EF Core连接MySql数据库
一. 前提 1.安装EF Core连接MySQL的驱动,这里有两类: (1).Oracle官方出品:MySql.Data.EntityFrameworkCore (版本:8.0.17) (2).其他第 ...
- mac mysql使用_在Mac中安装和使用MySQL
下载安装MySQL 在官网下载MySQL 进入官网后可以看到有多个版本可选: Oracle MySQL Cloud Service 基于企业版数据库的云服务 MySQL Enterprise Edit ...
- react 判断地址是否有效_继续,react-redux原理解析
本文原文链接 在之前的一篇文章中已讲过redux 原理解析,我将redux返回的store对象挂载在window中,不是太懂的同学可以看看之前的redux 原理解析. const reducer = ...
- cmd如何刷新MySQL数据库_怎样在cmd中用命令操作MySQL数据库 需要技巧
用命令来操作MySQL是工作必备的,今天我就来分享一下cmd命令操作MySQL数据库的方法,希望有帮助. 工具/材料 电脑 xampp 操作方法 01 首先,启动MySQL服务才行哦.这里我是用xam ...
- 网页服务器和mysql服务器_实现Web服务器之间使用同一个MYSQL和相同的网页配置文件的方法...
实现Web服务器之间使用同一个MYSQL和相同的网页配置文件的方法 发布时间:2020-04-15 16:42:41 来源:亿速云 阅读:133 作者:三月 栏目:数据库 亿速云负载均衡(Cloud ...
最新文章
- 编写高性能Java代码的最佳实践
- 为什么edge AI是一个无需大脑的人
- mysql包含哪几部分_sql语言包含哪些部分
- openfoam安装中出现allmake error_深入理解 OpenFOAM 环境与编译过程
- 帝国cms php sql,帝国CMS下在PHP文件中调用数据库类执行SQL语句实例
- 实验四 图的实现与应用
- Codeforces Round #323 (Div. 1) B. Once Again... 暴力
- 不写代码不用Excel,如何制作高大上的财务分析?
- SimpleUI 2.0 发布,采用element-ui+vue给django admin带来全新体验
- 上学的时候的一个作业
- 人工神经网络的发展历程,人工神经网络基本结构
- python开发erp系统odoo_odooERP系统(框架)总结
- 矿山井口安检综合管理系统
- php orientation生成图片,图片自动旋转的前端实现方案
- 如何根据业务需求来选择合适的代理IP
- 新一代容器技术———Podman
- codeblocks shotcut
- 飞控与地面站的概念和关系
- kubernetes使用Træfik代理服务
- Django REST framework(官方教程)