Mysql .idb文件 恢复
先说场景,最近遇到难事,Mysql服务崩溃,经过努力,悬着的心彻底死了,服务起不来
紧接着就是赶紧把数据恢复到另一台服务器上,然而更崩溃的是,数据库备份用不了,此处不用管,为什么用不了,反正就是没办法用备份文件去恢复
于是直接复制 .idb文件去其他的数据库服务器下面。
基础扫盲
-
.ibd文件是InnoDB存储引擎中用于存储表中数据的主要文件。每个InnoDB表都有一个对应的.ibd文件,其中包含表中的数据记录。
-
.frm文件:它存储了表的结构定义,包括列信息、索引定义、约束等。如果.ibd文件对应的表结构在目标数据库中不存在或已损坏,那么复制.frm文件是必要的,以确保表结构的正确恢复。
-
.TRG文件:这是 MySQL中存储触发器定义的文件。如果原数据库中的表有触发器,并且希望在恢复后触发器也能正常工作,那么需要将对应的.TRG文件一起复制到目标数据库的相应位置。
恢复步骤
1.丢弃原有的表空间关联
如果要替换某个表文件,首先需要丢弃原有的表空间关联
最后在文件恢复后,重新建立空间关联。
USE your_database;
ALTER TABLE your_table DISCARD TABLESPACE;
2.停止 MySQL 服务
在进行恢复操作之前,首先要确保 MySQL 服务已停止,以防止数据被意外修改。
systemctl stop mysqld
3.备份原有的数据文件(可选但强烈建议)
为了防止恢复过程中出现问题导致数据丢失,最好先对现有的 MySQL 数据目录进行备份。假设 MySQL 数据目录为/var/lib/mysql,可以使用以下命令进行备份:
cp -r /var/lib/mysql /var/lib/mysql_backup_$(date +%Y%m%d%H%M%S)
4.替换.idb文件
将需要恢复的.idb文件复制到对应的数据库表所在的目录中。通常,MySQL 的数据文件存储在/var/lib/mysql目录下
具体的数据库表文件位于对应数据库名的子目录中。
例如,如果要恢复test数据库中table1表的.idb文件,需要将恢复的.idb文件复制到/var/lib/mysql/test/目录下,并确保文件名与表名对应的.idb文件名一致。
5.检查文件路径和权限
检查.ibd文件的权限是否正确,确保 MySQL 进程有足够的权限读取和写入该文件。
通常,MySQL 数据文件的所有者和所属组应该是运行 MySQL 服务的用户和组,一般为mysql:mysql,文件权限为600或640。
chown -R mysql:mysql /var/lib/mysql/test/*.ibd
chmod 600 /var/lib/mysql/test/*.ibd
6.启动mysqld服务
systemctl start mysqld
7.检查表空间关联
如果.ibd文件是从其他环境复制过来的,可能存在表空间关联问题。
可以尝试使用ALTER TABLE... DISCARD TABLESPACE 和 ALTER TABLE... IMPORT TABLESPACE
语句来重新关联表空间。
重新导入表空间
ALTER TABLE user_table IMPORT TABLESPACE;
至此,整个流程结束,数据应该恢复