mysql也有传输表空间,跟oracle功能也一样,就是讲表空间从一个数据库拷贝到另一个库。
这个功能有如下的限制
- innodb_file_per_table要设置on
- 当表quiesced的时候,在受影响的表上只能做只读操作
- 当导入表空间的时候,page大小要一致
- discard表空间不被分区表支持,也就是分区表也不支持传输表空间。
- alter table…import tablespace 不强制外键约束,所以表上有外键约束的时候,需要同时导出表
- 在主外键的情况下,当foreign_key_checks设置成了1,discard tablespace是不被支持的,,所以要设置成0
- alter tablle import tbalespace 不需要cfg的元数据文件
- 在复制场景下innodb_file_per_table需要设置成on
最好设置lower_case_table_names=1来设置表的大小写
步骤在源,目标上创建相同的表
在目标表上,需要discard表空间mysql> ALTER TABLE t DISCARD TABLESPACE;
在源数据库上,执行FLUSH TABLES t FOR EXPORT;cfg文件也被创建
- 拷贝.ibd和.cfg元数据文件到目标库上
-
- 在源库上unlock表UNLOCK TABLES;
- 在目标库上导入表空间mysql> ALTER TABLE t IMPORT TABLESPACE;
import tablepsace这个步骤很耗时间,我原以为只是更细下元数据信息,没想到80g的文件,执行了40分钟
当alter table …discard tablespace被执行的时候,数据库内部做了下面的操作
1 表被加x锁
2表空间跟表分离
当flush table ..for export运行的时候,数据库内部做了下面的操作
1表在共享锁下刷洗来导出
2purge 调度线程被停止
3脏页被同步到磁盘上
4元数据信息写到cfg文件上
当unlock tables在运行的时候,数据库执行了下面操作
1cfg文件被删除
2表上的共享锁被释放,purge调度线程重新启动
alter table ..import tablespace运行时,数据库执行下面的操作
Each tablespace page is checked for corruption.
The space ID and log sequence numbers (LSNs) on each page are updated
Flags are validated and LSN updated for the header page.
Btree pages are updated.
The page state is set to dirty so that it will be written to disk.
在做测试的时候遇到了下面的问题,在导入表空间的时候提示
ERROR 1932 (42S02): Table ‘test.baixyu’ doesn’t exist in engine
原因是拷贝过去的文件的属主错误的,修改成mysql后,再次导入正常