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

Linux MySQL 1036 錯誤「Table is read only」三步解決:權限、所有者、FLUSH TABLES

     編輯:MySQL 資料庫相關知識

故障現場

服務器遷移後,網站能讀不能寫,報錯:

#1036 - Table 'xxx' is read only

環境:MySQL 數據目錄 /usr/local/mysql/var,遷移方式:打包 data 目錄上傳解壓。

三步修復流程

1. 賦予數據目錄完整權限

chmod -R 0777 /usr/local/mysql/var/admin/

admin 為具體數據庫目錄名,遞歸授權所有表文件 (.MYD, .MYI, .frm) 可讀寫執行。

2. 修正文件所有者為 mysql 用戶

chown -R mysql:mysql /usr/local/mysql/var/admin/

關鍵:MySQL 進程以 mysql 用戶運行,文件屬主不匹配會導致只讀或啟動失敗。

3. 執行 FLUSH TABLES 強制重新打開表文件

cd /usr/local/mysql/bin
./mysqladmin -u root -p flush-tables

輸入 root 密碼後執行,無輸出即成功。此命令關閉所有打開的表句柄,重新以新權限/所有者打開,解除只讀狀態。

根因分析

  1. 打包解壓過程中,文件屬主變為上傳用戶 (如 root),MySQL 進程無寫入權限
  2. MyISAM 引擎以文件級鎖控制並發,文件不可寫直接標記為只讀
  3. FLUSH TABLES 刷新表緩存,重新獲取文件句柄時應用新權限

預防檢查清單

  • 遷移前:tar --owner=mysql --group=mysql -czf mysql_data.tar.gz /usr/local/mysql/var 保留屬主
  • 遷移後:解壓前確認目標目錄屬主 ls -ld /usr/local/mysql/var
  • InnoDB 表遷移建議用 mysqldump 或 xtrabackup,避免文件級複製帶來的表空間 ID 衝突

驗證腳本

# 檢查權限與屬主
ls -l /usr/local/mysql/var/admin/*.MYD | head -5
# 測試寫入
mysql -u root -p -e "INSERT INTO admin.test_table (col) VALUES ('test');"
# 成功無報錯即修復完成
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved