数据无价,操作前,建议先备份
前提条件
表结构一致:
源数据库和目标数据库中的表结构必须完全相同。这包括表的列定义、索引、约束等。
表使用 InnoDB 存储引擎:
这种迁移方法仅适用于使用 InnoDB 存储引擎的表,因为 .ibd 文件是 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;
操作步骤如下:
1.新建一个与原表结构相同的表,如果不记得的话,也可通过ibd文件查询表结构,方法如下:
先进入存放ibd文件的位置, 输入指令ibd2sdi --dump-file name.txt name.ibd
查看解析后的txt文件,可以看到8.0版本的mysql把表结构、索引全部都放到了表数据文件ibd文件中了(然后你就可以在数据库中创建结构相同的表了)
2.移除表空间
alter table table_name DISCARD TABLESPACE
3.关闭mysql服务,将备份的ibd文件,放到mysql->data->创建的数据库名称->,将ibd拷贝到此目录下,可通过以下方式查询
- 使用sql查询数据目录
show global variables like '%datadir%';
4.启动mysql服务,重新导入表空间
alter table table_name IMPORT TABLESPACE
5.注意点:
数据表的结构一定要和恢复前的数据表结构一致
原ibd文件时的数据库版本要和当前数据库版本一致(如8.0.11和8.0.23版本不同会导致复原失败)
6.小技巧批量操作:
首先通过navicat 执行show tables; 然后复制所有表名粘贴到linux中的一个文本中
执行下面的命令,将会生成执行移除所有表空间的语句
awk '{print "ALTER TABLE "$0 " DISCARD TABLESPACE;"}' aa.txt
如果是导入表空间同样,只是将上面的语句中 DISCARD 换成 IMPORT,完整语句如下
awk '{print "ALTER TABLE "$0 " IMPORT TABLESPACE;"}' aa.txt