萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

CentOS 系統 MySQL 無法啟動排查全紀錄:InnoDB 損壞恢復與 SELinux 權限陷阱

MySQL 拒絕啟動,錯誤日誌是唯一真相。本文記錄兩類典型故障:InnoDB 數據頁損壞需強制恢復、修改 datadir 觸發 SELinux 拒絕訪問,提供分級排查步驟與修復命令。

故障一:InnoDB 頁損壞導致 Crash

現象

InnoDB: Page checksum mismatch ...
InnoDB: Database page corruption on disk or a failed file read ...
InnoDB: You may have to recover from a backup.

排查步驟

  1. 檢查磁盤空間 df -h、inode df -i。
  2. 核對 my.cnf 配置無誤。
  3. 查看錯誤日誌(/var/log/mysqld.log 或 datadir/*.err),定位損壞表/頁。

分級強制恢復

在 [mysqld] 區段添加 innodb_force_recovery = N(1-6 遞增),重啟後唯讀模式導出數據,再重建。

級別常量行為風險
1SRV_FORCE_IGNORE_CORRUPT忽略損壞頁,繼續啟動低,可能讀到髒數據
2SRV_FORCE_NO_BACKGROUND阻止主線程 purge/merge中,事務未清理
3SRV_FORCE_NO_TRX_UNDO不執行事務回滾高,未提交事務視為提交
4SRV_FORCE_NO_IBUF_MERGE不合併插入緩衝高,二級索引可能不一致
5SRV_FORCE_NO_UNDO_LOG_SCAN不掃描 undo log極高,數據一致性無保障
6SRV_FORCE_NO_LOG_REDO不執行 redo log 前滾最高,僅作最後嘗試

實戰操作

# 1. 編輯配置
vim /etc/my.cnf
# [mysqld] 下添加
innodb_force_recovery = 6
innodb_purge_threads = 0

# 2. 重啟
systemctl restart mysqld

# 3. 立即邏輯導出
mysqldump -u root -p --all-databases --single-transaction > /backup/full_$(date +%F).sql

# 4. 恢復配置並重建
# 移除 innodb_force_recovery,恢復 innodb_purge_threads=1
systemctl restart mysqld
mysql -u root -p < /backup/full_$(date +%F).sql

事後加固

  • 調整備份策略:每日全量 + 每小時增量(Binlog/xtrabackup)。
  • 啟用 innodb_checksum_algorithm=crc32、innodb_flush_method=O_DIRECT。
  • 硬體層面:RAID 卡 BBU、企業級 SSD、ECC 內存。

故障二:修改 datadir 後啟動失敗(SELinux 阻擋)

現象

InnoDB: Operating system error number 13 in a file operation.
InnoDB: The error means mysqld does not have the access rights to the directory.
InnoDB: File name /usr/local/project/etc/data/ibdata1
InnoDB: Cannot continue operation.

根因

CentOS/RHEL 預設啟用 SELinux Enforcing 模式,mysqld_t 域僅允許訪問標準標籤目錄(var_lib_t)。新目錄無正確標籤,被強制拒絕。

解決方案(三選一)

  1. 修改目錄安全上下文(推薦,持久化):
semanage fcontext -a -t mysqld_db_t "/usr/local/project/etc/data(/.*)?"
restorecon -Rv /usr/local/project/etc/data
  1. 臨時放寬為 Permissive(僅調試):
setenforce 0
# 永久修改 /etc/selinux/config: SELINUX=permissive
  1. 完全關閉 SELinux(不推薦生產):
vim /etc/selinux/config
SELINUX=disabled
# 需重啟 OS

配套權限設置

chown -R mysql:mysql /usr/local/project/etc/data
chmod -R 750 /usr/local/project/etc/data

通用排查清單

  1. systemctl status mysqld -l 看最近 50 行日誌。
  2. journalctl -u mysqld -f 實時跟蹤。
  3. 端口衝突:netstat -ltnp | grep 3306。
  4. 配置語法:mysqld --validate-config(5.7+)或 mysqld --help --verbose 2>&1 | head -20。
  5. 權限:ls -laZ datadir 確認擁有者、SELinux 標籤。

遇到啟動失敗,先看日誌、再對照清單、最小變更、驗證恢復,切忌盲目重裝或刪數據目錄。

copyright © 萬盛學電腦網 all rights reserved