閱讀 mysqld_safe 腳本不僅能掌握 MySQL 啟動全流程(目錄尋找、配置解析、進程啟動),更是學習 Shell 編程的優秀教材:變量解析、sed 轉義、進程優先級判斷、test 結構廣泛應用。本文基於 MySQL 5.1.45、RHEL AS 4 環境,梳理核心邏輯與關鍵技巧。
MySQL Base: /usr/local/mysql3306 Config Dir: /usr/local/mysql3306/etc Data Dir: /usr/local/mysql3306/data
KILL_MYSQLD=1 # 是否清理殘留進程 MYSQLD= # mysqld 程序名 niceness=0 # 調度優先級 logging=init # 日誌狀態:init/file/syslog want_syslog=0 # 是否使用 syslog user='mysql' # --user 參數值 trap '' 1 2 3 15 # 忽略 SIGHUP/SIGINT/SIGQUIT/SIGTERM umask 007 # 預設權限 770
函數 parse_arguments() 支援三種輸入來源,按優先級疊加:
[mysqld]、[server]:--loose-verbose 過濾未知選項[mysqld_safe]、[safe_mysqld]$@:最高優先級覆蓋前兩階段關鍵技巧:SET_USER=2 標記位追蹤 --user 是否已配置,避免重複賦值。
MY_BASEDIR_VERSION,其次當前目錄 errmsg.sys,最後編譯時預設 /usr/local/mysql3306libexec/、bin/$BASEDIR/data/mysql,其次 $BASEDIR/var/mysql,最後編譯預設$BASEDIR/my.cnf 與 $DATADIR/my.cnf 時優先前者並警告三種模式切換:
init:僅控制台輸出file:寫入 --log-error 指定文件(自動補 .err 後綴)syslog:透過 logger 傳送至系統日誌,標籤含 mysqld_safe/mysqld核心函數 log_generic() 統一格式:YYMMDD HH:MM:SS mysqld_safe msg。
精妙邏輯:測試 nohup nice 與直接 nice 的優先級差異,若 nohup 導致優先級降低(數值變大),自動補償調整 niceness 值,確保 mysqld 不會因 nohup 而被降級調度。
normal_niceness=`nice`
nohup_niceness=`nohup nice 2>/dev/null`
nice_value_diff=$((nohup_niceness - normal_niceness))
if [ $nice_value_diff -gt 0 ]; then
niceness=$((niceness - nice_value_diff))
NOHUP_NICENESS="nice -$niceness nohup"
fi
while true; do
rm -f "$socket_file" "$pid_file"
eval_log_error "$cmd" # 啟動 mysqld
if [ ! -f "$pid_file" ]; then break; fi # 啟動失敗退出
# 清理多餘 mysqld_safe 進程
if [ $KILL_MYSQLD -eq 1 ]; then
num=$(ps xaww | grep -c "pid-file=$pid_file")
for each extra process; do kill -9 $pid; done
fi
log_notice "mysqld restarted"
done
eval_log_error 根據日誌模式包裝命令(重導向或管道至 logger)mysqld 進程並強制清理,防止分身| 技巧 | 代碼片段 | 用途 |
|---|---|---|
| 安全路徑查找 | my_which() 遍歷 $PATH,IFS=: 分割 | 替代 which,可移植 |
| 參數值提取 | val=`echo "$arg" | sed -e "s;--[^=]*=;;"` | 支援 --key=val 格式解析 |
| 字符串轉義 | shell_quote_string() 非字母數字字符前加反斜線 | 防止 eval 注入 |
| 陣列模擬 | append_arg_to_args() 累積到字符串變量 | 構建最終啟動命令 |
| 進程樹掃描 | ps xaww | grep "pid-file=$pid_file" | 精準識別屬於本實例的進程 |
mysqld_safe 展示了生產級 Shell 腳本的嚴謹性:信號屏蔽、權限控制、配置疊加、優先級補償、進程監護、日誌多模式。研讀此腳本對理解 MySQL 運維本質與提升 Shell 技藝雙重受益。