mysql表空间迁移
有如下原因你可能需要将innodb表复制到不同的数据库服务器上。
不增加生产负载的情况下生成 一个报表
在一个新的服务器上建立一个和生产上数据相同的表
做一个备份在发生问题或错误操作时用于恢复
快速将数据从一个服务器迁移到另一个服务器
命令flush tables ... forexport 使.ibd文件保持一致的状态。只有文件处于一致的状态我们才可以复制它。这个文件也会同时创建一个扩展名.cfg的二进制的文件。命令alter table ...import tablespace 会使用这个二进制文件对导入过程进行校验。
对于 mysql 5.6.8版本, alter table ...import tablespace 命令不再一定需要一个扩展名为.cfg二进制文件了。但如果真的没有这个文件我们会收到下面这样一个警告。
message:innodb: io read error: (2, no such file or directory) error opening './
test/t.cfg',will attempt to import without schema verification
1row in set (0.00 sec)
这个特性有时候还是很有用的。比如,在模式不匹配的导入过程中,或者在一些需要恢复的情景下,元数据又不能从.ibd文件获得,则这个命令不需要一个扩展名为.cfg的二进制文件就可以导入的特性就很有用。
可迁移表空间的限制:
innodb_file_per_table 一定要打开成 on. 在共享表空间上的表不能使用这个特性。
当表处理静默状态时,只有只读语句可以使用这张表。
当导入表空间时,目的库的页尺寸要和源库的页尺寸相匹配。
discard tablespace 不支持分区表。如果你在分区表上使用命令 alter table ... discard tablespace 你会看到如下错误: error 1031 (hy000): 表引擎没有这个选项。
discard tablespace 命令不支持有父子关系的表。如果 foreign_key_checks 被设置成1. 在使用命令之前我们可以将这一参数设置为0. foreign_key_checks=0.
alter table ... import tablespace 命令在导入表时不会检查主外键关系。
如果是实时复制的时候, innodb_file_per_table 必需在主服务和从服务上设置为on。
下面来看一个实例:
在源服务器上我们来对city表进行迁移:
1. mysql> use test;c:/c:/programdata/mysql/mysqlserver 5.6/data/world2. c:/programdata/mysql/mysqlserver 5.6/data/world>dir3. volume in drive c has no label.4. volume serial number is d0fa-f7a05. directory of c:/programdata/mysql/mysql server5.6/data/world6. 10/08/2013 03:15 pm .7. 10/08/2013 03:15 pm ..8. 10/08/2013 03:15 pm 8,710 city.frm9. 10/08/2013 03:15 pm 273,293 city.myd10.10/08/2013 03:15 pm 43,008 city.myi11.10/08/2013 03:15 pm 9,172 country.frm12.10/08/2013 03:15 pm 0 country.myd13.10/08/2013 03:15 pm 5,120 country.myi14.10/08/2013 03:15 pm 8,702 countrylanguage.frm15.10/08/2013 03:15 pm 38,376 countrylanguage.myd16.10/08/2013 03:15 pm 18,432 countrylanguage.myi17.10/08/2013 03:15 pm 61 db.opt18. 10file(s) 404,874 bytes19. 2 dir(s) 224,709,537,792 bytes free20.mysql> use world21.database changed22.mysql> show tables;23.+-----------------+24.| tables_in_world |25.+-----------------+26.| city |27.| country |28.| countrylanguage |29.+-----------------+30.3 rows in set (0.00 sec)31.mysql> flush table cityfor export;32.error 1031 (hy000): table storage engine for 'city' doesn't havethis option33.mysql> alter table cityengine=innodb;34.mysql> flush table cityfor export; --对表加锁。35.query ok, 0 rows affected (0.18 sec)36.
复制表文件到目标位置
c:/programdata/mysql/mysql server 5.6/data/world>mkdir city
c:/programdata/mysql/mysql server 5.6/data/world>copy city.* city
city.cfg
city.frm
city.ibd
3 file(s) copied.
c:/programdata/mysql/mysql server 5.6/data/world>cd city
c:/programdata/mysql/mysql server 5.6/data/world/city>dir
volume in drive c has no label.
volume serial number is d0fa-f7a0
directory of c:/programdata/mysql/mysql server 5.6/data/world/city
10/10/2013 10:58 am .
10/10/2013 10:58 am ..
10/10/2013 10:53 am 582 city.cfg
10/10/2013 10:53 am 8,710 city.frm
10/10/2013 10:53 am 475,136 city.ibd
3 file(s) 484,428 bytes
2 dir(s) 224,676,024,320 bytes free
在目标库上删除可能存在的同名表空间。
mysql> unlock tables;--释放锁。2. query ok, 0 rowsaffected (0.07 sec)3. mysql> alter table city discard tablespace;删除可能存在的同名表空间4. query ok, 0 rowsaffected (0.23 sec)5. mysql> selectcount(*) from city;6. error 1814 (hy000):tablespace has been discarded for table 'city'7. mysql> alter tablecity import tablespace;8. error 1146 (42s02):table 'world.city' doesn't exist9. c:/programdata/mysql/mysqlserver 5.6/data/world/city>copy city.* ..10.city.cfg11.city.frm12.overwrite ../city.frm? (yes/no/all): yes13.access is denied.14.city.ibd15. 2 file(s) copied.16.c:/programdata/mysql/mysql server 5.6/data/world/city>17.mysql> alter table city import tablespace;18.query ok, 0 rows affected (0.94 sec)19.mysql> select count(*) from city;20.+----------+21.| count(*) |22.+----------+23.| 4079 |24.+----------+25.1 row in set (0.08 sec)
表空间被成功。
bitscn.com
