这个问题在线上不会自己消失,按现象、配置、日志三步走基本能定位。 腾讯云 CVM 上一批五百错误集中爆发,MySQL 写入报 Read-only file system,mount 输出里根分区带了 ro 标记,dmesg 末尾几条都是 I/O error。
如果同一时间还改过其他配置,建议一次只回退一项,方便确认是哪一步起的作用。
先分清是哪一类原因
- 磁盘出现坏块,内核检测到错误后自动把整个分区改成只读来保护数据
- 云盘被限流或者底层链路抖动,写请求连续超时也触发了同样的保护
- 有进程绕过文件系统直接写裸设备,把超级块写坏了
按顺序处理
1. 先看内核报错,锁定是哪块盘出问题
dmesg -T | grep -iE 'I/O error|remount'
2. 以读写方式临时重新挂载,先恢复业务
mount -o remount,rw /
3. 把关键数据同步到另一块盘留底
rsync -a /var/lib/mysql/ /data/mysql_bak/
4. 安排一次离线文件系统检查
touch /forcefsck
怎么确认已经恢复
mount 输出里根分区不再带 ro,写入测试文件成功,dmesg 在随后一小时内不再新增 I/O error。
容易忽略的地方
remount 成功不代表磁盘已经好了,坏块会在下次写到那片区域时再次触发;只读期间应用可能已经写坏部分数据,恢复后务必逐表校验。 复现步骤最好记下来,下次同类问题可以直接照单执行,不用再从零开始想。