錯誤 Table 'xxx' is read only 通常由 檔案系統權限錯誤、MyISAM 表標記崩潰、跨平台直接複製資料目錄 引起。核心修復:mysqladmin flush-tables 釋放鎖定 + 修正檔案權限/擁有者。
# Linux
/usr/local/mysql/bin/mysqladmin -u root -p flush-tables
# Windows CMD
mysqladmin -u root -p flush-tables
# phpMyAdmin:選擇表 → 操作 → 修復表 (內部執行 REPAIR TABLE)
# 資料目錄標準權限 (MyISAM/InnoDB 通用)
chown -R mysql:mysql /var/lib/mysql
find /var/lib/mysql -type d -exec chmod 700 {} \;
find /var/lib/mysql -type f -exec chmod 660 {} \;
# 若使用 mysqld_safe 啟動,確保 pid-file、socket、log-error 目錄同權限
data 目錄最易導致權限錯誤 (Windows 無擁有者概念)。mysqldump 導出 → 目標庫導入,或 xtrabackup 物理備份並 --prepare 後同步。# 停止服務
systemctl stop mysqld
# 進入資料庫目錄
cd /var/lib/mysql/db_name
# 修復單表
myisamchk -r -f table_name.MYI # -r recover, -f force
# 或批次修復所有
myisamchk -r -f *.MYI
# 啟動驗證
systemctl start mysqld
| 坑點 | 現象 | 正確做法 |
|---|---|---|
| 直接複製 data 目錄 | Table is read only / crashed / 字元集亂碼 | mysqldump 邏輯備份 + 導入 | MySQL 版本不一致 (5.5 → 5.7) | 語法/系統表不兼容 | 版本升級用 mysql_upgrade;跨大版本必須邏輯遷移 |
| 字元集不一致 | 中文變 ??? / | 導出指定 --default-character-set=utf8mb4,目標庫同字元集 |
| 大表導入極慢 | 單執行緒、索引維護 | 關鍵表 ALTER TABLE ... DISABLE KEYS (MyISAM) / SET UNIQUE_CHECKS=0; SET FOREIGN_KEY_CHECKS=0; (InnoDB) |
mysql:mysql,目錄 700,檔案 660。kill -9,優雅關閉 mysqladmin shutdown。myisam_recover_options=FORCE,BACKUP (MyISAM 自動修復)。CHECK TABLE / ANALYZE TABLE 巡檢。