主从备份问题


dg-publish: true

1. 从库同步error 1236 ,master has purged binary logs

该错误常是发现在从库的io进程从主库拉取日志时,主库上的binlog被删除了,导致从库获取不到对应的binglog file。
使用mysqldump或xtrabackup重新搭建GTID从库。
这里我是slave错误得执行了reset master,导致slave将当前gtid_executed和gtid_purged被错误得置空了,有些master早起执行的事务的binlog已经清除了purged,slave无法replay导致错误,因为这里我们确认主从实际上是一致的(从数据库之前数据已经同步完,并且master没有进行新的事务)

  1. 这样的的话,我们只需要将那些start slave报错的那些无法replay的事务在slave使用空事务执行替代
-- purged的事务只有一个的时候可以直接terminal session里面直接执行一下命令进行填充
stop slave;
SET @@GLOBAL.gtid_next = 'master的uuid:事务id';
BEGIN;
COMMIT;
SET @@GLOBAL.gtid_next = AUTOMATIC;
start slave;
-- 假设 purged的事务比较多,且具有连续性的话可以直接创建一个procedure全部填充
-- while loop不能在非函数和非过程中使用。。。
DELIMITER $$
DROP PROCEDURE IF EXISTS FILL_PURGED;
CREATE PROCEDURE FILL_PURGED()
BEGIN
SET @ID=1271914;
SET @MASTER_ID='XXXXXXX';
SET GTID_NEXT=CONCAT(@MASTER_ID,':',@ID);
WHILE @ID <= 1271958 DO
	START TRANSACTION; --这里使用begin替代会报错?
	COMMMIT;
	SET @ID=@ID+1;
	SET GTID_NEXT=CONCAT(@MASTER_ID,':',@ID);
END WHILE;
END $$
DELIMITER ;
CALL FILL_PURGED();
SET GTID_NEXT=AUTOMATIC

  1. 如果主备数据不一样,需要先同步数据之后
-- slave执行
RESET MASTER;
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
-- master执行
-- --databases db1 db2
mysqldump -u root -p --all-databases > /a/path/mysqldump.sql
UNLOCK TABLES;
# slave执行
STOP SLAVE;
mysql -uroot -p < mysqldump.sql
RESET SLAVE;
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=98;
START SLAVE;
show slave status\G;
-- Slave_IO_Running: Yes
-- Slave_SQL_Running: Yes

GTID:
GTID (Global Transaction ID) 是对于一个已提交事务的编号,并且是一个全局唯一的编号。GTID 实际上 是由 UUID+TID 组成的。其中UUID 是一个 MySQL 实例的唯一标识,记录在$datadir/auto.cnf。TID 代表了该实例上已经提交的事务数量,并且随着事务提交单调递增

#GTID   
3E11FA47-71CA-11E1-9E33-C80AA9429562:23
#一组连续的事务可以用 - 连接的事务序号范围表示
e6954592-8dba-11e6-af0e-fa163e1cf111:1-5 
#多个 MySQL 实例的事务,它们之间用逗号分隔。如果来自同一 MySQL 实例的事务序号有多个范围区间,各组范围之间用冒号分隔。
e6954592-8dba-11e6-af0e-fa163e1cf111:1-5:11-18,  
e6954592-8dba-11e6-af0e-fa163e1cf3f2:1-27`

2. 匿名事务错误


3. 1062主键错误 duplicate entry 'xxx' for key 'xx', Error code:1062

stop slave;
set global gtid_mode='on_permissive';
set global sql_slave_skip_counter = 1; -- 可以设置较大的数,一次行跳过多个同样的报错事务,start slave之后该值会自动被恢复成0
start slave;
show slave status\G;