MySQL45讲之主备数据一致性 – flowers

MySQL45讲之主备数据一致性 – flowers本文主要介绍 MySQL 主备数据同步的重要日志 binlog 的三种格式,和双 M 结构的循环复制问题。

MySQL45讲之主备数据一致性 - flowers

前言

本文主要介绍 MySQL 主备数据同步的重要日志 binlog 的三种格式,和双 M 结构的循环复制问题。

binlog三种格式

1. statement格式

直接存储了执行的 SQL 语句,并且存储了时间戳,大部分情况下不会出现主从不一致的情况。但是,还是存在某些特殊情况下,比如主从库执行语句时使用的索引不一样(因为存在统计模糊量,所以执行代价评估的时候结果可能不同),最后导致更新的结果不一致。

总结:statement的优点在于占用的存储空间较小,但是可能会出现主从数据不一致的情况,所以基本不采用statement格式。

2. row格式

row 格式下,binlog 中记录了执行前后的行记录字段值,方便数据回滚。binlog_row_image 默认配置为 FULL,所以 binlog 中会记录行的全字段值,如果修改为 MINIMAL,则只会记录一些必要的字段值。

总结:因为 row 格式下记录了修改的字段值,所以主从同步时不会发生数据不一致。但是因为会记录更新前后的字段值,占用的存储空间会大很多。

3. mixed格式

既然有了 row 格式,为什么还要 mixed 格式呢?

mixed 格式就是 statement 格式和 row 格式的混合。MySQL 会判断当语句不会导致主从数据不一致时,就采用 statement 格式记录,否则采用 row 格式节省存储空间。即 mixed 格式结合了 statement 和 row 格式的优点。


虽然 mixed 格式看着比 row 格式更有优势,但是当前更多的场景下还是使用 row 格式。其中,一个比较明显的原因就是 row 格式恢复数据很方便。

循环复制问题

生产环境中使用较多的是双 Master 的结构,即一台主机和一台备机之间互为主备。这样存在一个问题,主机更新后的 binlog 同步到备机后,备机的 binlog 也会更新然后又同步到主机,这样不就发生循环复制了么?

这个问题的解决办法是,row 格式的 binlog 中记录了 server id,备机同步 binlog 时会继续使用主机传过来的 server id,这样从机将 binlog 传回主机时,主机判断 binlog 中的 server id 和本机一致,就会终止 binlog 的同步,从而打断循环复制。

参考

  • [1] MySQL是怎么保证主备一致的

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/5802.html

(0)
上一篇 2023-04-24
下一篇 2023-04-24

相关推荐

  • Python正常终止!

    Python正常终止!Python是一门广泛使用的高级编程语言,因为其简单易学、易读易写、可扩展的特点而受到越来越多的欢迎。

    2024-09-10
    23
  • elasticsearch 聚合之后获取桶的平均值avg_bucket或者stats_bucket「建议收藏」

    elasticsearch 聚合之后获取桶的平均值avg_bucket或者stats_bucket「建议收藏」例子 GET /collect_data_store_goods_fact*/_search { “query”: { “match_all”: {} }, “size”: 0, “aggs”: {…

    2022-12-19
    144
  • MySql5.7 datetime 默认值为‘0000-00

    MySql5.7 datetime 默认值为‘0000-00注: NO_ZERO_IN_DATE:在严格模式下,不允许日期和月份为零 NO_ZERO_DATE:设置该值,MySql数据库不允许插入零日期,插入零日期会抛出错误而不是警告。

    2023-02-01
    173
  • Opencv Python安装教程

    Opencv Python安装教程在安装前,我们需要进行一些准备工作:

    2024-09-18
    18
  • MySQL学习笔记(19):优化数据库对象

    MySQL学习笔记(19):优化数据库对象本文更新于2019-08-18,使用MySQL 5.7,操作系统为Deepin 15.4。 一旦数据库对象设计完毕并投入使用,再进行修改就比较麻烦。 优化表的数据类型 select_statement

    2023-03-22
    146
  • 用 Python 更新第三方库

    用 Python 更新第三方库Python 是一种广泛使用的动态编程语言,它的简洁性和灵活性使其成为一种很受开发者欢迎的语言。不过,由于不同的项目和库使用不同版本的 Python,所以在更新 Python 版本后,需要更新之前安装的第三方库,以避免出现不兼容问题。在本文中,我们将介绍如何使用 Python 更新第三方库,以及如何管理不同版本的 Python 和库。

    2024-08-31
    23
  • 如何在Pycharm中删除项目

    如何在Pycharm中删除项目PyCharm是一款比较流行的Python IDE(集成开发环境),它为Python开发者提供了非常方便的开发环境。如果你是一个PyCharm用户,你可能会发现自己在使用它的时候,会有一些不必要的项目残留在你的开发环境中。那么,在这种情况下,如何从PyCharm中删除这些项目呢?本文将从多个方面详细介绍如何在Pycharm中删除项目。

    2024-09-03
    26
  • 使用Django测试

    使用Django测试在Web应用开发中,测试是一个重要的环节。而Django作为一个流行的Web框架,在测试方面也提供了良好的支持。本文将从多个角度详细介绍Django测试的相关内容。

    2024-08-07
    35

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注