使用MySQL传输表空间迁移数据

前端之家收集整理的这篇文章主要介绍了使用MySQL传输表空间迁移数据前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

对于大表的迁移,如果使用MysqLdump进行导出,然后重新导入到其它环境,速度是非常缓慢的。如果使用传输表空间,则可以解决这个问题。

 

测试使用传输表空间迁移表,基础环境如下:

  源库 目标库
IP地址 192.168.10.11 192.168.10.12
数据库版本 5.7.24 5.7.24
数据库名称 db1 db2
待迁移的表 test01  

 

(1)在目标库创建和源库相同的表test01

先在主库db1上查看表信息,并生成创建表的语句

MysqL> select count(*) from test01;
+----------+
| *) |
|    10000 --------+
1 row in set (0.00 sec)

MysqL> show create table------+--------------------------------------------------------+
| Table  Create Table                                          ------+-------------------------------------------------------+
| test01 CREATE TABLE `test01` (
  `id1` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(30) DEFAULT ,PRIMARY KEY (`id1`)
) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=utf8 ------+-----------------------------------------------------+
0.00 sec)

在目标数据库db2上创建表test01

`test01` ( -> `id1` -> `name` -> (`id1`) -> ) ENGINE=utf8 ; Query OK,0 rows affected (0.00 sec)

 

(2)目标数据库db2上丢弃表空间

在丢弃表空间后,test01表的ibd文件会被删除

[root@slavedb db2]# pwd
/MysqL/data/db2
# ls
db.opt  test01.frm  test01.ibd


MysqLalter  test01 discard tablespace;
Query OK,1)">0.01 sec)


# ls
db.opt  test01.frm

此时,test01表还在db2中,但是已经无法访问

> show tables; -------------+ | Tables_in_db2 | test01 -------------+ select * test01; ERROR 1814 (HY000): Tablespace has been discarded for table 'test01'


(3)导出源库db1上的test01表

先对表db1.test01加上读锁,此时,db1.test01可读,但是不可写

> flush table test01 for export; Query OK,1)">0.00 sec)

执行完export后,会生成一个test01.cfg文件

[root@masterdb db1]# pwd
/MysqL/data/db1
[root@masterdb db1]# ls -l
total 18472
-rw-r----- 1 MysqL MysqL      61 Feb 11 14:28 db.opt
-rw-r----- 1 MysqL MysqL     388 Feb 15:06 test01.cfg
-rw-r----- 1 MysqL MysqL    8588 Feb 29 test01.frm
-rw-r----- 1 MysqL MysqL 9437184 Feb  test01.ibd

将test01.ibd和test01.cfg文件拷贝到目标数据库db2的数据文件路径下

scp test01.cfg test01.ibd root@192.168.10.12:/MysqL/data/db2/ root@10.12's password: test01.cfg 100% 388 324.4KB/s 00:00 test01.ibd 100% 9216KB 59.6MB/s 00

传输结束后,释放test01表的读锁

unlock tables; Query OK,1)">0.00 sec)

 

(4)修改目标数据库db2的test01.ibd和test01.cfg文件权限

[root@slavedb db2]# chown MysqL:MysqL test01.ibd test01.cfg 
[root@slavedb db2]# 9236
-rw-r----- 3010 test01.cfg
-rw-r----- 5810 test01.ibd

 

(5)在db2上加载test01表

MysqL> alter table test01 import tablespace;
Query OK,1)">0 rows affected (0.02 sec)

MysqL> select count(*) from test01;
+----------+
| count(*) |
+----------+
|    10000 |
+----------+
1 row in set (0.00 sec)

可以看到,test01表数据已经正常传输过来。

 

【完】

猜你在找的MySQL相关文章