MySQL/MariaDB 實例初始化是部署的第一步,卻常因參數缺失、權限不足、路徑錯誤導致失敗。MariaDB 的 mysql_install_db 由 Shell 編寫,邏輯清晰可讀,是理解初始化原理的最佳切入點。本文從源碼級別剖析其核心流程:參數解析、路徑探測、配置讀取、權限校驗、目錄創建、系統表初始化,並總結「正確姿勢」避開常見坑點。
| 現象 | 根因 | 對策 |
|---|---|---|
Could not find ./bin/my_print_defaults | 未指定 --basedir,腳本在當前目錄找不到二進制文件 | 顯式指定 --basedir 或切換到安裝目錄執行 |
Permission denied 創建數據文件失敗 | --datadir 默認當前目錄 ./data,當前用戶無寫入權限 | 顯式指定 --datadir 至可寫目錄,或確保目錄擁有者正確 |
basedir="" # 安裝根目錄
builddir="" # 編譯目錄(源碼安裝用)
ldata="./data" # 數據目錄,默認當前目錄下的 data
user="" # 運行用戶
force=0 # 強制模式,忽略 DNS 解析失敗
cross_bootstrap=0 # 交叉編譯場景
雙階段解析機制:
--basedir、--srcdir、--defaults-file 等影響 my_print_defaults 定位的參數[mysqld]、[mysql_install_db] 組合並發參數,再解析命令行剩餘參數(存入 $args 透傳給 mysqld --bootstrap)# 優先級邏輯
if srcdir 指定: print_defaults="$builddir/extra/my_print_defaults"
elif basedir 指定: print_defaults=`find_in_basedir my_print_defaults bin extra`
else: print_defaults="./bin/my_print_defaults" # 假設在 basedir 下執行
若不可執行(! -x)直接報錯退出。
parse_arguments `"$print_defaults" $defaults --mysqld mysql_install_db`
實際執行示例:
/usr/local/mysql/bin/my_print_defaults --defaults-file=/etc/my.cnf --mysqld mysql_install_db
# 輸出: --basedir=... --datadir=... --user=mysql ...
$basedir/libexec|sbin|bin/mysqld$basedir/share/english|share/mysql/english/errmsg.sys(錯誤碼映射,升級必更新)mysql_system_tables.sql、mysql_performance_tables.sql、fill_help_tables.sql、maria_add_gis_sp_bootstrap.sql任一缺失或不可執行即退出。
resolveip 解析 hostname,失敗嘗試 localhost--skip-name-resolve / --force / --cross-bootstrap 可跳過或強制使用 IPmkdir -p "$ldata" "$ldata/mysql" "$ldata/test"
chmod 700 "$dir"
chown $user "$dir" # 若指定 --user
核心命令構建:
mysqld_bootstrap="${MYSQLD_BOOTSTRAP-$mysqld}"
"$mysqld_bootstrap" $defaults "$mysqld_opt" --bootstrap \
--basedir="$basedir" --datadir="$ldata" \
--log-warnings=0 --enforce-storage-engine="" \
$args --max_allowed_packet=8M --net_buffer_length=16K
三階段導入:
mysql_system_tables.sql + mysql_performance_tables.sql + mysql_system_tables_data.sqlfill_help_tables.sqlmaria_add_gis_sp_bootstrap.sql關鍵點:--bootstrap 只執行初始化 SQL,**不啟動服務器**。
--basedir、--datadir、--usermkdir -p /data/mysql && chown -R mysql:mysql /data/mysql/etc/my.cnf 包含 [mysqld] 基礎參數chmod +x $basedir/bin/mysqldMariaDB 的 mysql_install_db 體現了「約定優於配置」與「防禦性編程」:雙階段參數解析保證配置正確性,多路徑探測兼容源碼/二進制/當前目錄三種部署形態,--bootstrap 機制隔離初始化與運行時。掌握其流程,不僅能快速排查初始化失敗,更能深入理解 MySQL 系統表結構、權限體系與啟動機制的底層邏輯。