MySQL大表快速迁移复制(表空间迁移)

2019-11-21  本文已影响0人  大龄挨踢男

MySQL(5.6.6及以上)支持表空间传输:表空间传输可以很方便的将一个表或者多个表,从一个数据库实例导入到另一个数据库实例.
在数据恢复和数据迁移的时候,非常有用,尤其是数据量很大的表。相对于mysqldump,表空间传输的方式更快,更灵活。

MariaDB [db_pub]> show variables like '%innodb_file_per_table%';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
1 row in set (0.00 sec)

使用表空间传输有两种方式

1、MySQL原生命令

show create table image_info_del \G;
CREATE TABLE `image_info_del` ( ……) ENGINE=InnoDB DEFAULT CHARSET=utf8;
alter table test.image_info_del discard tablespace;
flush table db_pub.image_info_del for export;

可以看到,执行命令之后,innodb_buffer_pool中的脏页刷新到了磁盘。并产生了一个 cfg文件.在命令执行之后,该表只能只读访问.

cp image_info_del.{cfg,ibd} test/
unlock tables;
alter table test.image_info_del import tablespace;

2、使用innobackupex,协助表空间传输

原生的方式适合小范围导出,比如一两个表.
如果导出的表很多,可以用innobackupex进行辅助,并且innobackupex没有锁,不影响线上的业务.

innobackupex -u root -p xxx --defaults-file=/home/mysql/mysql-5.6.14/my.cnf  --include='test.stat*' /backup_data

或者使用 tables-file的方式

innobackupex --user=root --password=xxx --defaults-file=/home/mysql/mysql-5.6.14/my.cnf --tables-file=/tmp/table_name_list.txt /backup_data

再或者(--databases=参数也可以直接命令行指定库或表名,例如:--databases="test.order_log")

innobackupex --user=root --password=xxx --defaults-file=/home/mysql/mysql-5.6.14/my.cnf --databases=/tmp/table_name_list.txt /backup_data
alter table 表名 import tablespace;
上一篇 下一篇

猜你喜欢

热点阅读