MySQL损坏恢复
一、两种方式的数据存储结构:
在Myisam下,数据库的每个数据表都有*.frm、*.YMI和*.YMD三个文件,其中*.frm存储数据表的表结构,*.MYI存储数据表的索引,*.MYD存数数据表的记录数据;
在Innodb下,每个数据库下的每个数据表只有一个*.frm存储数据表的表结构,而所有数据库的所有表数据索引、数据记录都全部存储在ibdata1文件中,而ib_logfile0和ib_logfile1是日志文件。
二、恢复方式
Innodb引擎数据恢复
mysql> CREATE DATABASE sakila;
mysql> USE sakila;
mysql> CREATE TABLE actor (
actor_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
first_name VARCHAR(45) NOT NULL,
last_name VARCHAR(45) NOT NULL,
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (actor_id),
KEY idx_actor_last_name (last_name)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
1、在新的 MySQL 实例上,在同名数据库中重新创建表。
2、丢弃新创建的表的表空间。
ALTER TABLE {库名}.{表名} DISCARD TABLESPACE;
例:
mysql> ALTER TABLE sakila.actor DISCARD TABLESPACE;
3、将孤立的.ibd文件从备份目录复制到新的数据库目录。
cp /backup_directory/actor.ibd path/to/mysql-5.7/data/sakila/
4、确保.idb文件具有必要的文件权限。
5、导入孤立.ibd文件。发出警告,指示InnoDB尝试在没有模式验证的情况下导入文件。
ALTER TABLE {库名}.{表名} IMPORT TABLESPACE;SHOW WARNINGS;
例:
mysql> ALTER TABLE sakila.actor IMPORT TABLESPACE; SHOW WARNINGS;
Query OK, 0 rows affected, 1 warning (0.15 sec)
Warning | 1810 | InnoDB: IO Read error: (2, No such file or directory)
Error opening './sakila/actor.cfg', will attempt to import
without schema verification
6、查询表以验证.ibd 文件是否已成功恢复。
mysql> SELECT COUNT(*) FROM sakila.actor;
+----------+
| count(*) |
+----------+
| 200 |
+----------+