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

Linux MySQL 表只讀錯誤 #1036 解決方案:權限修復與 flush-tables 實戰

     編輯:MySQL 綜合教學

Linux MySQL 表只讀錯誤 #1036 解決方案:權限修復與 flush-tables 實戰

遷移 MySQL 數據目錄後,常遇到 #1036 – Table 'xxx' is read only 錯誤,導致無法寫入。本文提供經驗證的三步修復法:目錄權限 777 → 所有者 mysql:mysql → mysqladmin flush-tables,並解釋底層原理。

問題現象

  • 場景:將生產庫整庫傳輸至測試機,或直接拷貝 /var/lib/mysql 數據目錄遷移。
  • 現象:SELECT 正常,INSERT/UPDATE/DELETE 報錯 #1036 – Table 'table_name' is read only。
  • 原因:文件系統層面只讀屬性、或 MySQL 實例間文件鎖狀態不一致、或 SELinux/AppArmor 策略阻攔寫入。

三步修復腳本

# 假設數據目錄為 /usr/local/mysql/var/mydb
# 1. 授予最大權限(臨時,修復後建議收緊至 750)
chmod -R 0777 /usr/local/mysql/var/mydb/

# 2. 修正所有者為 mysql 進程用戶
chown -R mysql:mysql /usr/local/mysql/var/mydb/

# 3. 刷新表緩存,釋放殘留鎖狀態
/usr/local/mysql/bin/mysqladmin -u root -p flush-tables
# 輸入 root 密碼,無輸出即成功

驗證修復

mysql -u root -p
USE mydb;
INSERT INTO test_table (col) VALUES ('test');  -- 應成功
SELECT * FROM test_table;

原理解析

步驟作用底層機制
chmod 777消除文件系統只讀屬性InnoDB/MyISAM 需對 .ibd/.MYD/.MYI 寫入,任何只讀位導致錯誤 1036
chown mysql:mysql確保 mysqld 進程有 DAC 權限Linux DAC 權限檢查:進程有效 UID/GID 必須匹配文件所有者/組
flush-tables關閉所有打開的表句柄,清除鎖狀態MySQL 表緩存持有文件描述符與鎖信息;遷移後舊實例鎖狀態殘留,flush 強制釋放

進階排查(三步無效時)

  1. SELinux/AppArmor:
    getenforce → Enforcing 時,setenforce 0 臨時關閉或配置策略 semanage fcontext -a -t mysqld_db_t "/usr/local/mysql/var(/.*)?"。
  2. 文件系統掛載選項:
    mount | grep /usr/local/mysql 檢查是否含 ro、noexec、nosuid。
  3. MySQL 自身只讀模式:
    SHOW VARIABLES LIKE 'read_only'; → ON 時,SET GLOBAL read_only=OFF;(需 SUPER 權限)。
  4. InnoDB 只讀表空間:
    ALTER TABLE tbl_name IMPORT TABLESPACE; 導入前需 FLUSH TABLES tbl_name FOR EXPORT 產生 .cfg 文件。

最佳實踐:避免再次踩坑

  • 遷移數據目錄優先用 mysqldump 邏輯導出導入,而非物理拷貝。
  • 物理拷貝必須:源庫停寫(FLUSH TABLES WITH READ LOCK)→ 拷貝 → 目標庫啟動 → UNLOCK TABLES。
  • 目標服務器預先建立相同 UID/GID 的 mysql 用戶(useradd -u 27 -g 27 mysql)。
  • 部署自動化腳本固化上述三步修復,納入遷移 SOP。

掌握「權限 → 所有者 → 刷新」三步法,可在 1 分鐘內解決 95% 的 MySQL 表只讀故障,保障業務快速恢復。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved