二進制包(Generic Linux)部署 MySQL 最靈活、無依賴、適配性強。本文提供**參數化部署腳本**,支援單實例快速部署與多實例隔離部署,配置文件模板化,生產可直接落地。
#!/bin/bash # 用法:sh deploy_mysql.sh# 例:sh deploy_mysql.sh /root/mysql-5.6.28-linux-glibc2.5-x86_64.tar.gz /mysql3306 3306 filename=$1 basedir=$2 port=$3 # 1. 基礎環境 groupadd mysql 2>/dev/null useradd -r -g mysql -s /bin/false mysql 2>/dev/null # 2. 解壓並重命名為 mysql{port} cd /usr/local tar zxf "$filename" file=$(basename "$filename") dir=$(dirname "$filename") after_tar=${file:0:-7} # 去掉 .tar.gz mv "$after_tar" "mysql$port" cd "mysql$port" # 3. 複製配置文件模板(需與壓縮包同目錄下有 my.cnf) cp "$dir/my.cnf" "./my$port.cnf" user_cnf="my$port.cnf" # 4. 替換配置中的路徑佔位符 /project/class2 → 實際 basedir # sed 處理路徑斜杠技巧:先替換 / 為 |,再替換回去 basedir_escaped=${basedir//\//|} # /mysql3306 → |mysql3306 sed -i "s|/project/class2|$basedir_escaped|g" "$user_cnf" sed -i "s|\\||/|g" "$user_cnf" # 5. 動態設置 server_id(時間戳)和 port server_id=$(date +%s) sed -i "s/^server_id=.*/server_id=$server_id/" "$user_cnf" sed -i "s/^port=.*/port=$port/" "$user_cnf" # 6. 創建目錄結構並授權 mkdir -p "$basedir"/mysql/{run,data,share,log,tmp} chown -R mysql:mysql "$basedir" # 7. 處理二進制包依賴文件(errmsg.sys) cp share/english/errmsg.sys "$basedir/mysql/share/" # 8. 初始化數據庫(--force 忽略 hostname 解析報錯) scripts/mysql_install_db --user=mysql --defaults-file="$user_cnf" --force # 9. 啟動實例 bin/mysqld_safe --defaults-file="$user_cnf" --user=mysql & echo "MySQL $port 部署完成,basedir: $basedir,配置文件: $user_cnf"
[mysqld] # 路徑佔位符,腳本會自動替換 basedir=/project/class2/mysql datadir=/project/class2/mysql/data tmpdir=/tmp lc_messages_dir=/project/class2/mysql/share log-error=/project/class2/mysql/log/alert.log slow_query_log_file=/project/class2/mysql/log/slow.log general_log_file=/project/class2/mysql/log/general.log socket=/project/class2/mysql/run/mysql.sock pid-file=/project/class2/mysql/run/mysqld.pid # InnoDB 核心參數(按機器內存調整) innodb_buffer_pool_size=10G innodb_buffer_pool_instances=4 innodb_log_file_size=1G innodb_log_files_in_group=2 innodb_flush_log_at_trx_commit=1 innodb_file_per_table=1 innodb_flush_method=O_DIRECT # 複製相關 log-bin=/project/class2/mysql/log/mysql-bin server_id=2552763370 # 腳本自動覆蓋 binlog_format=ROW sync_binlog=1000 expire_logs_days=0 log-slave-updates=1 # 連接/線程/緩存 max_connections=4500 thread_cache_size=256 table_definition_cache=65536 query_cache_type=0 skip-name-resolve skip-ssl # 其他優化參數... port=3306 # 腳本自動覆蓋
| 報錯 | 原因 | 腳本對策 |
|---|---|---|
FATAL ERROR: Neither host 'xxx' nor 'localhost' could be looked up | hostname 解析失敗 | mysql_install_db --force 強制初始化 |
[ERROR] Can't find messagefile '/path/share/errmsg.sys' | basedir 變更導致 share 路徑找不到 | 腳本自動 cp share/english/errmsg.sys $basedir/mysql/share/ |
# 部署 3306、3307、3308 三個實例 sh deploy_mysql.sh /root/mysql-5.6.28.tar.gz /mysql3306 3306 sh deploy_mysql.sh /root/mysql-5.6.28.tar.gz /mysql3307 3307 sh deploy_mysql.sh /root/mysql-5.6.28.tar.gz /mysql3308 3308 # 管理命令 /mysql3306/mysql/bin/mysqld_multi --defaults-file=/mysql3306/mysql/my3306.cnf start 3306-3308 /mysql3306/mysql/bin/mysqld_multi --defaults-file=/mysql3306/mysql/my3306.cnf report
**參數化腳本 + 模板配置 + 自動修復** = 可複用、可擴展、可交付的 MySQL 部署標準化方案。將腳本納入版本庫,新機器上架「一條命令、一杯茶時間」搞定多實例部署。