数据库
首页 > 数据库> > 基于Xtrabackup备份以及可传输表空间功能来配置MySQL多源复制

基于Xtrabackup备份以及可传输表空间功能来配置MySQL多源复制

作者:互联网

一、环境说明:

系统和软件包说明:
3台阿里ECS 系统centos7.6 x86_64位最小化安装

MySQL的版本为MySQL5.7.22 二进制包安装
percona-xtrabackup 安装包为:
percona-xtrabackup-24-2.4.14-1.el7.x86_64.rpm

服务器主机名:
tidb06 172.16.0.247
tidb05 172.16.0.246
tidb04 172.16.0.197

架构说明:
MySQL5.7.22多源复制架构
主库tidb06上的test001,test003库同步到 从库 tidb04

主库tidb05上的test002,test004库同步到 从库 tidb04

二、tidb06到tidb04多源复制部署操作过程如下:

2.1、tidb06 服务器安装percona-xtrabackup-24-2.4.14操作:

下载包

percona-xtrabackup-24-2.4.14 安装
yum localinstall percona-xtrabackup-24-2.4.14-1.el7.x86_64.rpm  

2.2、授权innobackupex备份用户:

GRANT RELOAD, PROCESS, SUPER, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'backupuser'@'localhost' identified by '123456';flush privileges;

2.3 备份tidb06服务器上需要复制的库表结构:


mysqldump -uroot -p'123456' --no-data  -F -B test001 test003 >test.sql

特殊说明下:
-F参数此处的作用是切换到下一个binlog文件。
此处为何建议备份表结构时要加-F 参数切换binlog文件呢?
原因:给一直运行的主库添加新的从库时,由于不太清楚主库之前都做了什么操作,有无记录binlog文件也不是很清楚。所以说在配置新的slave从库之前,最好是切换下binlog文件。让后面在配置slave复制时,指定最新的binlog文件和pos位置点,这样的话可以避免在配置主从时,从库报错。

本次演示环境执行的是下面的命令,并没有加—F参数切换binglog文件:

mysqldump -uroot -p'123456' --no-data  -B test001 test003 >test.sql

2.4 构造tidb06服务器上需要复制的表的禁用和开启表空间的sql:

mysql -sse "select concat('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' DISCARD TABLESPACE;') from information_schema.tables where TABLE_SCHEMA='test001'" >>  discard_tbs.sql
mysql -sse "select concat('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' DISCARD TABLESPACE;') from information_schema.tables where TABLE_SCHEMA='test003'" >>  discard_tbs.sql

mysql -sse "select concat('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' IMPORT TABLESPACE;') from information_schema.tables where TABLE_SCHEMA='test001'" >>  import_tbs.sql
mysql -sse "select concat('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' IMPORT TABLESPACE;') from information_schema.tables where TABLE_SCHEMA='test003'" >>  import_tbs.sql

2.5、innobackupex 备份的tidb06上的需要配置同步的库:

[root@tidb06 backup]# innobackupex --defaults-file=/etc/my.cnf  -ubackupuser -p123456 -S /tmp/mysql.sock  --databases=/tmp/data2.txt  --no-timestamp /data1/backup/db_3306_`date +%Y%m%d`

/tmp/data2.txt文件说明:

在文件 /tmp/data2.txt 中指定 需要备份的tidb06上的库名称列表,特别要注意/tmp/data2.txt 文件每行结尾不能出现空格

[root@tidb06 ~]# cat /tmp/data2.txt 
test001
test003

2.6、把innobackup备份的文件传输到tidb04服务器上:

[root@tidb06 backup]# scp -rp db_3306_20210605 root@172.16.0.197:/data/soft/

[root@tidb04 soft]# innobackupex  --apply-log   --export /data/soft/db_3306_20210605/

特殊说明:
--apply-log 和 --apply-log-only区别和作用:
参考地址:
https://mp.weixin.qq.com/s/yJ_zkGkSOLJglJa395OdQA

##export执行完后sbtest库下备份文件如下所示
##exp结尾的文件为Percona针对Percona XtraDB做export的配置文件
##cfg结尾的文件为Percona针对MySQL可传输表空间export的配置文件
举例列出下test003下的文件名称:


[root@tidb04 ~]# ll /data/soft/db_3306_20210605/test003/
total 642296
-rw-r--r-- 1 root root      2576 Jun  5 08:40 b_lease.cfg
-rw-r----- 1 root root     16384 Jun  5 08:40 b_lease.exp
-rw-r----- 1 root root     10362 Jun  5 08:38 b_lease.frm
-rw-r----- 1 root root  67108864 Jun  5 08:38 b_lease.ibd
-rw-r----- 1 root root        67 Jun  5 08:38 db.opt
-rw-r--r-- 1 root root      1901 Jun  5 08:40 sheet.cfg
-rw-r----- 1 root root     16384 Jun  5 08:40 sheet.exp
-rw-r----- 1 root root     25964 Jun  5 08:38 sheet.frm
-rw-r----- 1 root root     98304 Jun  5 08:38 sheet.ibd
-rw-r--r-- 1 root root      1624 Jun  5 08:40 s_stock_device_finance_201712.cfg
-rw-r----- 1 root root     16384 Jun  5 08:40 s_stock_device_finance_201712.exp
-rw-r----- 1 root root      9268 Jun  5 08:38 s_stock_device_finance_201712.frm
-rw-r----- 1 root root  15728640 Jun  5 08:38 s_stock_device_finance_201712.ibd
-rw-r--r-- 1 root root      2458 Jun  5 08:40 t_reclassify.cfg
-rw-r----- 1 root root     16384 Jun  5 08:40 t_reclassify.exp
-rw-r----- 1 root root     10291 Jun  5 08:38 t_reclassify.frm
-rw-r----- 1 root root 574619648 Jun  5 08:38 t_reclassify.ibd

2.7、导入tidb06上的需要同步的库下面所有的表结构sql:

root@tidb04 08:49:  [test001]> source /root/test.sql

禁用刚才tidb04上的创建的表的表空间:

ALTER TABLE test001.b_lease DISCARD TABLESPACE;
ALTER TABLE test001.s_stock_device_finance_201712_copy1 DISCARD TABLESPACE;
ALTER TABLE test001.s_stock_device_finance_201805_copy1 DISCARD TABLESPACE;
ALTER TABLE test001.t_assets_invoice_sn DISCARD TABLESPACE;
ALTER TABLE test001.t_customer_pool DISCARD TABLESPACE;
ALTER TABLE test001.t_reclassify_3year_bak DISCARD TABLESPACE;
ALTER TABLE test003.b_lease DISCARD TABLESPACE;
ALTER TABLE test003.s_stock_device_finance_201712 DISCARD TABLESPACE;
ALTER TABLE test003.sheet DISCARD TABLESPACE;
ALTER TABLE test003.t_reclassify DISCARD TABLESPACE;

2.8、复制cfg和ibd文件到tidb04库test001和test003目录下并授权MySQL权限:

复制 innobackupex备份tidb06的test001和test003下的表cfg和ibd文件:到tidb04库的test001和test003目录下


[root@tidb04 test001]# pwd
/data/soft/db_3306_20210605/test001
[root@tidb04 test001]# cp *.cfg /data1/mysql/data/test001/
[root@tidb04 test001]# cp *.ibd /data1/mysql/data/test001/

[root@tidb04 test003]# pwd
/data/soft/db_3306_20210605/test003
[root@tidb04 test003]# cp *.cfg /data1/mysql/data/test003/
[root@tidb04 test003]# cp *.ibd /data1/mysql/data/test003/

授权mysql权限:


[root@tidb04 test001]# chown -R mysql.mysql *
[root@tidb04 test003]# chown -R mysql.mysql *

2.9、导入tidb06上的需要同步库test001和test003下面所有表的表空间:

ALTER TABLE test001.b_lease IMPORT TABLESPACE;
ALTER TABLE test001.s_stock_device_finance_201712_copy1 IMPORT TABLESPACE;
ALTER TABLE test001.s_stock_device_finance_201805_copy1 IMPORT TABLESPACE;
ALTER TABLE test001.t_assets_invoice_sn IMPORT TABLESPACE;
ALTER TABLE test001.t_customer_pool IMPORT TABLESPACE;
ALTER TABLE test001.t_reclassify_3year_bak IMPORT TABLESPACE;
ALTER TABLE test003.b_lease IMPORT TABLESPACE;
ALTER TABLE test003.s_stock_device_finance_201712 IMPORT TABLESPACE;
ALTER TABLE test003.sheet IMPORT TABLESPACE;
ALTER TABLE test003.t_reclassify IMPORT TABLESPACE;

2.10、校验下恢复的库:


[root@tidb04 data]# mysqlcheck -c test001
test001.b_lease                                    OK
test001.s_stock_device_finance_201712_copy1        OK
test001.s_stock_device_finance_201805_copy1        OK
test001.t_assets_invoice_sn                        OK
test001.t_customer_pool                            OK
test001.t_reclassify_3year_bak                     OK

[root@tidb04 data]# mysqlcheck -c test003
test003.b_lease                                    OK
test003.s_stock_device_finance_201712              OK
test003.sheet                                      OK
test003.t_reclassify                               OK

2.11、配置从库复制

从xtrabackup的备份文件中 找到需要配置主从复制的binglog文件和pos位置点:

[root@tidb04 db_3306_20210605]# cat xtrabackup_binlog_pos_innodb
mysql-bin.000002 66849324

tidb06服务器上创建复制账户:rep

grant replication slave  ON *.* TO 'rep'@'172.16.0.197' identified by '123456';flush privileges;

tidb04服务器上配置多源复制tidb06:

mysql> CHANGE MASTER TO 
MASTER_HOST='172.16.0.247', 
MASTER_USER='rep', 
MASTER_PORT=3306, 
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=66849324 FOR CHANNEL 'tidb06';

mysql> CHANGE REPLICATION FILTER REPLICATE_WILD_DO_TABLE=('test001.%','test003.%');

mysql> START SLAVE FOR CHANNEL 'tidb06';
mysql> SHOW SLAVE STATUS FOR CHANNEL 'tidb06'\G;

2.12 tidb04 slave库配置过程中报错以及解决:

| Worker 1 failed executing transaction 'ANONYMOUS' at master log mysql-bin.000002, end_log_pos 66849961; Error 'Tablespace is missing for table `test003`.`s_stock_device_finance_201712`.' on query. Default database: 'test003'. Query: 'ALTER TABLE test003.s_stock_device_finance_201712 import TABLESPACE' | 2021-06-05 09:09:39

Last_Errno: 1812报错分析和解决方法:

由于之前tidb06主库上test003.s_stock_device_finance_201712 这个表有 discard tablespace和import tablespace操作。这样的sql是会记录到主库的binlog文件的,导致在部署主从复制时,discard tablespace和import tablespace sql会在从库的slave sql_thread线程上执行一遍。所以才导致上面从库的复制报错

解决方法:


[root@tidb04 ~]# cp /data/soft/db_3306_20210605/test003/s_stock_device_finance_201712.ibd /data1/mysql/data/test003/
[root@tidb04 test003]# pwd
/data1/mysql/data/test003
[root@tidb04 test003]# chown mysql.mysql s_stock_device_finance_201712.ibd

root@tidb04 12:45:  [(none)]> start slave for channel 'tidb06';

又出现如下的报错:

Worker 1 failed executing transaction 'ANONYMOUS' at master log mysql-bin.000003, end_log_pos 535; Error 'Tablespace is missing for table `test003`.`b_lease`.' on query. Default database: 'test003'. Query: 'alter table test003.b_lease import tablespace' | 2

解决方法同上,解决方法:

[root@tidb04 test003]# cp /data/soft/db_3306_20210605/test003/b_lease.ibd   /data1/mysql/data/test003/
[root@tidb04 test003]# pwd
/data1/mysql/data/test003
[root@tidb04 test003]# chown mysql.mysql b_lease.ibd

root@tidb04 12:45:  [(none)]> stop slave for channel 'tidb06';
Query OK, 0 rows affected (0.00 sec)

root@tidb04 12:45:  [(none)]> start slave for channel 'tidb06';
Query OK, 0 rows affected (0.04 sec)

2.13、到此处多源复制复制通道tidb06 只同步复制test001和test003库配置完成:

[root@tidb04 ~]# mysql -e "SHOW SLAVE STATUS FOR CHANNEL 'tidb06'\G"|egrep -i 'Slave_IO_Running|Slave_SQL_Running|Replicate_Wild_Do_Table|Replicate_Wild_Ignore_Table|Channel_Name'
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
      Replicate_Wild_Do_Table: test001.%,test003.%
  Replicate_Wild_Ignore_Table: mysql.%
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
                 Channel_Name: tidb06

三、tidb05 配置多源复制到tidb04

操作步骤和第二步完全一致,所以下面只粘贴具体操作代码。不在详细叙述说明

tidb05 服务器安装percona-xtrabackup-24-2.4.14操作:

percona-xtrabackup-24-2.4.14 安装
yum localinstall percona-xtrabackup-24-2.4.14-1.el7.x86_64.rpm

授权innobackupex备份用户:
GRANT RELOAD, PROCESS, SUPER, LOCK TABLES, REPLICATION CLIENT ON . TO 'backupuser'@'localhost' identified by '123456';flush privileges;

[root@tidb05 ~]# mysqldump -uroot -pEdianyun689 --no-data -B test002 test004 >tidb05.sql

mysql -sse "select concat('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' DISCARD TABLESPACE;') from information_schema.tables where TABLE_SCHEMA='test002'" >>  discard_tbs.sql
mysql -sse "select concat('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' DISCARD TABLESPACE;') from information_schema.tables where TABLE_SCHEMA='test004'" >>  discard_tbs.sql

mysql -sse "select concat('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' IMPORT TABLESPACE;') from information_schema.tables where TABLE_SCHEMA='test002'" >>  import_tbs.sql
mysql -sse "select concat('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' IMPORT TABLESPACE;') from information_schema.tables where TABLE_SCHEMA='test004'" >>  import_tbs.sql
[root@tidb05 ~]# cat import_tbs.sql 
ALTER TABLE test002.t_customer_order_sn IMPORT TABLESPACE;
ALTER TABLE test004.b_lease IMPORT TABLESPACE;
[root@tidb05 ~]# cat discard_tbs.sql 
ALTER TABLE test002.t_customer_order_sn DISCARD TABLESPACE;
ALTER TABLE test004.b_lease DISCARD TABLESPACE;
[root@tidb05 backup]# innobackupex --defaults-file=/etc/my.cnf  -ubackupuser -p123456 -S /tmp/mysql.sock  --databases=/tmp/data2.txt  --no-timestamp /data1/backup/db_3306_`date +%Y%m%d`
[root@tidb05 backup]# scp -rp db_3306_20210605 root@172.16.0.197:/data/backup/

root@tidb04 14:03:  [test004]> ALTER TABLE test002.t_customer_order_sn DISCARD TABLESPACE;
Query OK, 0 rows affected (0.02 sec)

root@tidb04 14:03:  [test004]> ALTER TABLE test004.b_lease DISCARD TABLESPACE;
Query OK, 0 rows affected (0.02 sec)
[root@tidb04 test002]# pwd
/data1/mysql/data/test002
[root@tidb04 test002]# ll
total 16
-rw-r----- 1 mysql mysql   67 Jun  5 14:03 db.opt
-rw-r----- 1 mysql mysql 9485 Jun  5 14:03 t_customer_order_sn.frm
[root@tidb04 test002]# cd /data1/mysql/data/test004/
[root@tidb04 test004]# ll
total 16
-rw-r----- 1 mysql mysql 10362 Jun  5 14:03 b_lease.frm
-rw-r----- 1 mysql mysql    67 Jun  5 14:03 db.opt

[root@tidb04 backup]# innobackupex --apply-log-only --export /data/backup/db_3306_20210605/

特殊说明:
--apply-log 和 --apply-log-only区别和作用:
参考地址:
https://mp.weixin.qq.com/s/yJ_zkGkSOLJglJa395OdQA

[root@tidb04 backup]# cd /data/backup/db_3306_20210605/test002/
[root@tidb04 test002]# cp *.cfg /data1/mysql/data/test002/
cp: cannot stat ‘*.cfg’: No such file or directory

[root@tidb04 test002]# ls
db.opt  t_customer_order_sn.frm  t_customer_order_sn.ibd
[root@tidb04 test004]# cd /data/backup/db_3306_20210605/test004/
[root@tidb04 test004]# ls
b_lease.frm  b_lease.ibd  db.opt
root@tidb04 test004]# cp *.ibd /data1/mysql/data/test004/

cd /data1/mysql/data/test002/
chown mysql.mysql *

cd /data1/mysql/data/test004/
chown mysql.mysql *
root@tidb04 14:06:  [test004]> ALTER TABLE test002.t_customer_order_sn IMPORT TABLESPACE;
root@tidb04 14:18:  [test004]> ALTER TABLE test004.b_lease IMPORT TABLESPACE;

[root@tidb04 db_3306_20210605]# cat /data/backup/db_3306_20210605/xtrabackup_binlog_info 
mysql-bin.000005    655

tidb05服务器上创建复制账户:rep

grant replication slave  ON *.* TO 'rep'@'172.16.0.197' identified by '123456';flush privileges;

tidb04服务器上配置多源复制tidb05:


mysql> CHANGE MASTER TO 
MASTER_HOST='172.16.0.246', 
MASTER_USER='rep', 
MASTER_PORT=3306, 
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000005',
MASTER_LOG_POS=655 FOR CHANNEL 'tidb05';

mysql> CHANGE REPLICATION FILTER REPLICATE_WILD_DO_TABLE=('test002.%','test004.%');

root@tidb04 14:25:  [test004]> CHANGE REPLICATION FILTER REPLICATE_WILD_DO_TABLE=('test002.%','test004.%');
ERROR 3017 (HY000): This operation cannot be performed with a running slave sql thread; run STOP SLAVE SQL_THREAD first

root@tidb04 14:25:  [test004]> stop slave sql_thread;
Query OK, 0 rows affected, 1 warning (0.00 sec)

root@tidb04 14:26:  [test004]> CHANGE REPLICATION FILTER REPLICATE_WILD_DO_TABLE=('test002.%','test004.%');
Query OK, 0 rows affected (0.00 sec)
mysql> START SLAVE FOR CHANNEL 'tidb05';
mysql> SHOW SLAVE STATUS FOR CHANNEL 'tidb05'\G;

到此处 tidb04复制tidb05配置完成:

[root@tidb04 ~]# mysql -e "SHOW SLAVE STATUS FOR CHANNEL 'tidb05'\G"|egrep -i 'Slave_IO_Running|Slave_SQL_Running|Replicate_Wild_Do_Table|Replicate_Wild_Ignore_Table|Channel_Name'
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
      Replicate_Wild_Do_Table: test002.%,test004.%
  Replicate_Wild_Ignore_Table: mysql.%
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
                 Channel_Name: tidb05

参考文档:
基于Xtrabackup及可传输表空间实现多源数据恢复
https://mp.weixin.qq.com/s/1Y18j1-c7QPhKBM2XLziFg

标签:test003,test001,多源,MySQL,Xtrabackup,tidb04,mysql,TABLE,root
来源: https://blog.51cto.com/wujianwei/2872324