MySQL Transportable Tablespace(传输表空间) 使用详解

将大的InnoD B表从一个实例, 移动或者复制到另一个实例,有很多的方法,在5.6之前常用的是通过物理或者逻辑备份来实现。
在5.6.6+的版本中, 用到了一种基于表空间迁移的快速方法,即类似Oracle TTS。
因为用到,故整理记录至此。


实验用到两台机器,单机单实例,MySQL 5.6.30。
并将通过vm1> mysql1> vm2> mysql2> 区分两台shell环境和mysql client环境。



〇 过程:

① 先在mysql1上创建测试数据:
  1. mysql> \R mysql1>
  2. PROMPT set to 'mysql1> '
  3. mysql1> USE test;
  4. Database changed
  5. mysql1> CREATE TABLE tts(id int PRIMARY KEY AUTO_INCREMENT, name char(128));
  6. Query OK, 0 rows affected (0.01 sec)

  7. mysql1> INSERT INTO tts(name) VALUES(REPEAT('a',128));
  8. Query OK, 1 row affected (0.00 sec)

  9. mysql1> INSERT INTO tts(name) SELECT name FROM tts;
  10. Query OK, 1 row affected (0.00 sec)
  11. Records: 1 Duplicates: 0 Warnings: 0

  12. mysql1> INSERT INTO tts(name) SELECT name FROM tts;
  13. Query OK, 2 rows affected (0.00 sec)
  14. Records: 2 Duplicates: 0 Warnings: 0

  15. ………………………………

  16. mysql1> INSERT INTO tts(name) SELECT name FROM tts;
  17. Query OK, 131072 rows affected (0.79 sec)
  18. Records: 131072 Duplicates: 0 Warnings: 0

  19. mysql1> INSERT INTO tts(name) SELECT name FROM tts;
  20. Query OK, 262144 rows affected (2.15 sec)
  21. Records: 262144 Duplicates: 0 Warnings: 0

  22. mysql1> \! du -sh /data/mysql/test/tts*
  23. 12K /data/mysql/test/tts.frm
  24. 92M /data/mysql/test/tts.ibd

② 再保证mysql2上有相同的库表结构,此处为新建,并将mysql2上新建的test.tts表discard掉ibd文件:
mysql> \R mysql2>
PROMPT set to 'mysql2> '
mysql2> USE test;
Database changed
mysql2> CREATE TABLE tts(id int PRIMARY KEY AUTO_INCREMENT, name char(128));
Query OK, 0 rows affected (0.01 sec)

mysql2> \! du -sh /data/mysql/test/tts*
12K /data/mysql/test/tts.frm
96K /data/mysql/test/tts.ibd
注意!该alter table ... discard tablespace操作会记录binlog并影响复制结构,慎用,或set sql_log_bin=0; mysql2> ALTER TABLE tts DISCARD TABLESPACE;
Query OK, 0 rows affected (0.01 sec)

mysql2> \! du -sh /data/mysql/test/tts*
12K /data/mysql/test/tts.frm

③ 对mysql1的test.tts表做FLUSH TABLES操作,此时会多了一个cfg文件:
mysql1> FLUSH TABLE tts FOR EXPORT;
Query OK, 0 rows affected (0.05 sec)

mysql1> \! du -sh /data/mysql/test/tts*
4.0K /data/mysql/test/tts.cfg
12K /data/mysql/test/tts.frm
92M /data/mysql/test/tts.ibd

④ 开多一个终端,在vm1上将ibd和cfg文件scp到vm2上:
vm1> scp /data/mysql/test/tts.{ibd,cfg} user@vm2:/data/mysql/test
user@vm2's password: 
tts.ibd 100%   92MB  46.0MB/s   00:02    
tts.cfg 100%  380     0.4KB/s   00:00  

⑤ 将mysql1的test.tts表做UNLOCK操作(此时可发现cfg文件已被删除):
mysql1> UNLOCK TABLES;
Query OK, 0 rows affected (0.00 sec)

mysql1> \! du -sh /data/mysql/test/tts*
12K /data/mysql/test/tts.frm
92M /data/mysql/test/tts.ibd

⑥ 在vm2上将传过来的ibd和cfg文件修改权限:
vm2> chown mysql:mysql /data/mysql/test/tts.{ibd,cfg}

⑦ 将上述ibd文件IMPORT到tts表中:
mysql2> ALTER TABLE tts IMPORT TABLESPACE;
Query OK, 0 rows affected (0.93 sec)

mysql2> SELECT count(*) FROM tts;
+----------+
| count(*) |
+----------+
| 524288   |
+----------+
1 row in set (0.94 sec)

至此,已经将mysql1实例上的tts表中数据快速地迁移到mysql2实例上了。


〇 上述几个步骤的解释:

操作②中的discard tablespace会在表上加上MDL锁,删除change buffer所有相关的缓存项,设置表元数据信息,标志tablespace为删除状态,重新生成表的id,保证基于表id的操作后续均会失败,再将idb文件干掉,在②中的两次du可以看到.idb文件已经被删除了。这是一个十分危险的操作,慎重;此操作也会被记录到binlog中,若在复制结构可能会有很大的影响,切记先临时关闭binlog。

操作③中的flush table ... for export会给test.tts表加上共享锁,并将purge coordinator thread(在并行复制中类似sql thread)停止,并且将脏页强制同步到磁盘,创建并将test.tts表的元数据写入.cfg文件;
FLUSH TABLES ... FOR EXPORT在error log中体现了这个过程:
[Note] InnoDB: Sync to disk of '"test"."tts"' started.
[Note] InnoDB: Stopping purge
[Note] InnoDB: Writing table metadata to './test/tts.cfg'
[Note] InnoDB: Table '"test"."tts"' flushed to disk

操作⑤执行unlock tables将③中的锁解除,此时.cfg文件被删掉,purge coordinator thread也会重新启动;(在做flush table ... for export时不能关闭session,避免锁释放造成.cfg文件删除)
UNLOCK TABLES在error log中记录为:
[Note] InnoDB: Deleting the meta-data file './test/tts.cfg'
[Note] InnoDB: Resuming purge

操作⑦则是通过import tablespace操作,将从vm1上传输过来的.ibd文件和导入到tts表中,此时.cfg文件也必须存在;
ALTER TABLE ... IMPORT TABLESPACE在error log中记录为:
[Note] InnoDB: Importing tablespace for table 'test/tts' that was exported from host 'vm01'
[Note] InnoDB: Phase I - Update all pages
[Note] InnoDB: Sync to disk
[Note] InnoDB: Sync to disk - done!
[Note] InnoDB: Phase III - Flush changes to disk
[Note] InnoDB: Phase IV - Flush complete
[Note] InnoDB: "test"."tts" autoinc value set to 786406
过程为读取cfg文件:表定义,索引定义,索引RootPage,列定义等等。再读取import文件每一个page,检查完整性,根据读取到的cfg文件,重新设置当前表的元数据信息。


总结一下整个过程就是:
create table $new_table ...
alter table $new_table discard tablespace;(删除新表的tablespace文件,保留frm文件)
flush table $old_table for export;(关闭该表,并且生成cfg文件)
拷贝ibd文件,已经对应的cfg文件。
unlock tables;
将ibd文件和cfg文件copy到新地址,修改好权限
alter table $new_table import tablespace;




〇 限制:
两个实例都必须开启独立表空间,innodb_file_per_table
迁移的两个实例的innodb_page_size必须一致,并且mysql server版本建议一致
不支持在分区表上执行discard tablespace
不支持在有主外键关系的表上执行discard tablespace,除非设置foregin_key_checks=0


〇 参考文档:
 MySQL 5.6 Reference Manual - 14.5.5 Copying Tablespaces to Another Server (Transportable Tablespaces)




作者微信公众号(持续更新)



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29773961/viewspace-2134065/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29773961/viewspace-2134065/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
适用于: Oracle Database Cloud Schema Service - 版本 N/A 和更高版本 Oracle Database Exadata Cloud Machine - 版本 N/A 和更高版本 Oracle Cloud Infrastructure - Database Service - 版本 N/A 和更高版本 Oracle Database Exadata Express Cloud Service - 版本 N/A 和更高版本 Oracle Database Backup Service - 版本 N/A 和更高版本 Linux x86-64 用途 注意: 考虑使用新release的版本V4的过程。 这个版本极大地简化了相关步骤。 请参考文档:V4 Reduce Transportable Tablespace Downtime using Cross Platform Incremental Backup Note 2471245.1 本文档覆盖了在 12c 及更高版本上,使用跨平台传输表空间(XTTS)以及 RMAN 增量备份,以最小的应用停机时间,在不 同 endian 格式的系统间迁移数据的步骤。 第一步是从源系统拷贝一份 full backup 到目标系统。之后,使用一系列的增量备份(每一份都比前一份要小),这样在停 机前可以做到目标系统的数据和源系统“几乎”一致。需要停机的步骤只有最终的增量备份及元数据导出/导入。 这个文档描述了在 12c 下使用跨平台增量备份的步骤,关于 11g 下的步骤,请您参考 Note:1389592.1。 跨平台增量备份特性并不能减少 XTTS 的其它步骤花费的时间,比如元数据导出/导入。因此,如果数据库内有很多元数据 (DDL),比如 Oracle E-Business Suite 和其它打包程序,那么跨平台增量备份特性并不能带来很多好处;对于这样的 环境,迁移花的大部分时间是花在处理元数据上,而不是数据文件的转换及传输。 只有被迁移表空间里物理存储的数据库对象才会被拷贝至目标系统;如果要迁移存储在其它表空间的其它类型的对象 (比如存储在 SYSTEM 表空间内的 pl/sql 对象,sequences 等),你可以使用数据泵来拷贝这些对象至目标系统。 注意: 考虑使用新release的版本V4的过程。 这个版本极大地简化了相关步骤。 请参考文档:V4 Reduce Transportable Tablespace Downtime using Cross Platform Incremental Backup Note 2471245.1 跨平台增量备份的主要步骤有: 1. 初始化设置 2. 准备阶段(源库数据仍然在线) 1. 备份要传输表空间(0级备份) 2020/1/5 Document 2102859.1 https://myaccess.oraclevpn.com/+CSCO+1075676763663A2F2F7A6266727A632E68662E62656E7079722E70627A++/epmos/faces/Document… 3/14 2. 把备份及其它必须的文件发送到目标系统 3. 在目标系统恢复数据文件至目标端的 endian 格式 3. 前滚阶段(源库数据仍然在线 – 要重复这个阶段足够多次,使得目标数据文件拷贝和源库越相近越好) 1. 在源库创建增量备份 2. 把增量备份及其它必须的文件发送到目标系统 3. 把增量备份转换成目标系统的 endian 格式并且把增量备份应用至目标数据文件 4. 为下次增量备份确定 next_scn 5. 重复这些步骤直到已经准备好了操作传输表空间 NOTE: 在版本3,如果一个数据文件被加入到一个表空间或者一个新的表空间名字被加入到xtt.properties文件,会出现 一个Warning并且需要额外的处置 1. 传输阶段(此时源库数据需要置于 READ ONLY 模式) 1. 在源库端把表空间置为 READ ONLY 2. 最后一次执行前滚阶段的步骤 这个步骤会让目标系统的数据文件拷贝和源库数据文件完全一致并且产生必要导出文件。 在数据量非常大的情况下,这个步骤所花费的时间要显著的少于传统的 XTTS 方式,因为增量备份会很 小。 3. 使用数据泵把这个表空间的元数据导入至目标数据库 4. 把目标数据库的相关表空间置为 READ WRITE

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值