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)

表空间被成功。

### MySQL迁移的方法或教程 在MySQL中,表迁移是一个常见的需求,无论是单表迁移还是整个数据库的迁移,都有多种方法和工具可以实现。以下是几种常见且有效的MySQL迁移方案: #### 1. 使用Navicat进行MySQL迁移 Navicat是一款功能强大的数据库管理工具,支持通过图形化界面完成MySQL表的迁移操作。具体步骤包括迁出(备份)和迁入(恢复)。迁出时可以选择导出表结构和数据,迁入时则将备份文件导入目标数据库[^1]。 ```sql -- 导出表结构和数据(使用Navicat) SELECT * INTO OUTFILE '/path/to/file.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM your_table; ``` #### 2. 使用mysqldump命令行工具 `mysqldump`是MySQL自带的备份工具,可以用来导出表结构和数据。它支持多种选项,例如只导出表结构、只导出数据等。以下是常用的命令示例: ```bash # 导出表结构和数据 mysqldump -u username -p database_name table_name > table_backup.sql # 导入表结构和数据 mysql -u username -p database_name < table_backup.sql ``` 这种方法适合小型到中型的表迁移任务,但对于大规模数据可能需要考虑其他优化方案[^2]。 #### 3. 使用MySQL官方工具(MySQL Workbench 和 MySQL Shell) MySQL官方提供了多种工具来简化迁移过程。例如,MySQL Workbench内置了数据迁移向导,可以轻松地从一个数据库迁移到另一个数据库。此外,MySQL Shell也支持通过脚本化的方式完成复杂的数据迁移任务[^2]。 #### 4. 历史数据归档与大表拆分 对于超大数据量的表(如亿级数据),直接迁移可能会导致性能问题。此时可以采用历史数据归档的方式,将冷数据迁移到独立的历史表中,从而减少主表的数据量。以下是一个基于Java后端的归档实现示例[^4]: ```java @RestController @RequestMapping("/backDoor") public class CleanHistoryDataController { @Autowired private ICleanHistoryDataService cleanHistoryDataService; /** * 把指定过期时间的订单表数据迁移到历史表中 */ @PostMapping("/cleanByTableNameAndEndTime") public Resp<String> cleanByTableNameAndEndTime(@RequestBody CleanTableReq cleanTableReq) { try { CleanTableBo cleanTableBo = ObjectUtils.mapValue(cleanTableReq, CleanTableBo.class); cleanHistoryDataService.cleanByTableNameAndEndTime(cleanTableBo); } catch (Exception e) { log.error(cleanTableReq.getTableName() + " 数据迁移异常", e); } return Resp.success("success"); } } ``` #### 5. 双写迁移方案 双写迁移是一种适用于业务连续性的迁移方式。在这种方案中,源数据库和目标数据库同时写入数据,直到所有数据同步完成后再切换流量。这种方式的优点是可以随时回滚,缺点是需要额外的存储空间和写入开销[^3]。 --- ### 总结 以上介绍了几种常见的MySQL迁移方法,包括使用Navicat、mysqldump、MySQL官方工具、历史数据归档以及双写迁移方案。选择具体方法时,应根据数据规模、业务需求和迁移场景进行综合考虑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值