首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL "Table is read only" 錯誤排查與修復:flush-tables、檔案權限、跨平台遷移實戰

     編輯:MySQL 資料庫相關知識

Table is read only 根因分析與三種修復方案

錯誤 Table 'xxx' is read only 通常由 檔案系統權限錯誤、MyISAM 表標記崩潰、跨平台直接複製資料目錄 引起。核心修復:mysqladmin flush-tables 釋放鎖定 + 修正檔案權限/擁有者。

方案一: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 目錄同權限
  • 跨平台遷移 (Windows → Linux) 直接複製 data 目錄最易導致權限錯誤 (Windows 無擁有者概念)。
  • 遷移建議:勿直接複製檔案,改用 mysqldump 導出 → 目標庫導入,或 xtrabackup 物理備份並 --prepare 後同步。

方案三:myisamchk 離線修復 (表已標記 crashed)

# 停止服務
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)

生產環境預防清單

  1. 資料目錄擁有者 mysql:mysql,目錄 700,檔案 660。
  2. 避免 kill -9,優雅關閉 mysqladmin shutdown。
  3. 啟用 myisam_recover_options=FORCE,BACKUP (MyISAM 自動修復)。
  4. 系統表轉 InnoDB (5.7+ 預設),消除 MyISAM 崩潰風險。
  5. 定期 CHECK TABLE / ANALYZE TABLE 巡檢。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved