MySQL 啟動看似簡單(systemctl start mysqld 或 mysqld_safe),實則涉及配置文件解析順序、參數優先級覆蓋、進程父子關係、多實例隔離等核心機制。理解啟動鏈路,能精準排查「配置不生效」「PID 文件找不到」「多實例參數串擾」等疑難雜症。
my.cnf 結構回顧[client]
socket=/tmp/mysql.sock
port=3306
[mysqld]
basedir=/usr/local/mysql
datadir=/data/mysql/
innodb_data_home_dir=/data/mysql/
innodb_log_group_home_dir=/data/mysql/
port=3306
user=mysql
pid-file=/data/mysql/mysql.pid
socket=/tmp/mysql.sock
default_storage_engine=innodb
character_set_server=utf8
open_files_limit=65535
[mysqld_safe]
log_error=/usr/local/mysql/log/mysql-error.log
pid-file=/usr/local/mysql/log/mysql.pid
open_files_limit=15000
關鍵觀察:[mysqld]與[mysqld_safe]均出現pid-file、open_files_limit,誰生效?
mysql.server —— 系統服務標準入口(推薦生產)調用鏈:mysql.server → my_print_defaults → parse_server_arguments() → mysqld_safe → mysqld
[mysqld] 區塊參數,輸出標準化格式傳給解析函數。--basedir、--datadir、--pid-file、--server-startup-timeout 四個關鍵參數賦值。mysqld,並負責崩潰重啟、日誌導向。


關鍵結論:--datadir 和 --pid-file 由 parse_server_arguments 從 [mysqld] 讀取並鎖定,後續 mysqld_safe 的同名參數不會覆蓋。但其他參數(如 open_files_limit)若兩區塊都有,以 [mysqld_safe] 為準(見上圖)。
mysqld_safe —— 守護進程模式(多實例首選)老版本主流啟動方式,參數豐富,支援多實例隔離。
核心參數(mysqld_safe --help):
| 參數 | 作用 | 多實例場景 |
|---|---|---|
--defaults-file=FILE | 指定專屬配置文件 | 每實例獨立 my.cnf,絕對路徑 |
--defaults-extra-file=FILE | 追加讀取額外配置 | 覆蓋公共配置的差異項 |
--ledir=DIR | 指定 mysqld 二進制目錄 | 不同版本共存時指定實例專屬 bin |
--mysqld=FILE | 指定啟動程序名(預設 mysqld) | 可啟動 mysqld-debug 等變體 |
--open-files-limit | 最大打開文件數 | 傳遞 ulimit -n |
--core-file-size | Core Dump 大小限制 | 傳遞 ulimit -c |
--timezone=TZ | 設定 TZ 環境變量 | 跨時區部署統一時區 |
--skip-kill-mysqld | 不嘗試殺死殘留進程 | 調試時保留現場 |
--syslog / --skip-syslog | 日誌輸出目標切換 | 集中日誌採集需開啟 syslog |
| 優先級 | 來源 | 說明 |
|---|---|---|
| 1 (最高) | 命令行參數 | mysqld_safe --ledir=...、mysqld --datadir=... |
| 2 | --defaults-file 指定文件 | 多實例專屬配置,覆蓋所有 |
| 3 | [mysqld_safe] 區塊 | mysqld_safe 啟動路徑生效 |
| 4 | [mysqld] 區塊 | 基礎配置,mysql.server 路徑鎖定 datadir/pid-file |
| 5 | 編譯時預設值 / 內建預設值 | 最後兜底 |
pid-file 路徑權限、父目錄是否存在、mysql.server vs mysqld_safe 哪個啟動導致的路徑不一致。systemctl 走 mysql.server,手動 mysqld_safe 走守護進程),對應修正正確區塊([mysqld] 或 [mysqld_safe])。mysqld_safe --defaults-file=/etc/mysql/my3306.cnf --ledir=/usr/local/mysql57/bin,每實例獨立配置、獨立數據目錄、獨立 PID/Socket/端口。[mysqld_safe] 區塊僅保留守衛進程專屬參數(log_error、pid-file、open_files_limit、ledir、malloc-lib 等),業務參數全部集中在 [mysqld],避免優先級混淆。MySQL 啟動不是黑盒。mysql.server 適合系統服務標準化;mysqld_safe 適合多實例、守護重啟、參數隔離;mysqld 適合開發調試。核心只有一條:搞清「誰在讀哪個配置區塊」,參數衝突自然迎刃而解。