mysql多实例脚本
#!/bin/bash
# *************************************
# * 功能: Shell脚本模板
# * 作者: 刘丹玉
# * 联系: v649352141@163.com
# * 版本: 2025-05-15
# *************************************
# 错误处理:如果命令执行失败,脚本将终止
set -e
# 调试处理
# set -x
MYSQL_6=mysql-5.6.50-linux-glibc2.12-x86_64
MYSQL_7=mysql-5.7.44-linux-glibc2.12-x86_64
MYSQL_8=mysql-8.4.0-linux-glibc2.28-x86_64
SINGLE_6=false
SINGLE_7=false
SINGLE_8=false
MORE_INSTANCE=false
# 颜色脚本,通用
color () {
RES_COL=60
MOVE_TO_COL="echo -en \\033[${RES_COL}G"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_NORMAL="echo -en \E[0m"
echo -n "$1" && $MOVE_TO_COL
echo -n "["
if [ $2 = "success" -o $2 = "0" ] ;then
${SETCOLOR_SUCCESS}
echo -n $" OK "
elif [ $2 = "failure" -o $2 = "1" ] ;then
${SETCOLOR_FAILURE}
echo -n $"FAILED"
else
${SETCOLOR_WARNING}
echo -n $"WARNING"
fi
${SETCOLOR_NORMAL}
echo -n "]"
echo
}
# 查看属于Rocky、Ubuntu、openEuler系列
os_type () {
awk -F'[ "]' '/^NAME/{print $2}' /etc/os-release
}
# 安装依赖
install_softs () {
color "正在安装依赖环境" 0
if [ "${MORE_INSTANCE}" == "true" ];then
yum -y install libaio numactl-libs ncurses-compat-libs perl-Data-Dumper autoconf libaio perl-Sys-Hostname ncurses-compat-libs > /dev/null 2>&1
elif [ "${SINGLE_6}" == "true" ];then
yum install -y perl-Data-Dumper autoconf libaio perl-Sys-Hostname ncurses-compat-libs > /dev/null 2>&1
elif [ "${SINGLE_7}" == "true" ];then
yum -y install libaio numactl-libs ncurses-compat-libs > /dev/null 2>&1
elif [ "${SINGLE_8}" == "true" ];then
yum -y install libaio numactl-libs ncurses-compat-libs > /dev/null 2>&1
else
exit 1
fi
}
# 准备用户
add_user (){
color "准备用户" 0
groupadd -r mysql
useradd -r -g mysql -s /sbin/nologin mysql
}
# 软件环境
prepare_install_package () {
color "准备下载相关软件---请耐心等待" 0
mkdir -p /mysql/{3306,3307,3308}/{data,etc,socket,log,bin,pid,share}
mkdir -p /data/softs
cd /data/softs
if [ "${SINGLE_6}" == "true" ];then
wget https://downloads.mysql.com/archives/get/p/23/file/${MYSQL_6}.tar.gz > /dev/null 2>&1
[ $? -ne 0 ] && { color "下载 ${MYSQL_6}.tar.gz 文件失败" 1; exit; }
tar xf ${MYSQL_6}.tar.gz
mv ${MYSQL_6} /usr/local/mysql3306
chown -R mysql:mysql /usr/local/mysql3306
fi
if [ "${SINGLE_7}" == "true" ];then
wget https://downloads.mysql.com/archives/get/p/23/file/${MYSQL_7}.tar.gz > /dev/null 2>&1
[ $? -ne 0 ] && { color "下载 ${MYSQL_7}.tar.gz 文件失败" 1; exit; }
tar xf ${MYSQL_7}.tar.gz
mv ${MYSQL_7} /usr/local/mysql3307
chown -R mysql:mysql /usr/local/mysql3307
fi
if [ "${SINGLE_8}" == "true" ];then
wget https://downloads.mysql.com/archives/get/p/23/file/${MYSQL_8}.tar.xz > /dev/null 2>&1
[ $? -ne 0 ] && { color "下载 ${MYSQL_8}.tar.xz 文件失败" 1; exit; }
tar xf ${MYSQL_8}.tar.xz
mv ${MYSQL_8} /usr/local/mysql3308
chown -R mysql:mysql /usr/local/mysql3308
fi
if [ "${MORE_INSTANCE}" == "true" ];then
wget https://downloads.mysql.com/archives/get/p/23/file/${MYSQL_6}.tar.gz > /dev/null 2>&1
[ $? -ne 0 ] && { color "下载 ${MYSQL_6}.tar.gz 文件失败" 1; exit; }
tar xf ${MYSQL_6}.tar.gz
mv ${MYSQL_6} /usr/local/mysql3306
wget https://downloads.mysql.com/archives/get/p/23/file/${MYSQL_7}.tar.gz > /dev/null 2>&1
[ $? -ne 0 ] && { color "下载 ${MYSQL_7}.tar.gz 文件失败" 1; exit; }
tar xf ${MYSQL_7}.tar.gz
mv ${MYSQL_7} /usr/local/mysql3307
wget https://downloads.mysql.com/archives/get/p/23/file/${MYSQL_8}.tar.xz > /dev/null 2>&1
[ $? -ne 0 ] && { color "下载 ${MYSQL_8}.tar.xz 文件失败" 1; exit; }
tar xf ${MYSQL_8}.tar.xz
mv ${MYSQL_8} /usr/local/mysql3308
chown -R mysql:mysql /usr/local/mysql3306
chown -R mysql:mysql /usr/local/mysql3307
chown -R mysql:mysql /usr/local/mysql3308
fi
chown -R mysql:mysql /mysql/
}
# 生成三个实例的初始数据
initialize_data_6(){
if [ "${MORE_INSTANCE}" == "true" ];then
echo 'PATH=/usr/local/mysql3306/bin:$PATH' > /etc/profile.d/mysql3306.sh
source /etc/profile.d/mysql3306.sh
/usr/local/mysql3306/scripts/mysql_install_db --basedir=/usr/local/mysql3306 --datadir=/mysql/3306/data > /dev/null 2>&1
PATH="/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
elif [ "${SINGLE_6}" == "true" ];then
echo 'PATH=/usr/local/mysql3306/bin:$PATH' > /etc/profile.d/mysql3306.sh
source /etc/profile.d/mysql3306.sh
for i in 6 7 8
do
/usr/local/mysql3306/scripts/mysql_install_db --basedir=/usr/local/mysql3306 --datadir=/mysql/330$i/data > /dev/null 2>&1
done
else
printf ""
fi
}
initialize_data_7(){
if [ "${MORE_INSTANCE}" == "true" ];then
echo 'PATH=/usr/local/mysql3307/bin:$PATH' > /etc/profile.d/mysql3307.sh
source /etc/profile.d/mysql3307.sh
/usr/local/mysql3307/bin/mysqld --initialize-insecure --basedir=/usr/local/mysql3307 --datadir=/mysql/3307/data > /dev/null 2>&1
PATH="/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
elif [ "${SINGLE_7}" == "true" ];then
echo 'PATH=/usr/local/mysql3307/bin:$PATH' > /etc/profile.d/mysql3307.sh
source /etc/profile.d/mysql3307.sh
for i in 6 7 8
do
/usr/local/mysql3307/bin/mysqld --initialize-insecure --basedir=/usr/local/mysql3307 --datadir=/mysql/330$i/data > /dev/null 2>&1
done
else
printf ""
fi
}
initialize_data_8(){
if [ "${MORE_INSTANCE}" == "true" ];then
echo 'PATH=/usr/local/mysql3308/bin:$PATH' > /etc/profile.d/mysql3308.sh
source /etc/profile.d/mysql3308.sh
/usr/local/mysql3308/bin/mysqld --initialize-insecure --basedir=/usr/local/mysql3308 --datadir=/mysql/3308/data > /dev/null 2>&1
PATH="/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
elif [ "${SINGLE_8}" == "true" ];then
echo 'PATH=/usr/local/mysql3308/bin:$PATH' > /etc/profile.d/mysql3308.sh
source /etc/profile.d/mysql3308.sh
for i in 6 7 8
do
/usr/local/mysql3308/bin/mysqld --initialize-insecure --basedir=/usr/local/mysql3308 --datadir=/mysql/330$i/data > /dev/null 2>&1
done
else
printf ""
fi
}
# 创建主配置文件
configuration_file_6 (){
if [ "${MORE_INSTANCE}" == "true" ];then
cat > /mysql/3306/etc/my.cnf <<-eof
[mysqld]
port=3306
user=mysql
socket = /mysql/3306/socket/mysql.sock
basedir = /usr/local/mysql3306
datadir = /mysql/3306/data
innodb_file_per_table=on
skip_name_resolve = on
symbolic-links=0
[client]
socket = /mysql/3306/socket/mysql.sock
[mysqld_safe]
pid-file = /mysql/3306/pid/mysqld.pid
log-error = /mysql/3306/log/error.log
eof
elif [ "${SINGLE_6}" == "true" ];then
for i in 6 7 8
do
cat > /mysql/330$i/etc/my.cnf <<-eof
[mysqld]
port=330$i
user=mysql
socket = /mysql/330$i/socket/mysql.sock
basedir = /usr/local/mysql3306
datadir = /mysql/330$i/data
innodb_file_per_table=on
skip_name_resolve = on
symbolic-links=0
[client]
socket = /mysql/330$i/socket/mysql.sock
[mysqld_safe]
pid-file = /mysql/330$i/pid/mysqld.pid
log-error = /mysql/330$i/log/error.log
eof
done
else
printf ""
fi
}
configuration_file_7 (){
if [ "${MORE_INSTANCE}" == "true" ];then
cat > /mysql/3307/etc/my.cnf <<-eof
[mysqld]
user=mysql
port=3307
socket = /mysql/3307/socket/mysql.sock
basedir = /usr/local/mysql3307
datadir = /mysql/3307/data
skip_name_resolve = 1
pid-file = /mysql/3307/pid/mysqld.pid
log-error = /mysql/3307/log/error.log
lc-messages-dir = /usr/local/mysql3307/share/english
lc-messages = en_US
[client]
socket = /mysql/3307/socket/mysql.sock
eof
elif [ "${SINGLE_7}" == "true" ];then
for i in 6 7 8
do
cat > /mysql/330$i/etc/my.cnf <<-eof
[mysqld]
user=mysql
port=330$i
socket = /mysql/330$i/socket/mysql.sock
basedir = /usr/local/mysql3307
datadir = /mysql/330$i/data
skip_name_resolve = 1
pid-file = /mysql/330$i/pid/mysqld.pid
log-error = /mysql/330$i/log/error.log
lc-messages-dir = /usr/local/mysql330$i/share/english
lc-messages = en_US
[client]
socket = /mysql/330$i/socket/mysql.sock
eof
done
else
printf ""
fi
}
configuration_file_8 (){
if [ "${MORE_INSTANCE}" == "true" ];then
cat > /mysql/3308/etc/my.cnf <<-eof
[mysql]
port = 3308
socket = /mysql/3308/socket/mysql.sock
[mysqld]
port = 3308
mysqlx_port = 33080
mysqlx_socket = /mysql/3308/socket/mysqlx.sock
basedir = /usr/local/mysql3308
datadir = /mysql/3308/data
socket = /mysql/3308/socket/mysql.sock
pid-file = /mysql/3308/pid/mysqld.pid
log-error = /mysql/3308/log/error.log
eof
elif [ "${SINGLE_8}" == "true" ];then
for i in 6 7 8
do
cat > /mysql/330$i/etc/my.cnf <<-eof
[mysql]
port = 330$i
socket = /mysql/330$i/socket/mysql.sock
[mysqld]
port = 330$i
mysqlx_port = 330$i0
mysqlx_socket = /mysql/330$i/socket/mysqlx.sock
basedir = /usr/local/mysql3308
datadir = /mysql/330$i/data
socket = /mysql/330$i/socket/mysql.sock
pid-file = /mysql/330$i/pid/mysqld.pid
log-error = /mysql/330$i/log/error.log
eof
done
else
printf ""
fi
}
# 定制服务管理文件
systemctl_mysql(){
color "定制服务管理文件" 0
if [ "${MORE_INSTANCE}" == "true" ];then
for i in 6 7 8
do
cat >/usr/lib/systemd/system/mysqld330$i.service<<EOF
[Unit]
Description=MySQL Community Server
Documentation=https://dev.mysql.com/doc/refman/8.4/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql330$i/bin/mysqld --defaults-file=/mysql/330$i/etc/my.cnf
ExecReload=/bin/kill -s HUP \$MAINPID
ExecStop=/bin/kill -s TERM \$MAINPID
LimitNOFILE = 10000
EOF
done
elif [ "${SINGLE_6}" == "true" ];then
for i in 6 7 8
do
cat >/usr/lib/systemd/system/mysqld330$i.service<<EOF
[Unit]
Description=MySQL Community Server
Documentation=https://dev.mysql.com/doc/refman/8.4/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql3306/bin/mysqld --defaults-file=/mysql/330$i/etc/my.cnf
ExecReload=/bin/kill -s HUP \$MAINPID
ExecStop=/bin/kill -s TERM \$MAINPID
LimitNOFILE = 10000
EOF
done
elif [ "${SINGLE_7}" == "true" ];then
for i in 6 7 8
do
cat >/usr/lib/systemd/system/mysqld330$i.service<<EOF
[Unit]
Description=MySQL Community Server
Documentation=https://dev.mysql.com/doc/refman/8.4/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql3307/bin/mysqld --defaults-file=/mysql/330$i/etc/my.cnf
ExecReload=/bin/kill -s HUP \$MAINPID
ExecStop=/bin/kill -s TERM \$MAINPID
LimitNOFILE = 10000
EOF
done
elif [ "${SINGLE_8}" == "true" ];then
for i in 6 7 8
do
cat >/usr/lib/systemd/system/mysqld330$i.service<<EOF
[Unit]
Description=MySQL Community Server
Documentation=https://dev.mysql.com/doc/refman/8.4/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql3308/bin/mysqld --defaults-file=/mysql/330$i/etc/my.cnf
ExecReload=/bin/kill -s HUP \$MAINPID
ExecStop=/bin/kill -s TERM \$MAINPID
LimitNOFILE = 10000
EOF
done
else
exit 1
fi
}
# 启动服务
start_mysql(){
color "开机服务自启" 0
# 重载配置
systemctl daemon-reload
for i in 6 7 8
do
systemctl enable --now mysqld330$i > /dev/null 2>&1
done
}
# 测试是否存活
test_success(){
color "测试mysql是否启动" 0
if [ "${MORE_INSTANCE}" == "true" ];then
for i in 6 7 8
do
systemctl status mysqld330$i | grep active > /dev/null 2>&1
if [ $? -eq 0 ];then
color "330$i 启动成功" 0
else
color "330$i 启动失败" 2
fi
done
elif [ "${SINGLE_6}" == "true" ];then
for i in 6 7 8
do
systemctl status mysqld330$i | grep active > /dev/null 2>&1
if [ $? -eq 0 ];then
color "330$i 启动成功" 0
else
color "330$i 启动失败" 2
fi
done
elif [ "${SINGLE_7}" == "true" ];then
for i in 6 7 8
do
systemctl status mysqld330$i | grep active > /dev/null 2>&1
if [ $? -eq 0 ];then
color "330$i 启动成功" 0
else
color "330$i 启动失败" 2
fi
done
elif [ "${SINGLE_8}" == "true" ];then
for i in 6 7 8
do
systemctl status mysqld330$i | grep active > /dev/null 2>&1
if [ $? -eq 0 ];then
color "330$i 启动成功" 0
else
color "330$i 启动失败" 2
fi
done
else
exit 1
fi
}
install_mysql (){
# 安装依赖
install_softs
# 准备用户
add_user
# 软件环境
prepare_install_package
# 生成三个实例的初始数据
chown -R mysql:mysql /mysql/
color "正在实例数据初始化" 0
initialize_data_6
initialize_data_7
initialize_data_8
chown -R mysql:mysql /mysql/
# 创建主配置文件
color "正在创建主配置文件" 0
configuration_file_6
configuration_file_7
configuration_file_8
# 定制服务管理文件
systemctl_mysql
# 启动服务
start_mysql
# 测试是否存活
test_success
}
# 用户选择函数
select_mysql_version() {
echo "========================================="
echo " MySQL多实例安装选择菜单"
echo "========================================="
echo "请选择要安装的MySQL版本(可多选,用空格分隔):"
echo "1) 单实例 MySQL 5.6(每个版本多个实例)"
echo "2) 单实例 MySQL 5.7(每个版本多个实例)"
echo "3) 单实例 MySQL 8.4(每个版本多个实例)"
echo "4) 多实例 MySQL 5.6、5.7、8.4 多个版本 "
echo "0) 退出"
echo "-----------------------------------------"
read -p "请输入选项编号: " choices
# 重置选择变量
SINGLE_6=false
SINGLE_7=false
SINGLE_8=false
MORE_INSTANCE=false
for choice in $choices; do
case $choice in
1) SINGLE_6=true ;;
2) SINGLE_7=true ;;
3) SINGLE_8=true ;;
4) MORE_INSTANCE=true;;
0)
echo "已取消安装,退出脚本。"
exit 0
;;
*)
echo "无效选项: $choice"
select_mysql_version # 递归重新选择
return
;;
esac
done
# 显示选择结果
echo "-----------------------------------------"
echo "已选择的配置:"
[ "$SINGLE_6" = "true" ] && echo "- MySQL 5.6: 启用" || echo "- MySQL 5.6: 禁用"
[ "$SINGLE_7" = "true" ] && echo "- MySQL 5.7: 启用" || echo "- MySQL 5.7: 禁用"
[ "$SINGLE_8" = "true" ] && echo "- MySQL 8.4: 启用" || echo "- MySQL 8.4: 禁用"
[ "$MORE_INSTANCE" = "true" ] && echo "- 安装类型: 多实例" || echo "- 安装类型: 单实例"
echo "-----------------------------------------"
read -p "确认安装此配置吗?(y/n): " confirm
if [ "$confirm" != "y" ] && [ "$confirm" != "Y" ]; then
echo "已取消安装,退出脚本。"
exit 0
elif [ $(os_type) == "Rocky" ];then
install_mysql
else
color "不支持 $os_type " 2
fi
}
select_mysql_version


endl
评论