暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mysql主从整库复制重新初始化单表

原创 丁向辉 2022-04-13
2082

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信息,以防丢失数据。


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论