遭遇 Table is read only 或 Error 1036: Table 'xxx' is read only 時,通常由檔案系統權限、表鎖定狀態、或儲存引擎異常導致。本文提供 Linux/Windows 多平台解決方案。
mysql) 無寫入權限。FLUSH TABLES WITH READ LOCK 未釋放、或損壞導致標記為唯讀。# 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
# 進入 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 或指定服務帳號) 有「修改」權限。
-- 登入 MySQL 後授予完整權限
GRANT ALL PRIVILEGES ON `dbname`.* TO 'user'@'host' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
-- MyISAM 表嘗試修復
REPAIR TABLE `tablename`;
-- InnoDB 若為 .ibd 損壞,需從備份恢復或使用 innodb_force_recovery
| 權限 | 允許操作 |
|---|---|
| ALTER | 修改表結構、索引 |
| CREATE | 建立資料庫、表 |
| DELETE | 刪除資料列 |
| DROP | 刪除資料庫、表 |
| INDEX | 建立/刪除索引 |
| INSERT | 插入新資料列 |
| SELECT | 查詢資料 |
| UPDATE | 修改現有資料列 |
| FILE | 讀寫伺服器檔案 (LOAD DATA/SELECT INTO OUTFILE) |
| PROCESS | 查看/終止線程 (SHOW PROCESSLIST/KILL) |
| RELOAD | FLUSH 操作、清除快取 |
| SHUTDOWN | 關閉服務器 |
| ALL PRIVILEGES | 除 GRANT OPTION 外所有權限 |
--single-transaction 避免長時間鎖表。chown mysql:mysql 並驗證 SELinux/AppArmor 策略。innodb_file_per_table 便於單表維護。