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

MySQL 服務器啟動關閉全流程:權限隔離、腳本管理、故障恢復與安全強化

     編輯:MySQL 資料庫相關知識

MySQL 服務器生命周期管理權威指南(Unix/Linux 篇)

涵蓋非特權用戶運行、三種啟動方式、選項配置、啟動前表檢查、優雅關閉、失聯恢復、Root 密碼重置全流程。

核心安全原則:非 Root 運行 + 身份固化

  • 目標 1:服務器以非 Root 用戶運行(最小權限原則)
  • 目標 2:服務器**始終以同一用戶身份運行**,避免文件所有權混亂導致數據不可訪問

標準化部署流程

  1. 創建專用賬號/組:如 mysqladm/mysqlgrp(RPM 安裝自動創建 mysql 用戶)
  2. 停止現有服務
  3. 修正數據目錄所有權:
    cd /usr/local/var
    chown -R mysqladm:mysqlgrp .
    
  4. 收緊目錄權限:
    chmod -R go-rwx /usr/local/var  # 僅擁有者可訪問
    
    注意:符號鏈接需遞歸修正目標文件權限,需 Root 執行
  5. 啟動腳本強制指定用戶:--user=mysqladm(MySQL 3.22+ 支持),舊版用 su - mysqladm -c "mysqld ..."

三種啟動方式對比

方式特點適用場景監控重啟
mysqld 直接調用最精簡,無封裝調試、臨時實例無
safe_mysqld 腳本自動定位基礎目錄、重定向錯誤日志、**進程守護自動重啟**BSD 風格系統、手動運行有
mysql.server 腳本System V 風格,支持 start/stop 參數,集成啟動級別生產環境、系統服務管理配合 init.d

safe_mysqld 關鍵行為

  • 錯誤日志寫入數據目錄,Root 啟動時屬 Root,非特權用戶啟動前需刪除舊日志避免權限拒絕
  • 啟動後持續監控進程,異常退出自動拉起

System V 服務安裝示例

# Linux (PPC)
cp mysql.server /etc/rc.d/init.d/
chmod 500 /etc/rc.d/init.d/mysql.server
ln -s ../init.d/mysql.server /etc/rc.d/rc3.d/S99mysql

# Solaris
cp mysql.server /etc/init.d/
chmod 500 /etc/init.d/mysql.server
ln -s ../init.d/mysql.server /etc/rc2.d/S99mysql

# 有 chkconfig 時
chkconfig --add mysql.server

啟動選項配置最佳實踐

  • 推薦:全局選項文件 /etc/my.cnf(Unix)或 C:\my.cnf(Windows)
  • 環境變量注入:如時區 TZ 需在 safe_mysqld 中 export TZ=US/Central(Solaris 風格)或 TZ=CST6CDT
  • 修改啟動腳本會在升級時丟失,**升級後務必對比腳本差異**

啟動前表檢查自動化

在啟動腳本中調用 myisamchk/isamchk 掃描表完整性,特別針對崩潰後重啟場景。詳見第 13 章腳本編寫細節。

關閉服務器

mysqladmin shutdown
方式命令/機制
手動
BSD 系統發送 SIGTERM,進程響應關閉或被強制終止
System V調用 mysql.server stop

失聯場景診斷與恢復

場景一:Socket 文件丟失

  • 現象:本地客戶端無法連接,/tmp/mysql.sock 被清理腳本刪除
  • 恢復:重啟服務器自動重建
  • 臨時連接:強制 TCP/IP mysqladmin -h pit-viper.snake.net shutdown
  • 根治:/etc/my.cnf 固定 socket 路徑至數據目錄
    [mysqld]
    socket=/usr/local/var/mysql.sock
    [client]
    socket=/usr/local/var/mysql.sock
    

場景二:Root 密碼遺忘/損壞

  1. 關閉服務器:kill (優先標準 kill,嘗試優雅關閉),無響應才 kill -9(風險:未刷新數據)
  2. 啟動跳過授權表:mysqld --skip-grant-tables &
  3. 無密碼登入:mysql -u root
  4. 重置密碼:
    UPDATE mysql.user SET Password=PASSWORD('newpass') WHERE User='root';
    FLUSH PRIVILEGES;
    
  5. 正常重啟服務器

⚠️ 關鍵:若用 kill -9 強殺,**重啟前必須跑 myisamchk/isamchk 檢查修復表**,防止數據不一致。

權限刷新

修改授權表後:mysqladmin flush-privileges 或 mysqladmin reload。

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