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

MySQL 服務啟動與停止完全指南:權限分離、啟動腳本、多實例部署與故障恢復

     編輯:MySQL 資料庫相關知識

核心原則:以非特權用戶運行

為了安全與穩定,MySQL 服務不應以 root 身分運行。建立專屬帳號 (如 mysqladm/mysqlgrp) 並統一所有啟動方式使用此身分,避免資料目錄權限混亂導致服務無法存取檔案。

環境初始化步驟

  1. 建立帳號/群組 (需 root);若用 RPM 安裝 (RedHat) 已自動建立 mysql 帳號。
  2. 停止現有服務。
  3. 遞歸變更資料目錄擁有者:
    chown -R mysqladm:mysqlgrp /usr/local/var
  4. 收緊權限:
    chmod -R go-rwx /usr/local/var
  5. 處理符號連結:需追蹤實體路徑同步修改權限。
  6. 啟動時指定身分:mysqld --user=mysqladm (systemd/RPM 腳本已內建)。

三大啟動方式比較

方式指令/腳本特點適用系統
直接呼叫mysqld [options]手動測試、除錯;無監控自動重啟所有
安全啟動腳本safe_mysqld [options]自動偵測路徑、重導 stderr 至錯誤日誌、進程守護自動重啟BSD 風格 (FreeBSD, macOS 等)
System V 服務腳本mysql.server start|stop整合 rc.d/run-level 機制,支援 service/chkconfig 管理System V 風格 (RedHat, CentOS, Solaris 等)

腳本安裝位置與部署

  • safe_mysqld:安裝目錄 bin/ 或原始碼 scripts/。
  • mysql.server:安裝目錄 share/mysql/ 或原始碼 support-files/。

開機自啟設定範例

BSD (rc.local):

if [ -x /usr/local/bin/safe_mysqld ]; then
    /usr/local/bin/safe_mysqld &
fi

System V (Linux PPC):

cp mysql.server /etc/rc.d/init.d/
chmod 500 /etc/rc.d/init.d/mysql.server
ln -s /etc/rc.d/init.d/mysql.server /etc/rc.d/rc3.d/S99mysql

Solaris: 目錄為 /etc/init.d 與 /etc/rc2.d。

亦可用 chkconfig --add mysql.server 自動管理。

啟動參數配置最佳實踐

  • 優先使用選項檔: /etc/my.cnf (Linux) 或 C:\my.cnf (Windows) 的 [mysqld] 區段,避免修改啟動腳本導致升級遺失設定。
  • 環境變數需求: 如時區 TZ 必須在腳本中 export (如 TZ=US/Central),因無法透過選項檔傳遞。
  • 升級保護: 升級前備份自訂腳本,升級後對比合併變更。

啟動前資料表檢查

在啟動腳本中加入 myisamchk/isamchk 掃描資料表完整性,可在崩潰重啟時提早發現損壞。

停止服務

  • 手動: mysqladmin shutdown (需有效連線)。
  • 自動 (System V): mysql.server stop (傳遞 stop 參數給腳本)。
  • BSD 信號: 發送 TERM 訊號,mysqld 會正常關閉 (刷新日誌、釋放鎖);若無回應才用 kill -9 (風險:資料不一致,需事後 myisamchk 檢查)。

失去控制權時的緊急恢復流程

情境 A:Socket 檔遺失 (常因 cron 清理 /tmp)

  1. 改用 TCP/IP 連線關閉:mysqladmin -h 主機名 -u root -p shutdown
  2. 修正 my.cnf 指定固定 Socket 路徑 (如 /var/lib/mysql/mysql.sock) 並重啟。
  3. 或設定 /tmp sticky bit:chmod +t /tmp。

情境 B:忘記 Root 密碼 / 密碼含不可見字元

  1. 終止服務:kill `cat /datadir/hostname.pid` (勿用 -9)。
  2. 跳過授權表啟動:mysqld --skip-grant-tables &。
  3. 無密碼連線修改密碼:
    mysql -u root mysql
    UPDATE user SET password=PASSWORD('新密碼') WHERE user='root'; FLUSH PRIVILEGES;
  4. 正常重啟服務。

多實例部署架構

適用場景

  • 新版本測試與舊版本並行生產。
  • 突破單進程檔案描述符限制。
  • ISP 為不同客戶提供隔離實例。

關鍵隔離參數 (每實例必須唯一)

參數說明
安裝目錄 (--prefix)不同版本必須分目錄;源碼編譯用 ./configure --prefix=/usr/local/mysql-5.0
資料目錄 (datadir)各實例獨立資料目錄
TCP/IP 埠號 (--port)預設 3306,需錯開
Unix Socket (--socket)預設 /tmp/mysql.sock,需錯開
執行身分 (--user)建議各實例用獨立帳號
選項檔 (--defaults-file)各實例專屬 my.cnf

多實例配置策略

  1. 不同版本: 編譯時指定 --prefix、--with-tcp-port、--with-unix-socket 完全分離。
  2. 同版本多實例: 共用二進制,啟動時以 --defaults-file=/etc/my.cnf.instance1 指定專屬配置檔 (含 datadir, port, socket, pid-file, user 等)。
  3. 選項檔層級: 全域 /etc/my.cnf 放共用設定;實例專屬設定放 DATADIR/my.cnf 或用 --defaults-file 指定 (此模式會忽略標準位置選項檔)。

啟動腳本建議: 研讀 safe_mysqld 邏輯,撰寫客製化啟動腳本精確控制各實例參數,避免衝突。

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