一、演示内容
采用表空间传输的方式 MySQL单实例下的某个库的所有的表快速cp到该实例的另外一个库下
二、演示环境
阿里云ECS 8C32g 100GSSD centos7.6 x86_64
MySQL的版本是5.7.32 二进制文件安装
前提:MySQL采用的引擎都是innodb 而且MySQL开启了 innodb_file_per_table = 1 独立表空间文件参数
MySQL服务器上 需要安装 mysql-utilities。 yum -y install mysql-utilities 使用 mysqlfrm 从 .frm 文件里面找回建表语句。
三、演示过程
test001测试库一共的5张表数量如下,而且都是INNODB表引擎:
root@tidb06 21:31: [test001]> show tables;
+----------------------------+
| Tables_in_test001 |
+----------------------------+
| b_lease |
| b_lease_sku |
| t_customer_order_sn |
| t_customer_pool |
| t_renting_stat_customer_sn |
+----------------------------+
5 rows in set (0.00 sec)
获取到5张建表表结构sql语句:
[root@tidb06 test001]# for n in `ls -l /data1/mysql/data/test001/*.frm|awk -F '/' '{print $NF}'|xargs -n 5`;do mysqlfrm --diagnostic $n|grep -v "^#" >>/tmp/create.sql;done
[root@tidb06 test001]#
把生产的建表语句导入到MySQL实例test002库中:
[root@tidb06 test001]# mysql test002 < /tmp/create.sql
[root@tidb06 test001]# mysql -e "use test002;show tables;"
+----------------------------+
| Tables_in_test002 |
+----------------------------+
| b_lease |
| b_lease_sku |
| t_customer_order_sn |
| t_customer_pool |
| t_renting_stat_customer_sn |
+----------------------------+
将test002库的没有包括数据的 .ibd 文件去掉,然后再导入test001库下的.idb文件: 实质如下: 禁用掉test002库下的空表的表空间.(物理上就是删除磁盘上test002目录下的.ibd数据文件)
[root@tidb06 test001]# mysql -e "show tables from test002;"|grep -v Tables_in_test002| while read a; do mysql -e "ALTER TABLE test002.$a DISCARD TABLESPACE";done
[root@tidb06 test001]#
[root@tidb06 test001]# ll ../test002/
total 72
-rw-r----- 1 mysql mysql 14458 May 20 21:49 b_lease.frm
-rw-r----- 1 mysql mysql 9523 May 20 21:49 b_lease_sku.frm
-rw-r----- 1 mysql mysql 67 May 20 12:00 db.opt
-rw-r----- 1 mysql mysql 9485 May 20 21:49 t_customer_order_sn.frm
-rw-r----- 1 mysql mysql 13492 May 20 21:49 t_customer_pool.frm
-rw-r----- 1 mysql mysql 9258 May 20 21:49 t_renting_stat_customer_sn.frm
******cp test001目录的.idb文件到test002下:******
[root@tidb06 test001]# cp /data1/mysql/data/test001/*.ibd /data1/mysql/data/test002/
******授权/data1/mysql/data/test002/*.ibd 文件为MySQL用户:******
[root@tidb06 test001]# chown -R mysql.mysql /data1/mysql/data/test002/*.ibd
[root@tidb06 test001]# ll /data1/mysql/data/test002/*.ibd
-rw-r----- 1 mysql mysql 67108864 May 20 21:55 /data1/mysql/data/test002/b_lease.ibd
-rw-r----- 1 mysql mysql 83886080 May 20 21:55 /data1/mysql/data/test002/b_lease_sku.ibd
-rw-r----- 1 mysql mysql 83886080 May 20 21:55 /data1/mysql/data/test002/t_customer_order_sn.ibd
-rw-r----- 1 mysql mysql 22020096 May 20 21:55 /data1/mysql/data/test002/t_customer_pool.ibd
-rw-r----- 1 mysql mysql 767557632 May 20 21:55 /data1/mysql/data/test002/t_renting_stat_customer_sn.ibd
******导入每个表的表空间到test002库下:******
[root@tidb06 test001]# mysql -e "show tables from test002"|grep -v Tables_in_test002|while read a; do mysql -e "ALTER TABLE test002.$a import TABLESPACE";done
[root@tidb06 test001]#
四、结果验证
检测test002库下的表是否都成功:
[root@tidb06 data]# pwd
/data1/mysql/data
[root@tidb06 data]# mysqlcheck -c test002
test002.b_lease OK
test002.b_lease_sku OK
test002.t_customer_order_sn OK
test002.t_customer_pool OK
test002.t_renting_stat_customer_sn OK
表数据和表结构比较敏感,此处不粘贴了演示了。 验证结果: 比较了test001库和test002库下的表数据以及建表sql,是完全一致的。 到此时,单实例下快速cp一个库演示完成。此方式还是非常快和靠谱的