原创作者:爱可生开源社区

本文我们来看一个场景,两台MySQL实例使用主从复制,当master故障,触发高可用切换,新master上线后,通过备份重建旧master并建立复制后,数据发生丢失。

以下我们通过图解还原一遍当时的场景:

注:图中标注的id指的是MySQL的server_id

server_id配置:

  1. 默认值1或0
  2. 需要配置时通过参数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启动时

  1. 尝试从 data_dir/auto.cnf中读取 uuid
  2. 如果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导致数据丢失相关推荐

  1. mysql新增列并同时增加数据_图解MySQL | 「原理解析」 MySQL 为表添加列 是怎么立刻完成的...

    原创作者:图解MySQL 在上一期图解 图解MySQL | MySQL DDL为什么成本高?中,我们介绍了: 传统情况下,为表添加列需要对表进行重建 腾讯团队为 MySQL 引入了 Instant A ...

  2. mysql 查看server id_图解MySQL | [原理解析] MySQL使用固定的server_id导致数据丢失

    原创作者:黄炎 王悦 周海鸣 本文我们来看一个场景,两台MySQL实例使用主从复制,当master故障,触发高可用切换,新master上线后,通过备份重建旧master并建立复制后,数据发生丢失. 以 ...

  3. MySQL百一题库_「灵魂拷问」MySQL面试高频一百问(工程师方向)

    前言 每当我们在生产环境服务器上执行rm命令时,总是提心吊胆的,因为一不小心执行了误删,然后就要准备跑路了,毕竟人不是机器,更何况机器也有bug,呵呵. 那么如果真的删除了不该删除的文件,比如数据库. ...

  4. promise用法_图解 Promise 实现原理(四):Promise 静态方法实现

    作者:Morrain 转发链接:https://mp.weixin.qq.com/s/Lp_5BXdpm7G29Z7zT_S-bQ 前言 Promise 是异步编程的一种解决方案,它由社区最早提出和实 ...

  5. 0配置EF连接MySql数据库_第八节:EF Core连接MySql数据库

    一. 前提 1.安装EF Core连接MySQL的驱动,这里有两类: (1).Oracle官方出品:MySql.Data.EntityFrameworkCore (版本:8.0.17) (2).其他第 ...

  6. mac mysql使用_在Mac中安装和使用MySQL

    下载安装MySQL 在官网下载MySQL 进入官网后可以看到有多个版本可选: Oracle MySQL Cloud Service 基于企业版数据库的云服务 MySQL Enterprise Edit ...

  7. react 判断地址是否有效_继续,react-redux原理解析

    本文原文链接 在之前的一篇文章中已讲过redux 原理解析,我将redux返回的store对象挂载在window中,不是太懂的同学可以看看之前的redux 原理解析. const reducer = ...

  8. cmd如何刷新MySQL数据库_怎样在cmd中用命令操作MySQL数据库 需要技巧

    用命令来操作MySQL是工作必备的,今天我就来分享一下cmd命令操作MySQL数据库的方法,希望有帮助. 工具/材料 电脑 xampp 操作方法 01 首先,启动MySQL服务才行哦.这里我是用xam ...

  9. 网页服务器和mysql服务器_实现Web服务器之间使用同一个MYSQL和相同的网页配置文件的方法...

    实现Web服务器之间使用同一个MYSQL和相同的网页配置文件的方法 发布时间:2020-04-15 16:42:41 来源:亿速云 阅读:133 作者:三月 栏目:数据库 亿速云负载均衡(Cloud ...

最新文章

  1. 编写高性能Java代码的最佳实践
  2. 为什么edge AI是一个无需大脑的人
  3. mysql包含哪几部分_sql语言包含哪些部分
  4. openfoam安装中出现allmake error_深入理解 OpenFOAM 环境与编译过程
  5. 帝国cms php sql,帝国CMS下在PHP文件中调用数据库类执行SQL语句实例
  6. 实验四 图的实现与应用
  7. Codeforces Round #323 (Div. 1) B. Once Again... 暴力
  8. 不写代码不用Excel,如何制作高大上的财务分析?
  9. SimpleUI 2.0 发布,采用element-ui+vue给django admin带来全新体验
  10. 上学的时候的一个作业
  11. 人工神经网络的发展历程,人工神经网络基本结构
  12. python开发erp系统odoo_odooERP系统(框架)总结
  13. 矿山井口安检综合管理系统
  14. php orientation生成图片,图片自动旋转的前端实现方案
  15. 如何根据业务需求来选择合适的代理IP
  16. 新一代容器技术———Podman
  17. codeblocks shotcut
  18. 飞控与地面站的概念和关系
  19. kubernetes使用Træfik代理服务
  20. Django REST framework(官方教程)

热门文章

  1. c++ DirectShow播放任意格式的视频
  2. mfc 多窗口之间互相切换
  3. 初学Java Web(8)——过滤器和监听器
  4. ThreadPoolExecutor源码解析(二)
  5. 程序员究竟该如何提高效率
  6. 对一致性Hash算法,Java代码实现的深入研究
  7. LaTeX集合运算相关命令
  8. 图像处理(三)图像分割(1)Random Walks分割
  9. 微软等数据结构+算法面试100题全部答案集锦
  10. 《大话数据结构》第9章 排序 9.2 排序的基本概念与分类