当你遇到以下任何一种情况,很可能遭遇了数据表损坏:
-- 查询时出现错误 ERROR 1146 (42S02): Table 'database.table_name' doesn't exist ERROR 145 (HY000): Table 'database.table_name' is marked as crashed and should be repaired ERROR 144 (HY000): Table 'database.table_name' is marked as crashed and last repair failed ERROR 126 (HY000): Incorrect key file for table 'table_name'; try to repair it -- 执行检查表命令 CHECK TABLE users; -- 返回结果: -- +------------------+-------+----------+---------------------------------------------------+ -- | Table | Op | Msg_type | Msg_text | -- +------------------+-------+----------+---------------------------------------------------+ -- | mydb.users | check | error | Table 'mydb.users' doesn't exist | -- | mydb.users | check | status | Operation failed | -- +------------------+-------+----------+---------------------------------------------------+
1. 硬件故障(最常见): - 磁盘坏道、磁盘损坏 - 服务器突然断电 - 内存故障导致写入错误数据 2. MySQL服务异常: - MySQL进程被强制终止(kill -9) - 服务器崩溃时正在写入数据 - 磁盘空间不足导致写入中断 3. 文件系统问题: - 文件系统损坏(如ext4、xfs损坏) - 文件权限被错误修改 - 文件被误删除或移动 4. 存储引擎特定问题: - MyISAM:表级锁导致的问题较多 - InnoDB:事务日志损坏 - 混合引擎使用不当 5. 人为操作失误: - 直接复制表文件而未停止MySQL服务 - 错误的ALTER TABLE操作 - 备份恢复过程中的中断
# 紧急情况下,限制对损坏数据库的访问 # 1. 如果可能,停止应用连接 sudo systemctl stop nginx sudo systemctl stop php-fpm # 2. 设置MySQL为只读模式(避免进一步损坏) mysql -u root -p -e "SET GLOBAL read_only = ON;" # 3. 或者直接停止MySQL服务(如果已无法正常操作) # sudo systemctl stop mysql # 注意:不要立即重启MySQL,先收集信息
# 1. 查看MySQL错误日志 sudo tail -f /var/log/mysql/error.log # 或 sudo journalctl -u mysql --since "1 hour ago" | grep -i error # 2. 查看系统日志,确认是否有硬件问题 sudo dmesg | grep -i error sudo smartctl -a /dev/sda # 检查硬盘健康状态 # 3. 检查磁盘空间 df -h df -i # 检查inode使用情况 # 4. 查看损坏的表文件 sudo ls -la /var/lib/mysql/database_name/ # 注意文件大小是否异常(如0字节或特别大)
-- 1. 连接到MySQL(如果还能连接) mysql -u root -p -- 2. 检查所有表状态 USE information_schema; SELECT TABLE_SCHEMA, TABLE_NAME, ENGINE, TABLE_ROWS, DATA_LENGTH, INDEX_LENGTH, CREATE_TIME, UPDATE_TIME FROM TABLES WHERE TABLE_SCHEMA = 'your_database' ORDER BY DATA_LENGTH DESC; -- 3. 尝试检查关键表 CHECK TABLE users, orders, products; -- 如果CHECK TABLE命令失败,说明MySQL已无法识别表结构 -- 4. 查看当前进程(是否有长时间运行的查询) SHOW PROCESSLIST;</sp