【腳本】一鍵完成MySQL任意版本的安裝部署
#!/bin/bash
set -euo pipefail
exec > >(tee -i mysql_install.log)
exec 2>&1
echo "-----------------------------開始MYSQL安裝--------------------------------------"
start_time=$(date +%s)
# 檢測root權限
[[ $EUID -ne 0 ]] && { echo -e "\e[31m錯誤:必須使用root用戶執行此腳本\e[0m"; exit 1; }
# 默認配置
DEFAULT_VERSION="8.0.37"
MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD:-$(openssl rand -base64 12)}
DATA_DIR="/data/mysql"
BASE_DIR="/usr/local/mysql"
# 獲取系統glibc版本,此處保留獲取操作但不做嚴格版本檢查
GLIBC_VERSION=$(ldd --version | awk '/ldd/{print $NF}')
echo "檢測到系統glibc版本: ${GLIBC_VERSION}"
# 固定安裝包后綴為linux-glibc2.12-x86_64
PKG_SUFFIX="linux-glibc2.12-x86_64"
# 用戶輸入版本
read -p "請輸入MySQL版本(默認:${DEFAULT_VERSION}): " version
version=${version:-${DEFAULT_VERSION}}
# 安裝包名稱
INSTALL_PKG="mysql-${version}-${PKG_SUFFIX}.tar.xz"
echo "正在檢查安裝包: ${INSTALL_PKG}"
# 檢查安裝包是否存在
if [[ ! -f "${INSTALL_PKG}" ]]; then
echo -e "\e[31m錯誤:安裝包 ${INSTALL_PKG} 不存在\e[0m"
echo "請從以下地址下載后放到當前目錄:"
echo "https://downloads.mysql.com/archives/community/"
exit 1
fi
# 檢查現有進程
if pgrep mysqld &>/dev/null; then
echo -e "\e[31m檢測到正在運行的MySQL進程,正在停止...\e[0m"
systemctl stop mysqld || pkill -9 mysqld
fi
# 清理舊數據
cleanup_dirs=("${BASE_DIR}" "/etc/my.cnf" "/etc/my.cnf.d" "${DATA_DIR}" "/tmp/mysql.sock")
for dir in "${cleanup_dirs[@]}"; do
[[ -e "${dir}" ]] && rm -rf "${dir}" && echo "已清理 ${dir}"
done
# 安裝依賴
echo "正在安裝系統依賴..."
yum install -y libaio numactl ncurses-compat-libs > /dev/null || {
echo -e "\e[31m依賴安裝失敗,請檢查網絡配置\e[0m"
exit 1
}
# 創建用戶和目錄
echo "創建系統用戶和目錄..."
groupadd mysql > /dev/null 2>&1 || true
useradd -r -g mysql -s /bin/false mysql > /dev/null 2>&1 || true
mkdir -p "${BASE_DIR}" "${DATA_DIR}"
chown -R mysql:mysql "${DATA_DIR}"
# 解壓安裝包
echo "正在解壓安裝包..."
tar -xJf "${INSTALL_PKG}" -C "${BASE_DIR}" --strip-components=1
# 配置文件
echo "生成配置文件..."
cat > /etc/my.cnf << EOF
[mysqld]
user=mysql
port=3306
basedir=${BASE_DIR}
datadir=${DATA_DIR}
socket=/tmp/mysql.sock
log-error=${DATA_DIR}/mysql.err
pid-file=${DATA_DIR}/mysql.pid
character-set-server=utf8mb4
collation-server=utf8mb4_0900_ai_ci
explicit_defaults_for_timestamp=1
log_bin=mysql-bin
server_id=1
innodb_file_per_table=1
max_connections=1000
[client]
socket=/tmp/mysql.sock
EOF
# 初始化數據庫,去掉 --initialize-insecure 參數
echo "正在初始化數據庫..."
"${BASE_DIR}/bin/mysqld" --initialize \
--user=mysql \
--basedir="${BASE_DIR}" \
--datadir="${DATA_DIR}"
# 獲取臨時密碼
TEMP_PASSWORD=$(grep 'A temporary password is generated for root@localhost' "${DATA_DIR}/mysql.err" | awk '{print $NF}')
# 創建systemd服務
echo "配置系統服務..."
cat > /etc/systemd/system/mysqld.service << EOF
[Unit]
Description=MySQL Server
After=network.target
[Service]
User=mysql
Group=mysql
ExecStart=${BASE_DIR}/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE=10000
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
EOF
# 環境變量配置
echo "export PATH=${BASE_DIR}/bin:\$PATH" > /etc/profile.d/mysql.sh
source /etc/profile.d/mysql.sh
# 啟動服務
systemctl daemon-reload
systemctl enable --now mysqld > /dev/null
# 等待 MySQL 服務器啟動
echo "等待 MySQL 服務器啟動..."
sleep 10
# 檢查套接字文件是否存在
if [[ ! -S /tmp/mysql.sock ]]; then
echo -e "\e[31m錯誤:套接字文件 /tmp/mysql.sock 未創建,請檢查日志文件 ${DATA_DIR}/mysql.err\e[0m"
exit 1
fi
# 設置root密碼
echo "正在配置安全設置..."
"${BASE_DIR}/bin/mysql" -uroot -p"${TEMP_PASSWORD}" --connect-expired-password -e "
ALTER USER 'root'@'localhost' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}';
CREATE USER 'root'@'%' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
"
# 安裝完成提示
end_time=$(date +%s)
execution_time=$((end_time - start_time))
echo -e "\n\e[32mMySQL安裝完成!\e[0m"
echo -e "根密碼: \e[31m${MYSQL_ROOT_PASSWORD}\e[0m"
echo -e "數據目錄: \e[34m${DATA_DIR}\e[0m"
echo -e "安裝路徑: \e[34m${BASE_DIR}\e[0m"
echo -e "配置文件: \e[34m/etc/my.cnf\e[0m"
echo "腳本執行時間:${execution_time} 秒"
# 清理安裝包(可選)
# rm -f "${INSTALL_PKG}"
使用方法:
- 從官網下載對應版本的MySQL二進制包(如mysql-8.0.37-linux-glibc2.12-x86_64.tar.xz)
- 將安裝腳本和安裝包放在同一目錄
- 執行腳本:
chmod +x install_mysql.sh && ./install_mysql.sh
安裝演示:
[root@myoracle ~]# chmod +x install_mysql.sh && ./install_mysql.sh

歡迎關注公眾號《小周的數據庫進階之路》,更多精彩知識和干貨盡在其中。
浙公網安備 33010602011771號