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

MySQL 二進制包一鍵部署與多實例自動化腳本實戰

     編輯:MySQL 資料庫相關知識

前言

二進制包(Generic Linux)部署 MySQL 最靈活、無依賴、適配性強。本文提供**參數化部署腳本**,支援單實例快速部署與多實例隔離部署,配置文件模板化,生產可直接落地。

部署腳本:deploy_mysql.sh

#!/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"

配置文件模板(my.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 uphostname 解析失敗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 部署標準化方案。將腳本納入版本庫,新機器上架「一條命令、一杯茶時間」搞定多實例部署。

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