文章目录
一、前提
两台机器均部署好了mysql;
部署可参考之前的博客: Mysql 8.4.3LTS 的离线部署
二、修改my.cnf
主1 10.255.131.9
vim /etc/my.cnf
[mysqld] 中加入以下内容
# 配置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, 只需要修改其中的两个地方,其他内容一样
# 配置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)的数据库,依次执行如下命令:
#创建备份的账号 使用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> CHANGE MASTER TO
MASTER_HOST='10.255.131.10',
MASTER_USER='repl_master',
MASTER_PASSWORD='master_****',
MASTER_PORT=3306,
MASTER_AUTO_POSITION = 1;
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS\G;
这样,
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_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;
binlog文件的名字,mysql_master.000001,和位置,也就是830。
3.4 配置从 10.255.131.9
登录到10.255.131.9(主1),执行如下命令:
mysql> CHANGE MASTER TO
MASTER_HOST='10.255.131.9',
MASTER_USER='repl_slave',
MASTER_PASSWORD='slave_****',
MASTER_PORT=3306,
MASTER_AUTO_POSITION = 1;
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS\G;
四、验证
由于上述的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错误码;
binlog中变更的那行在表中不存在,导致主从失败; 该错误很常见,可屏蔽
my.cnf可配置slave-skip-errors=1032
重启mysql,就可以跳过日志中的1032错误码
也可以配置
# 跳过所有错误 slave-skip-errors=all
5.4 同步失败如何恢复
如果主库有个错误的sql执行导致报错,或者主从库数据结构不一致等原因导致同步报错;
这种情况如何恢复同步呢;
基本上就这三步;
mysql> stop slave;
mysql> reset slave;
mysql> start slave;
如果起不来可能是binlog记录的位置不一致。这时候reset slave下再重启;
复杂的错误导致数据不一致的情况
- 全量同步
可以采取删除从库数据库,主库锁库只读。然后全量备份再恢复到从库中,再建立主从同步的链接,以此来恢复。
锁表:FLUSH TABLES WITH READ LOCK;
解锁:UNLOCK TABLES;
- 跳过部分错误(没啥用)
mysql>stop slave ;
~~mysql>SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;~~跳过一个事务
mysql>start slave;
- 对于复杂的报错无法解决的时候如果同步并恢复主从呢
在此举例主从,主主的模式一样,就是操作两遍。
首先从数据库停止同步;并删除主从连接配置信息
mysql> stop slave;
mysql> reset slave all;
主数据库中删除binlog,重新记录binlog
mysql> reset master;
借助工具,手动的同步两个数据库,主数据库数据同步到从数据库中;Navicat,SQLyog 均可,好用。
从数据库上建立连接GTID
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。