• MySQL(六) 保证主从一致


    一. 先配置好一个主从案例

    配置主从

    注意:my.cnf中加入一行配置:

    [mysqld]
    # 这个参数表示启用 binlog 功能,并指定 binlog 的存储目录
    log-bin=javaboy_logbin
    # 设置 binlog_format 格式
    binlog_format=STATEMENT
    # 设置一个 binlog 文件的最大字节
    # 设置最大 100MB
    max_binlog_size=104857600
    # 设置了 binlog 文件的有效期(单位:天)
    expire_logs_days = 7
    # binlog 日志只记录指定库的更新(配置主从复制的时候会用到)
    binlog-do-db=db01
    # binlog 日志不记录指定库的更新(配置主从复制的时候会用到)
    #binlog-ignore-db=javaboy_no_db
    # 写缓存多少次,刷一次磁盘,默认 0 表示这个操作由操作系统根据自身负载自行决定多久写一次磁盘
    # 1 表示每一条事务提交都会立即写磁盘,n 则表示 n 个事务提交才会写磁盘
    sync_binlog=0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    log-bin:同步的日志路径及文件名,一定注意这个目录要是 MySQL 有权限写入的(我这里是偷懒了,直接放在了下面那个datadir下面)。
    binlog-do-db:要同步的数据库名,当从机连上主机后,只有这里配置的数据库才会被同步,其他的不会被同步。
    server-id: MySQL 在主从环境下的唯一标志符,给个任意数字,注意不能和从机重复。修改 binlog_format 的值为 STATEMENT,这一点很关键。

    二.进行一致性的测试

    接下来创建db01数据库

    在这里插入图片描述

    数据表user表中加入一条数据
    INSERT INTO USER VALUES(1,UUID(),'zhangsan');
    同理再加入一条

    查看主机的数据库中存储的UUID
    在这里插入图片描述

    查看从机的数据库中存储的UUID
    在这里插入图片描述

    因为前面设置了binglog_format的格式,现在这里就显示了主机从机数据不一致。

    三.主从不一致分析:

    我们知道,MySQL 主从同步最主要的依据就是 binlog
    1.master 将自己的 binlog 发给 slave
    2.slave 重放之后获取和 master 一致的数据。

    那我们就来看看 master 生成的 binlog 是啥样子。
    我们按照事件的方式来看一下 binlog,命令格式如下:

    show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];

    这个表示以事件的方式来查看binlog,涉及到了几个参数:

    log_name:可以指定要查看的 binlog 日志文件名,如果不指定的话,表示查看最早的 binlog 文
    件。
    pos:从哪个 pos 点开始查看,凡是 binlog 记录下来的操作都有一个 pos 点,这个其实就是相当
    于我们可以指定从哪个操作开始查看日志,如果不指定的话,就是从该 binlog 的开头开始查看。
    offset:这是是偏移量,不指定默认就是 0。
    row_count:查看多少行记录,不指定就是查看所有。

    查看命令如下(我这里就从 pos 为 154 的位置开始)

    先看一下你现在binlog是叫什么名字 :
    show master status

    在这里插入图片描述

    再看一下我们binlog里面的日志 :
    show binlog events in 'binlog.000002' ;

    在这里插入图片描述

    新增两条数据的日志如上。
    从上图中可以看到,记录在binlog原文中的日志是:
    use db01;
    INSERT INTO user VALUES(2,UUID(),‘zhangsan1’);
    这句SQL将来同步到slave之后,slave照着执行以下,那必然出现执行结果不一致的问题,因为uuid()函数每次执行结果都不一样。

    四.解决主从不一致

    设置 binlog_format 格式

    上面由于我们设置了这行配置
    binlog_format=STATEMENT
    致使我们主从不一致

    我们把这行配置改为:
    binlog_format=ROW
    即可

    有点草率的结束了,这里有个插件始终装不好,没法进行下一步

  • 相关阅读:
    Eviews如何做VAR
    沉睡者IT - 说几个2022年网络上比较好赚钱的创业项目
    运用selenium爬取京东商品数据储存到MySQL数据库中
    MyBatis友人帐之动态SQL
    ChatGPT付费创作系统V2.8.4独立版 WEB+H5+小程序端 (新增Pika视频+短信宝+DALL-E-3+Midjourney接口)
    [性能测试] locust学习-基础篇
    Amazon Fargate 使用 Seekable OCI 实现更快的容器启动速度
    vscode中对 python 快速增加header 描述
    CTFShow pwn07 (ret2libc-64bit
    【配置多个ssh keys】在同一台电脑上,同时配置多个ssh keys (私钥和公钥),以操作不同的Git托管平台仓库
  • 原文地址:https://blog.csdn.net/weixin_43189971/article/details/126414078