聊到MySQL数据迁移的话题,表空间传输时一个很实用的方法。
在MySQL 5.6 Oracle引入了一个可移动表空间的特征(复制的表空间到另一个服务器)和Percona Server采用部分备份,这意味着你现在可以备份单个数据库或表;由于Percona Server 5.6的出现,innodb_import_table_from_xtrabackup是过时的Percona Server实现Oracle MySQL的可移动表空间的功能,就是在服务器之间复制的表空间的能力(table.ibd)。让我展示通过一个例子,我将采取选择性表部分备份而不是一个完整的MySQL服务器并且在线恢复它,而不需要关闭MySQL服务器
下面演示怎么从3307实例迁移一个表空间到3308实例:
3307 实例的表结构
root@localhost:mysql3307.sock [sbtest]>show create table sbtest1; +---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | Table | Create Table | +---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | sbtest1 | CREATE TABLE `sbtest1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `k` int(11) NOT NULL DEFAULT '0', `c` char(120) NOT NULL DEFAULT '', `pad` char(60) NOT NULL DEFAULT '', PRIMARY KEY (`id`), KEY `k_1` (`k`) ) ENGINE=InnoDB AUTO_INCREMENT=100001 DEFAULT CHARSET=utf8 | +---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 1 row in set (0.00 sec)
把以上表结构在3308 实例创建 ,这里忽略
在3308实例上discard 表空间
root@localhost:mysql3308.sock [sbtest]>alter table sbtest1 discard tablespace; Query OK, 0 rows affected (0.16 sec)
在3307实例上导出表空间
root@localhost:mysql3307.sock [sbtest]>flush table sbtest1 for export;
可以看到,执行命令之后,innodb_buffer_pool中的脏页刷新到了磁盘。并产生了一个 cfg文件.
在命令执行之后,该表只能只读访问.
开启另外一个终端,将该表的ibd文件,cfg文件,TRG文件(记录触发器信息)拷贝到目标实例的数据库中
然后源实例执行 unlock tables;
最后在目标端import
root@localhost:mysql3308.sock [sbtest]>alter table sbtest1 import tablespace;