首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > Mysql >

MYSQL表空间迁徙

2013-10-16 
MYSQL表空间迁移。表空间迁移。有如下原因你可能需要将InnoDB表复制到不同的数据库服务器上。不增加生产负载

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\world

      2. C:\ProgramData\MySQL\MySQLServer 5.6\data\world>dir

      3.  Volume in drive C has no label.

      4.  Volume Serial Number is D0FA-F7A0

      5.  Directory of C:\ProgramData\MySQL\MySQL Server5.6\data\world

      6. 10/08/2013 03:15 PM   <DIR>          .

      7. 10/08/2013 03:15 PM   <DIR>          ..

      8. 10/08/2013  03:15 PM             8,710 city.frm

      9. 10/08/2013  03:15 PM           273,293 city.MYD

      10.10/08/2013 03:15 PM            43,008 city.MYI

      11.10/08/2013 03:15 PM             9,172 country.frm

      12.10/08/2013 03:15 PM                 0 country.MYD

      13.10/08/2013 03:15 PM             5,120 country.MYI

      14.10/08/2013 03:15 PM             8,702 countrylanguage.frm

      15.10/08/2013 03:15 PM            38,376 countrylanguage.MYD

      16.10/08/2013 03:15 PM            18,432 countrylanguage.MYI

      17.10/08/2013 03:15 PM                61 db.opt

      18.             10File(s)        404,874 bytes

      19.              2 Dir(s)  224,709,537,792 bytes free

      20.mysql> use world

      21.Database changed

      22.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 option

      33.mysql> alter table cityengine=innodb;

      34.mysql> flush table cityfor export; --对表加锁。

      35.Query OK, 0 rows affected (0.18 sec)

      36. 

       

       

      复制表文件到目标位置

      1. C:\ProgramData\MySQL\MySQL     Server 5.6\data\world>mkdir city
      2. C:\ProgramData\MySQL\MySQL     Server 5.6\data\world>copy city.* city
      3. city.cfg
      4. city.frm
      5. city.ibd
      6.         3 file(s) copied.
      7. C:\ProgramData\MySQL\MySQL     Server 5.6\data\world>cd city
      8. C:\ProgramData\MySQL\MySQL     Server 5.6\data\world\city>dir
      9.  Volume in drive C has no label.
      10.  Volume Serial Number is D0FA-F7A0
      11.  Directory of C:\ProgramData\MySQL\MySQL     Server 5.6\data\world\city
      12. 10/10/2013  10:58 AM    <DIR>          .
      13. 10/10/2013  10:58 AM    <DIR>          ..
      14. 10/10/2013  10:53 AM               582 city.cfg
      15. 10/10/2013  10:53 AM             8,710 city.frm
      16. 10/10/2013  10:53 AM           475,136 city.ibd
      17.                3 File(s)        484,428 bytes
      18.                2 Dir(s)  224,676,024,320 bytes free
      19.  

       

      在目标库上删除可能存在的同名表空间。

      1. 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 exist

      9. C:\ProgramData\MySQL\MySQLServer 5.6\data\world\city>copy city.* ..

      10.city.cfg

      11.city.frm

      12.Overwrite ..\city.frm? (Yes/No/All): yes

      13.Access is denied.

      14.city.ibd

      15.       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)

      表空间被成功。

热点排行