mysql主从整库复制重新初始化单表
问题描述
mysql主从复制,一主二从,数据库版本5.7,为了便于描述,假设主库为A,从库为B和C。主从库复制策略为整库复制。从库B复制进程报错,为使复制进程恢复正常,排除了问题表T1。现需要对从库B的T1表进行初始化操作。该表三千二百万条数据左右。
处理方法1-mysqldump逻辑导出
1.1、从库停止复制进程
Mysql> stop slave;
1.2、主库导出表t1
导出命令如下:
Mysql> set max_execution_time=0
mysqldump -uroot -p --single-transaction --set-gtid-purged=off --master-data=2 --flush-logs ttdb t1 > /tmp/t1.sql
导出的sql文件8G,用时20分钟左右
注意:
1、该操作会执行FLUSH TABLES WITH READ LOCK(加锁时间很短),在业务低峰期的时候执行
2、–single-transaction只能对innodb引擎表使用
1.3、拷贝备份文件到从库并执行
Mysql> set global super_read_only=off;
Mysql> set global read_only=off;
Mysql> set max_execution_time=0;
Mysql> source /tmp/t1.sql
导入时间大概1小时15分钟左右
1.4、启动从库复制进程到指定POS点
Mysql> start slave until MASTER_LOG_FILE=‘mysql-bin.000151’, MASTER_LOG_POS=245;
复制进程追到指定的POS点后,IO线程是运行状态,SQL线程会自动停止。
MASTER_LOG_FILE和MASTER_LOG_POS信息在t1.sql中获取,备份的时候指定了–master-data=2参数,所以会在备份中生成以上信息。
例如:
–CHANGE MASTER TO MASTER_LOG_FILE=’ mysql-bin.000151’, MASTER_LOG_POS=245;
1.5、停止从库复制进程并删除排除表策略
复制进程追到指定的POS点后,停止复制进程,删除排除表策略。
Mysql> stop slvae;
Mysql> change replication fliter replicate_ignore_table=();
1.6、启动从库复制进程
Mysql> start slave;
1.7、参数恢复原来的值。
数据追平无问题后,参数恢复原来的值。
Mysql> set global super_read_only=on;
Mysql> set global read_only=on;
Mysql> set max_execution_time=2000;
该方法步骤较简单,本次处理问题使用的该方法。
处理方法2-innobackupex初始化表
1.1、从库停止复制进程
Mysql> stop slave;
1.2、主库导出表t1
导出命令如下:
Innobackupex –user=root –password=root –databases=ttdb.t1 –parallel=4 /tmp/bak
执行–apply-log使备份数据处于一致性状态
Innobackupex --apply-log –export –user-memroy=2g /tmp/bak/xxx
1.3、从库导入表
从库
Mysql> set global super_read_only=off;
Mysql> set global read_only=off;
Mysql> set max_execution_time=0;
Mysql>ALTER TABLE t1 DISCARD TABLESPACE;
主库
主库拷贝备份文件到从库数据文件目录
scp cfg、ibd、exp文件到从库
从库
Mysql> ALTER TABLE t1 IMPORT TABLESPACE;
1.4、启动从库复制进程到指定POS点
Mysql> start slave until MASTER_LOG_FILE=‘mysql-bin.000151’, MASTER_LOG_POS=245;
复制进程追到指定的POS点后,IO线程是运行状态,SQL线程会自动停止。
MASTER_LOG_FILE和MASTER_LOG_POS信息在xtrabackup_binlog_info文件中获取。
1.5、停止从库复制进程并删除排除表策略
复制进程追到指定的POS点后,停止复制进程,删除排除表策略。
Mysql> stop slvae;
Mysql> change replication fliter replicate_ignore_table=();
1.6、启动从库复制进程
Mysql> start slave;
1.7、参数恢复原来的值。
数据追平无问题后,参数恢复原来的值。
Mysql> set global super_read_only=on;
Mysql> set global read_only=on;
Mysql> set max_execution_time=2000;
处理方法3-传输表空间方式
该处理方式和innobackupex一样,只不过方法3需要锁表,影响较大。
1.1、主库锁定表t1
Mysql> lock table t1 read;
1.2、从库停止复制进程
Mysql> stop slave;
1.3、从库导入表
从库
Mysql> set global super_read_only=off;
Mysql> set global read_only=off;
Mysql> set max_execution_time=0;
Mysql>ALTER TABLE t1 DISCARD TABLESPACE;
主库
主库拷贝t1表相关文件到从库数据文件目录
scp cfg、ibd文件到从库
注:为减少锁表时间,可以先把相关文件拷贝到本地,然后再scp
到从库
拷贝完成后,解锁表
Mysql> unlock table;
从库
Mysql> ALTER TABLE t1 IMPORT TABLESPACE;
1.4、删除排除表策略
删除排除表策略。
Mysql> change replication fliter replicate_ignore_table=();
1.5、启动从库复制进程
Mysql> start slave;
1.6、参数恢复原来的值。
数据追平无问题后,参数恢复原来的值。
Mysql> set global super_read_only=on;
Mysql> set global read_only=on;
Mysql> set max_execution_time=2000;
注:
该环境为一主2从,A为主库,B、C为从库。B库需要单独同步表,可以把B库的主更改为C,在C库做锁表、拷贝数据文件操作,不影响主库。等操作做完数据追评后,再把C库的主库更改为A库。这样对主库没有影响,就是操作多一些。做以上操作的时候需要记录好从库的gtid信息,以防丢失数据。




