如何通过MyISAM文件拷贝和InnoDB日志实现MySQL数据高效恢复?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1036个文字,预计阅读时间需要5分钟。
MyISAM 表支持直接拷贝文件进行恢复,而 InnoDB 表则不支持——除非你只想看起来像恢复了——实际上数据可能已损坏或丢失。
MyISAM 直接拷 .MYD/.MYI 文件为什么有时能用
MyISAM 是堆表结构,数据(.MYD)和索引(.MYI)是独立的物理文件,不依赖事务日志。只要 MySQL 服务已停止、文件没被覆盖、且表没在写入中被截断,拷贝原文件到新实例的 datadir/<db_name>/</db_name> 下,重启后 SHOW TABLES 就能看到表,SELECT 也可能查出数据。
但要注意这些坑:
- 如果原表正在被写入,而你没停服务就 cp,
.MYD可能处于中间状态(比如 INSERT 半截),导致SELECT报错Incorrect key file for table 'xxx'; try to repair it - 拷完不执行
REPAIR TABLE xxx,后续查询可能跳过损坏行,或突然崩溃 - 如果原库开启了
delay_key_write,索引可能还在内存没刷盘,.MYI文件本身就不完整 - 跨版本拷贝(如从 5.7 拷到 8.0)大概率失败,
.frm格式或字符集定义不兼容
InnoDB 拷 ibd 文件几乎必然失败
InnoDB 的 .ibd 文件不是孤立存在的。
本文共计1036个文字,预计阅读时间需要5分钟。
MyISAM 表支持直接拷贝文件进行恢复,而 InnoDB 表则不支持——除非你只想看起来像恢复了——实际上数据可能已损坏或丢失。
MyISAM 直接拷 .MYD/.MYI 文件为什么有时能用
MyISAM 是堆表结构,数据(.MYD)和索引(.MYI)是独立的物理文件,不依赖事务日志。只要 MySQL 服务已停止、文件没被覆盖、且表没在写入中被截断,拷贝原文件到新实例的 datadir/<db_name>/</db_name> 下,重启后 SHOW TABLES 就能看到表,SELECT 也可能查出数据。
但要注意这些坑:
- 如果原表正在被写入,而你没停服务就 cp,
.MYD可能处于中间状态(比如 INSERT 半截),导致SELECT报错Incorrect key file for table 'xxx'; try to repair it - 拷完不执行
REPAIR TABLE xxx,后续查询可能跳过损坏行,或突然崩溃 - 如果原库开启了
delay_key_write,索引可能还在内存没刷盘,.MYI文件本身就不完整 - 跨版本拷贝(如从 5.7 拷到 8.0)大概率失败,
.frm格式或字符集定义不兼容
InnoDB 拷 ibd 文件几乎必然失败
InnoDB 的 .ibd 文件不是孤立存在的。

