MYSQL 表对表快速迁移-直接拷贝表空间文件.ibd进行迁移
数据无价,操作前,建议先备份
前提条件
-
表结构一致:
- 源数据库和目标数据库中的表结构必须完全相同。这包括表的列定义、索引、约束等。
-
表使用 InnoDB 存储引擎:
- 这种迁移方法仅适用于使用 InnoDB 存储引擎的表,因为
.ibd
文件是 InnoDB 表的表空间文件。
- 这种迁移方法仅适用于使用 InnoDB 存储引擎的表,因为
-
数据库版本兼容:
- 源数据库和目标数据库的 MySQL 或 MariaDB 版本应该兼容。理想情况下,两个数据库的版本应该相同或非常接近,以避免潜在的兼容性问题。
-
表未被使用:
- 在执行
FLUSH TABLES ... FOR EXPORT
和DISCARD TABLESPACE
操作时,确保表未被其他事务或会话使用。
- 在执行
-
文件系统权限:
- 确保你有足够的文件系统权限来复制和修改
.ibd
和.cfg
文件。通常,这需要 root 权限或数据库服务用户(如mysql
用户)的权限。
- 确保你有足够的文件系统权限来复制和修改
-
数据库服务用户权限:
- 确保数据库服务用户(如
mysql
用户)对目标数据库目录具有读写权限。
- 确保数据库服务用户(如
-
关闭外键检查:
- 如果表中有外键约束,可能需要在导入表空间之前临时禁用外键检查。
注意事项
-
备份数据:
- 在进行任何操作之前,务必备份源数据库和目标数据库的数据,以防止数据丢失。
-
一致性检查:
- 在导入表空间后,检查表的数据一致性和完整性,确保数据没有损坏。
-
表定义文件:
- 确保在导出表空间时生成了表定义文件(
.cfg
文件),并在导入时一并复制到目标数据库。
- 确保在导出表空间时生成了表定义文件(
-
数据库日志:
- 在操作过程中,检查数据库日志文件以获取更多信息和错误提示。
-
禁用外键检查(如果有外键):
- 在导入表空间之前,可以临时禁用外键检查,以避免外键约束问题。
SET foreign_key_checks = 0; ALTER TABLE table_name IMPORT TABLESPACE; SET foreign_key_checks = 1;
迁移步骤
-
在源数据库中:
-- 在源数据库中执行 FLUSH TABLES table_name FOR EXPORT 命令。这将确保表的所有更改都已写入磁盘,并生成一个表定义文件(.cfg 文件) FLUSH TABLES table_name FOR EXPORT;
-
复制文件:
-- 复制表的表空间文件(.ibd 文件)和表定义文件(.cfg 文件)到目标数据库服务器 -- 如果没有账号密码的情况下,可以借助nginx+wget进行传输文件 scp /path/to/mysql/data/database_name/table_name.ibd user@target_server:/path/to/target/mysql/data/database_name/ scp /path/to/mysql/data/database_name/table_name.cfg user@target_server:/path/to/target/mysql/data/database_name/
-
在目标数据库中:
-- 在目标数据库中创建一个与源表结构相同的表。直接使用源数据库表结构导出后,再目标数据库创建表 CREATE TABLE table_name (...); -- 执行 ALTER TABLE table_name DISCARD TABLESPACE 命令。这将删除目标表的现有表空间文件。 ALTER TABLE table_name DISCARD TABLESPACE;
-
复制文件到目标数据库目录:
-- 将源数据库中的表空间文件(.ibd 文件)和表定义文件(.cfg 文件)复制到目标数据库的表空间目录中 cp /path/to/source/table_name.ibd /path/to/target/mysql/data/database_name/ cp /path/to/source/table_name.cfg /path/to/target/mysql/data/database_name/ -- 根据目标数据库文件的权限进行对应的权限修改 chown -R polkitd:input /path/to/target/mysql/data/database_name/table_name.ibd chown mysql:mysql /path/to/target/mysql/data/database_name/table_name.ibd chown mysql:mysql /path/to/target/mysql/data/database_name/table_name.cfg
-
在目标数据库中导入表空间:
-- 执行 ALTER TABLE table_name IMPORT TABLESPACE 命令。这将导入表空间文件到目标表中。 ALTER TABLE table_name IMPORT TABLESPACE;
-
检查:
- 结束后,检查源数据库表和目标表数据是否一致 可使用查询语句count(*)或者其他比对方式
- 删除源数据库和目标数据库的cfg文件
后记
- docker 部署的mysql 可以使用
docker inspect 容器id
查询容器信息,找到docker的位置
惜秦皇汉武,略输文采;唐宗宋祖,稍逊风骚。
一代天骄,成吉思汗,只识弯弓射大雕。
俱往矣,数风流人物,还看今朝