MySQL表空间迁移主要用于跨实例或跨服务器移动InnoDB独立表空间(.ibd文件),适用于需要高效转移大表数据的场景。该方法要求源和目标环境使用相同的字符集、页大小,并且目标表不存在数据。以下是具体操作步骤。
1. 准备阶段:导出表空间元数据
在源数据库中,需要先将目标表设置为只读并生成表空间元数据文件:
执行FLUSH TABLES tbl_name FOR EXPORT;,这会刷新表缓存并生成.cfg元数据文件(包含表结构和加密信息)。 此时会在数据目录下生成tbl_name.cfg和tbl_name.ibd两个文件。 保持会话不中断,直到文件复制完成,否则元数据会被清除。2. 文件复制:传输到目标服务器
将生成的.ibd和.cfg文件安全复制到目标数据库对应的数据目录:
确保目标表已经存在,且结构与源表完全一致(可通过SHOW CREATE TABLE比对)。 使用等工具复制文件,例如:scp tbl_name.* user@target:/var/lib/mysql/db_name/ 复制后需调整文件权限:chown mysql:mysql tbl_name.*
3. 导入阶段:加载表空间
在目标数据库中导入表空间:
先确认目标表没有被使用,然后执行:ALTER TABLE tbl_name DISCARD TABLESPACE;
此操作会删除当前的.ibd文件。 再执行导入:
ALTER TABLE tbl_name IMPORT TABLESPACE;
MySQL会验证.cfg文件并加载新的.ibd文件。 如果提示权限或加密错误,检查文件权限、innodb_force_recovery设置或加密插件配置。
4. 验证与清理
完成导入后进行验证:
查询表数据:释放FOR EXPORT锁。基本上就这些。整个过程不涉及SQL导出导入,速度快,适合大表迁移。但要注意版本兼容性和文件一致性,避免因结构差异导致导入失败。
