配置mysql 主主模式 GTID

文章目录

    • 一、前提
    • 二、修改my.cnf
      • [主1 10.255.131.9](#主1 10.255.131.9)
      • [主2 10.255.131.10](#主2 10.255.131.10)
    • 三、配置主主
      • [3.1 配置主 10.255.131.9](#3.1 配置主 10.255.131.9)
      • [3.2 配置从 10.255.131.10](#3.2 配置从 10.255.131.10)
      • [3.3 配置主 10.255.131.10](#3.3 配置主 10.255.131.10)
      • [3.4 配置从 10.255.131.9](#3.4 配置从 10.255.131.9)
    • 四、验证
    • 五、同步问题排查以及恢复
      • [5.1 查看同步状态](#5.1 查看同步状态)
      • [5.2 查看同步是否数据一致性,延迟多少](#5.2 查看同步是否数据一致性,延迟多少)
      • [5.3 过滤掉常见错误](#5.3 过滤掉常见错误)
      • [5.4 同步失败如何恢复](#5.4 同步失败如何恢复)

一、前提

两台机器均部署好了mysql;

部署可参考之前的博客: Mysql 8.4.3LTS 的离线部署

二、修改my.cnf

主1 10.255.131.9

vim /etc/my.cnf

mysqld\] 中加入以下内容 ```mysql # 配置server-id 每个MySQL实例的server-id都不能相同 server-id=9 # MySQL的日志文件的名字 log-bin=mysql_master # 作为从库时 更新操作是否写入日志 on:写入 其他数据库以此数据库做主库时才能进行同步 log-slave-updates=on # 同步DML binlog_format = ROW # 开启GTID gtid-mode = ON enforce-gtid-consistency = ON log-slave-updates = ON # 多线程复制 slave_parallel_workers = 4 # MySQL系统库的数据不需要同步 我们这里写了3个 更加保险 # 同步数据时忽略一下数据库 但是必须在使用use db的情况下才会忽略;如果没有使用use db 比如create user 数据还是会同步的 replicate-ignore-db=information_schema replicate-ignore-db=mysql replicate-ignore-db=performance_schema replicate-ignore-db=sys # 使用通配符忽略MySQL系统库的表 这样在create user时也不会进行同步了 replicate_wild_ignore_table=information_schema.% replicate_wild_ignore_table=mysql.% replicate_wild_ignore_table=performance_schema.% replicate_wild_ignore_table=sys.% # MySQL系统库的日志不计入binlog 这样更加保险了 binlog-ignore-db=information_schema binlog-ignore-db=mysql binlog-ignore-db=performance_schema binlog-ignore-db=sys ``` #### 主2 10.255.131.10 修改my.cnf, 只需要修改其中的两个地方,其他内容一样 ```mysql # 配置server-id 每个MySQL实例的server-id都不能相同 server-id=10 # MySQL的日志文件的名字 log-bin=mysql_slave ``` my.cnf文件修改完成后,重启mysql `systemctl restart mysql` ### 三、配置主主 主主模式就是配置两个主从。 10.255.131.9(主)-\>10.255.131.10(从) 10.255.131.10(主)-\>10.255.131.9(从) #### 3.1 配置主 10.255.131.9 先登录10.255.131.9(主1)的数据库,依次执行如下命令: ```shell #创建备份的账号 使用MYSQL_NATIVE_PASSWORD的方式加密 create user 'repl_master'@'%' identified with mysql_native_password by 'master_****'; # 对repl_master授予备份的权限 grant replication slave on *.* to 'repl_master'@'%'; # 刷新权限 flush privileges; ``` #### 3.2 配置从 10.255.131.10 登录到10.255.131.10(主2) 中,执行如下命令: ```mysql mysql> CHANGE MASTER TO MASTER_HOST='10.255.131.10', MASTER_USER='repl_master', MASTER_PASSWORD='master_****', MASTER_PORT=3306, MASTER_AUTO_POSITION = 1; ``` ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/f2e5f217e9944d8e89fac3f9301cf49d.png) ```mysql mysql> START SLAVE; mysql> SHOW SLAVE STATUS\G; ``` ![image-20241029192846975](https://img-blog.csdnimg.cn/img_convert/6d418b2872232a5b4c6dd83f4eac99c3.png) 这样, **10.255.131.9(主1)-\>10.255.131.10(主2)的主从**就搭建好了。 然后,我们再反过来,搭建 **10.255.131.10(主2)-\>10.255.131.9(主1)的主从**。 #### 3.3 配置主 10.255.131.10 登录10.255.131.10(主2)的数据库,依次执行如下命令: ```mysql #创建备份的账号 使用MYSQL_NATIVE_PASSWORD的方式加密 create user 'repl_slave'@'%' identified with mysql_native_password by 'slave_****'; # 对repl_slave授予备份的权限 grant replication slave on *.* to 'repl_slave'@'%'; # 刷新权限 flush privileges; # 查看MySQL主节点的状态 show master status; ``` ![image-20241029193053920](https://img-blog.csdnimg.cn/img_convert/1eba604211f2cbd77abb5228a9a9037b.png) binlog文件的名字,mysql_master.000001,和位置,也就是830。 #### 3.4 配置从 10.255.131.9 登录到10.255.131.9(主1),执行如下命令: ```mysql mysql> CHANGE MASTER TO MASTER_HOST='10.255.131.9', MASTER_USER='repl_slave', MASTER_PASSWORD='slave_****', MASTER_PORT=3306, MASTER_AUTO_POSITION = 1; ``` ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/545b63e366d34a3db88197ce8289273e.png) ```mysql mysql> START SLAVE; mysql> SHOW SLAVE STATUS\G; ``` ![image-20241029193203509](https://img-blog.csdnimg.cn/img_convert/8cb554407994124f996b1fd970e00251.png) ### 四、验证 由于上述的my.cnf中将创建用户,创建表的行为给屏蔽同步了。 注释相关代码后 重启,发现在10.255.131.9上执行的创建用户与表的动作; 10.255.131.10上已经同步过去了。 此外创建分区并不会导致同步的报错以及异常; **CALL** P_ADD_TAB_PARTITION_THAT_VERY_DAY('MON_DATA_CUR'); 两台服务器均正常创建了今天的分区; ### 五、同步问题排查以及恢复 #### 5.1 查看同步状态 同步状态是否正常可通过sql查询; `mysql> show slave status\G;` 以下两个属性均为yes;说明同步状态正常 **Slave_IO_Running: Yes** **Slave_SQL_Running: Yes** 如果有任何为No,可以查询Last_SQL_Error上次同步失败的sql;如何恢复,请看5.4 #### 5.2 查看同步是否数据一致性,延迟多少 `mysql> show slave status\G;` **Seconds_Behind_Master:** 为0说明数据同步完成,这个属性表示的是从库同步主库的延迟时间,单位秒; #### 5.3 过滤掉常见错误 常见的有1032错误码; ![image-20241029193448260](https://img-blog.csdnimg.cn/img_convert/19f9222a436b90e6ec0c47e0d28002f6.png) binlog中变更的那行在表中不存在,导致主从失败; 该错误很常见,可屏蔽 my.cnf可配置`slave-skip-errors=1032` 重启mysql,就可以跳过日志中的1032错误码 也可以配置 # 跳过所有错误 slave-skip-errors=all #### 5.4 同步失败如何恢复 如果主库有个错误的sql执行导致报错,或者主从库数据结构不一致等原因导致同步报错; 这种情况如何恢复同步呢; 基本上就这三步; ```mysql mysql> stop slave; mysql> reset slave; mysql> start slave; ``` 如果起不来可能是binlog记录的位置不一致。这时候reset slave下再重启; 复杂的错误导致数据不一致的情况 1. 全量同步 可以采取删除从库数据库,主库锁库只读。然后全量备份再恢复到从库中,再建立主从同步的链接,以此来恢复。 锁表:`FLUSH TABLES WITH READ LOCK;` 解锁:`UNLOCK TABLES;` 2. 跳过部分错误(没啥用) mysql\>stop slave ; \~\~mysql\>SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;\~\~跳过一个事务 mysql\>start slave; 3. 对于复杂的报错无法解决的时候如果同步并恢复主从呢 在此举例主从,主主的模式一样,就是操作两遍。 首先从数据库停止同步;并删除主从连接配置信息 `mysql> stop slave;` `mysql> reset slave all;` 主数据库中删除binlog,重新记录binlog `mysql> reset master;` 借助工具,手动的同步两个数据库,主数据库数据同步到从数据库中;**Navicat,SQLyog** 均可,好用。 从数据库上建立连接GTID ```mysql mysql> CHANGE MASTER TO MASTER_HOST='10.255.131.9', MASTER_USER='repl_master', MASTER_PASSWORD='master_****', MASTER_PORT=3306, MASTER_AUTO_POSITION = 1; ``` 启动从库同步; `mysql> start slave;` 这样就可以恢复主从的同步了。 这是没法通过 reset slave; 恢复同步时候的实用的解决方式,要注意mysql同步之前最好做下必要的备份,防止数据丢失。 总之数据库的同步是一个复杂的情况,如果生产上发现同步异常,数据库数据不一致等情况,可以找专业DBA。

相关推荐
柏油2 小时前
MySql InnoDB 事务实现之 undo log 日志
数据库·后端·mysql
jack xu13 小时前
高频面试题:如何保证数据库和es数据一致性
java·大数据·数据库·mysql·elasticsearch
炫彩@之星3 小时前
Mysql之UDF提权
mysql·udf提权
爱的叹息4 小时前
DeepSeek 大模型 + LlamaIndex + MySQL 数据库 + 知识文档 实现简单 RAG 系统
数据库·人工智能·mysql·langchain
橘猫云计算机设计4 小时前
net+MySQL中小民营企业安全生产管理系统(源码+lw+部署文档+讲解),源码可白嫖!
数据库·后端·爬虫·python·mysql·django·毕业设计
黄嚯嚯4 小时前
Mysql8.0 推出的强大功能 窗口函数(Window Functions)
数据库·mysql
神仙别闹4 小时前
基于Java+MySQL 实现(Web)日程管理系统
java·前端·mysql
苹果酱05675 小时前
2020-06-23 暑期学习日更计划(机器学习入门之路(资源汇总)+概率论)
java·vue.js·spring boot·mysql·课程设计
Lucky GGBond5 小时前
MySQL 报错解析:SQLSyntaxErrorException caused by extra comma before FROM
数据库·mysql
Java水解6 小时前
Mysql之存储过程
后端·mysql