可以,但必须满足三个硬性条件:表未被任何线程访问、未启用delay_key_write、且不处于repair或alter中间状态;myisam由.myd、.myi、.frm三文件组成,完整一致即可直接拷贝使用。

MyISAM表能直接拷贝文件吗?可以,但必须满足三个硬性条件
能,但前提是表没被任何线程访问、没启用delay_key_write、且没有处于REPAIR或ALTER中间状态。MyISAM的物理结构是三个文件:.MYD(数据)、.MYI(索引)、.frm(表定义),只要它们完整一致,拷贝后就能用。
常见错误现象:恢复后SELECT报错Table 'xxx' doesn't exist或Incorrect key file for table——多半是.frm缺失,或.MYI损坏未重刷。
- 执行前必须
FLUSH TABLES WITH READ LOCK,不是FLUSH TABLES - 确认
SHOW OPEN TABLES WHERE In_use > 0返回空结果 - 备份目录权限要和MySQL运行用户一致(比如
mysql:mysql),否则恢复后mysqld无法读取.MYI
如何避免FLUSH TABLES WITH READ LOCK阻塞写入太久?用mysqldump --lock-tables=false不行
mysqldump --lock-tables=false对MyISAM无效,它仍会隐式加锁。真正绕过长锁的方法只有两个:
- 在从库上操作:如果启用了复制,直接停掉
SLAVE,FLUSH TABLES WITH READ LOCK几乎不耗时,因为主库写入不影响从库文件一致性 - 用
LVM快照:要求数据目录在LVM逻辑卷上,lvcreate -s瞬间生成快照,然后umount快照卷再拷贝,全程主库无锁
注意:Percona XtraBackup不支持MyISAM热备,它只保证InnoDB一致性,MyISAM部分仍是冷拷贝——这点文档里常被忽略。
恢复时为什么cp完文件还报Table is read only?权限和文件系统问题
拷贝后的文件属主可能变成root,而mysqld以mysql用户运行,导致无法写.MYI(即使只是更新统计信息)。更隐蔽的是noatime挂载选项会导致.MYI时间戳异常,某些老版本MySQL(5.5之前)会拒绝加载。
- 恢复后必须
chown mysql:mysql *.MYD *.MYI *.frm - 检查
ls -l输出中.MYI大小是否为0——如果是,说明索引损坏,需REPAIR TABLE xxx USE_FRM - 若用
rsync恢复,加--archive但去掉--times,避免时间戳干扰
备份后如何验证MyISAM文件完整性?别只靠md5sum
md5sum只能确认文件没传输损坏,不能验证MyISAM内部结构。真正有效的验证是模拟恢复流程中的关键步骤:
- 把备份文件拷到测试实例的
datadir/数据库名/下,chmod 644 *.frm; chmod 660 *.MYD *.MYI - 启动
mysqld,执行CHECK TABLE xxx——成功返回OK才算过关 - 对大表额外跑
myisamchk -s /path/to/table.MYI,-s是静默模式,出错会直接返回非零码
实际运维中最容易被跳过的环节,是忘记在恢复目标实例上执行FLUSH TABLES——旧缓存里的句柄还指向原路径,新文件不会被识别。











