首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL "Table is read only" 錯誤原因與多種解決方案

     編輯:MySQL 綜合教學

MySQL 表唯讀錯誤排查與修復指南

遭遇 Table is read only 或 Error 1036: Table 'xxx' is read only 時,通常由檔案系統權限、表鎖定狀態、或儲存引擎異常導致。本文提供 Linux/Windows 多平台解決方案。

1. 核心原因分析

  • 資料目錄權限錯誤:MySQL 進程用戶 (通常為 mysql) 無寫入權限。
  • 表被鎖定:長時間備份、FLUSH TABLES WITH READ LOCK 未釋放、或損壞導致標記為唯讀。
  • 磁碟空間不足:InnoDB/MyISAM 無法寫入新資料。
  • 儲存引擎異常:.frm/.ibd/.MYD 檔案損壞、遷移時屬主不一致。

2. Linux 環境解決方案

# 1. 刷新表鎖 (釋放可能的 READ LOCK)
mysqladmin -u root -p flush-tables

# 2. 修正資料目錄擁有者 (假設資料在 /var/lib/mysql/taoniu2007/)
chown -R mysql:mysql /var/lib/mysql/taoniu2007/

# 3. 給予完整讀寫權限 (臨時方案,生產環境建議 750)
chmod -R 0777 /var/lib/mysql/taoniu2007/

# 4. 檢查磁碟空間
df -h /var/lib/mysql

3. Windows 環境解決方案

# 進入 MySQL bin 目錄
cd C:\Program Files\MySQL\MySQL Server 5.6\bin

# 刷新表鎖
mysqladmin -u root -p flush-tables
# 輸入 root 密碼 (預設為空直接 Enter)

若無效,檢查資料目錄 (my.ini 中 datadir) 的 NTFS 權限,確保運行 MySQL 服務的用戶 (通常為 SYSTEM 或指定服務帳號) 有「修改」權限。

4. 進階修復:權限授予與表修復

-- 登入 MySQL 後授予完整權限
GRANT ALL PRIVILEGES ON `dbname`.* TO 'user'@'host' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

-- MyISAM 表嘗試修復
REPAIR TABLE `tablename`;

-- InnoDB 若為 .ibd 損壞,需從備份恢復或使用 innodb_force_recovery

5. 權限對照表 (GRANT 關鍵字)

權限允許操作
ALTER修改表結構、索引
CREATE建立資料庫、表
DELETE刪除資料列
DROP刪除資料庫、表
INDEX建立/刪除索引
INSERT插入新資料列
SELECT查詢資料
UPDATE修改現有資料列
FILE讀寫伺服器檔案 (LOAD DATA/SELECT INTO OUTFILE)
PROCESS查看/終止線程 (SHOW PROCESSLIST/KILL)
RELOADFLUSH 操作、清除快取
SHUTDOWN關閉服務器
ALL PRIVILEGES除 GRANT OPTION 外所有權限

6. 預防建議

  • 定期監控磁碟使用率,設定告警閾值 (如 80%)。
  • 備份腳本使用 --single-transaction 避免長時間鎖表。
  • 跨主機遷移資料目錄時,務必同步 chown mysql:mysql 並驗證 SELinux/AppArmor 策略。
  • 重要表啟用 innodb_file_per_table 便於單表維護。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved