slave服务器不小心写入数据的解决方案
如果数据⽐较少,可以通过跳过当前语句的⽅式解决,但是如果从服务器写⼊的数据⽐较多,架构必须重新搭建
可通过变量sql_slave_skip_counter临时跳过事务进⾏处理
mysql> set GLOBAL sql_slave_skip_counter=N # n代表跳过的n个事务
mysql> stop slave;
mysql> start slave;
跳过事务应该在slave上运⾏
传统的ab复制⽅式可以使⽤,基于GTIDs的⽅式不⽀持
基于gtids的主从复制搭建
GTIDs是完全基于事务的,因此不⽀持MYISAM存储引擎
gtids的限制条件:
-
不⽀持⾮事务引擎(MyISAM)因为可以回导致多个gtid分布给同⼀个事务
-
create table select语句不⽀持(主库语法报错)
-
create、drop temprary table语法不⽀持
-
必须使⽤enforce-gtid-consistency参数
-
sql-slave-skip-counter不⽀持
-
gtid复制环境中必须统⼀开启gtid或者关闭gtid
-
在5.7之前使⽤mysql upgrade命令也会出现问题
步骤:
replication是基于传统的⽅式部署,并且已经在运⾏,利⽤已经存在的环境升级⾄基于GTIDs的replication
- 修改配置⽂件,⽀持GTIDs(主从)
主服务器:
gtid-mode=on
log-slave-updates=1
enforce-gtid-consistency
从服务器:
log-bin=/usr/local/mysql/data/binlog
gtid-mode=on
log-slave-updates=1
enforce-gtid-consistency
skip-slave-start
- 重启数据库(主从)
service mysql8 restart
- 为了保证数据⼀直,master和slave都设置为只读
mysql> set @@global.read_only=ON;
Query OK, 0 rows affected (0.01 sec)
- 从服务器上重新配置同步
即slave重新配置change master to
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> reset slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> change master to
-> master_host='192.168.118.20',
-> master_user='slave',
-> master_password='slave',
-> master_port=3306,
-> master_auto_position=1;
Query OK, 0 rows affected, 8 warnings (0.01 sec)
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
Master_Host: 192.168.118.20
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: binlog.000015
Read_Master_Log_Pos: 157
Relay_Log_File: relaylog.000002
Relay_Log_Pos: 367
Relay_Master_Log_File: binlog.000015
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
5.关闭主从服务器的只读模式
mysql> set @@global.read_only=OFF;
Query OK, 0 rows affected (0.00 sec)