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

MySQL 啟動流程深度解析:yum 安裝後初始化、systemd 管理、故障排查全流程

     編輯:MySQL 綜合教學

yum 安裝後首次啟動標準流程

1. 安裝包自動完成的動作

  • 建立 mysql 用戶/組
  • 建立 /var/lib/mysql 數據目錄、/var/log/mysqld.log 日誌
  • 安裝 /etc/my.cnf 默認配置
  • 註冊 systemd 服務單元 /usr/lib/systemd/system/mysqld.service
  • 不會自動初始化數據目錄 (5.7+ 安全預設)

2. 手動初始化數據目錄 (關鍵步驟)

# 5.7/8.0 生成臨時 root 密碼
mysqld --initialize --user=mysql --datadir=/var/lib/mysql
# 輸出:[Note] A temporary password is generated for root@localhost: XxXxXxXx

# 或 5.6/不需臨時密碼
mysqld --initialize-insecure --user=mysql --datadir=/var/lib/mysql

注意: 初始化只能在**空數據目錄**執行,否則報錯 File ./ibdata1 already exists。

3. 啟動服務

systemctl start mysqld
# 或傳統
service mysqld start

4. 首次登入修改密碼 (5.7+)

mysql -u root -p'XxXxXxXx'  # 使用初始化生成的臨時密碼
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass#2024';
-- 或 5.6
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('NewStrongPass#2024');

5. 設定開機自啟

systemctl enable mysqld
# 或
chkconfig mysqld on

systemd 服務單元解析 /usr/lib/systemd/system/mysqld.service

[Unit]
Description=MySQL Server
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=mysql
Group=mysql
Type=notify
# 執行前預檢
ExecStartPre=/usr/bin/mysqld_pre_systemd
# 主進程
ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS
# 重啟策略
Restart=on-failure
RestartSec=5
# 限制
LimitNOFILE=65535
LimitNPROC=65535

關鍵機制

  • Type=notify:mysqld 啟動完成發送 `sd_notify` 給 systemd,systemd 才認為啟動成功
  • mysqld_pre_systemd:檢查數據目錄權限、socket 文件殘留、配置語法
  • Restart=on-failure:異常退出自動重啟 (5 秒延遲)

常見啟動失敗場景與排查

場景 1:Can't connect to local MySQL server through socket '/tmp/mysql.sock'

  • 原因: 數據目錄未初始化、socket 路徑不一致 (my.cnf vs 客戶端默認)
  • 排查: ls -l /var/lib/mysql/mysql.sock、grep socket /etc/my.cnf、mysql --socket=/var/lib/mysql/mysql.sock
  • 解決: 執行初始化、統一 socket 路徑、或客戶端指定 --protocol=tcp -h 127.0.0.1

場景 2:MySQL Daemon failed to start / Job for mysqld.service failed

  • 查看詳細錯誤: journalctl -u mysqld -xe、tail -f /var/log/mysqld.log
  • 常見原因:
    • 配置錯誤:mysqld --validate-config 或 mysqld --help --verbose 檢查
    • 權限問題:chown -R mysql:mysql /var/lib/mysql、restorecon -Rv /var/lib/mysql (SELinux)
    • 端口佔用:netstat -tlnp | grep 3306、lsof -i:3306
    • 記憶體不足:innodb_buffer_pool_size 過大、OOM Killer 殺進程 (dmesg | grep -i kill)
    • 數據目錄非空:殘留舊文件、未完成初始化
    • 插件衝突:plugin-load-add 載入失敗

場景 3:安全模式啟動 (跳過權限表、緊急救援)

systemctl stop mysqld
mysqld_safe --skip-grant-tables --skip-networking &
# 新終端
mysql -u root
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass';
systemctl restart mysqld

手動編譯/二進制包部署啟動差異

項目yum/rpm二進制包源碼編譯
服務管理systemd (mysqld.service)手動建 systemd / mysqld_safe同二進制
默認配置/etc/my.cnf需手動建 my.cnf需手動建
數據目錄/var/lib/mysqlmy.cnf 指定CMAKE_INSTALL_PREFIX/data
初始化手動執行手動執行手動執行
日誌輪轉logrotate 含包手動配置手動配置

啟動優化與最佳實踐

  1. 預熱 Buffer Pool: innodb_buffer_pool_dump_at_shutdown=ON, innodb_buffer_pool_load_at_startup=ON (5.6+)
  2. 並行啟動: innodb_read_io_threads, innodb_write_io_threads、innodb_purge_threads
  3. 快速 Crash Recovery: 適度 innodb_log_file_size (1~4GB)、innodb_flush_log_at_trx_commit=2 (非核心業務)
  4. 健康檢查端點: 監控系統輪詢 SELECT 1 或 mysqladmin ping
  5. 啟動順序依賴: After=network.target + 共享存儲掛載點

結語

MySQL 啟動看似簡單,實則涉及 **systemd 服務管理 → 數據目錄初始化 → 權限/SELinux/端口/記憶體/配置語法** 多重檢查。yum 安裝後**必須手動初始化**是 5.7+ 最大變化。掌握 journalctl -u mysqld、mysqld --validate-config、mysqld_safe --skip-grant-tables 三大排查利器,配合預熱、健康檢查、依賴順序優化,即可實現「秒級啟動、零人工干預、故障自愈」的生產級運維標準。

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