配置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。

相关推荐
JavaGuide29 分钟前
公司来的新人用字符串存储日期,被组长怒怼了...
后端·mysql
怒放吧德德3 小时前
MySQL篇:MySQL主从集群同步延迟问题
后端·mysql·面试
Eip不易也不e5 小时前
教程之同时安装两个版本的 mysql
mysql
Kagol5 小时前
macOS 和 Windows 操作系统下如何安装和启动 MySQL / Redis 数据库
redis·后端·mysql
Qi妙代码7 小时前
MYSQL基础
数据库·mysql·oracle
llzcxdb8 小时前
【MySQL】理解MySQL的双重缓冲机制:Buffer Pool与Redo Log的协同之道
数据库·mysql
Allen Bright8 小时前
【MySQL基础-20】MySQL条件函数全面解析:提升查询逻辑的利器
数据库·mysql
dleei10 小时前
MySql安装及SQL语句
数据库·后端·mysql
信徒_11 小时前
Mysql 在什么样的情况下会产生死锁?
android·数据库·mysql
苹果酱056712 小时前
Golang标准库——runtime
java·vue.js·spring boot·mysql·课程设计