当前位置: 首页 > article >正文

mysql多实例及单实例安装脚本

一 运行脚本前需要下载相应的安装包

下载相应的安装包
 wget https://cdn.mysql.com/archives/mysql-8.0/mysql-8.0.37-linux-glibc2.12-x86_64.tar.xz

在这里插入图片描述
在这里插入图片描述

运行脚本如下

#!/bin/bash
set -e
echo "-----------------------------MySQL 管理脚本--------------------------------------"
start_time=$(date +%s)

# 安全校验
if [ $(id -u) != 0 ]; then
    echo -e "\e[31m必须使用root用户执行本脚本\e[0m"
    exit 1
fi

# 密码恢复函数
recover_password() {
    echo "-----------------------------密码恢复模式--------------------------------------"
    read -p "请输入要恢复的实例类型 (1-单实例 2-多实例): " recover_type
    read -p "请输入MySQL安装路径(默认/usr/local/mysql): " MYSQL_HOME
    MYSQL_HOME=${MYSQL_HOME:-/usr/local/mysql}

    if [ "$recover_type" == "1" ]; then
        DATA_DIR="/mnt/mysql"
        SERVICE_NAME="mysqld"
    else
        read -p "请输入实例名称 (如instance1): " instance_name
        DATA_DIR="/mnt/mysql_${instance_name}"
        SERVICE_NAME="mysql_${instance_name}"
    fi

    echo "正在停止MySQL服务..."
    systemctl stop $SERVICE_NAME || true

    echo "以跳过权限方式启动..."
    $MYSQL_HOME/bin/mysqld_safe --skip-grant-tables --datadir=$DATA_DIR &
    sleep 5

    echo "重置root密码..."
    $MYSQL_HOME/bin/mysql -uroot <<EOF
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '${MYSQL_ROOT_PASSWORD}';
EOF

    echo "重启服务..."
    pkill mysqld
    sleep 3
    systemctl start $SERVICE_NAME

    echo -e "\e[32m密码已重置为:${MYSQL_ROOT_PASSWORD}\e[0m"
    exit 0
}

# 主菜单
echo "请选择操作类型:"
echo "1. 全新安装MySQL"
echo "2. 恢复root密码"
read -p "请输入选项 (1/2): " main_choice

if [ "$main_choice" == "2" ]; then
    read -sp "请输入新root密码: " MYSQL_ROOT_PASSWORD
    echo
    recover_password
fi

# 读取安装信息
echo "-----------------------------安装配置--------------------------------------"
read -sp "请输入MySQL root密码(默认123456): " MYSQL_ROOT_PASSWORD
MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD:-123456}
echo

if [ ${#MYSQL_ROOT_PASSWORD} -lt 6 ]; then
    echo -e "\e[31m错误:密码至少需要6个字符\e[0m"
    exit 1
fi

read -p "输入安装版本(如8.0.27): " version
read -p "请输入安装路径(默认/usr/local/mysql): " MYSQL_HOME
MYSQL_HOME=${MYSQL_HOME:-/usr/local/mysql}

# 安装模式选择
echo "请选择安装模式:"
echo "1. 单实例"
echo "2. 多实例"
read -p "请输入选项 (1/2): " mode

# 清理旧版本
echo "-----------------------------清理旧版本--------------------------------------"
pkill -9 mysqld || true
find /etc /usr /var -name '*mysql*' -exec rm -rf {} \; 2>/dev/null || true
rm -rf $MYSQL_HOME /mnt/mysql* || true

# 创建目录结构
echo "-----------------------------创建目录结构--------------------------------------"
mkdir -p $MYSQL_HOME
groupadd mysql || true
useradd -r -g mysql -s /bin/false mysql || true

# 安装依赖
echo "-----------------------------安装依赖库--------------------------------------"
yum install -y libaio numactl-libs ncurses-compat-libs

# 解压安装包
echo "-----------------------------解压安装包--------------------------------------"
cd /opt
tar -xvf mysql-${version}-linux-glibc2.12-x86_64.tar.xz
mv mysql-${version}-linux-glibc2.12-x86_64/* $MYSQL_HOME

# 通用初始化函数
initialize_instance() {
    local DATA_DIR=$1
    local PORT=$2
    local CONF_FILE=$3
    local SERVICE_NAME=$4

    mkdir -p $DATA_DIR
    chown -R mysql:mysql $DATA_DIR

    cat > $CONF_FILE <<EOF
[mysqld]
user=mysql
basedir=$MYSQL_HOME
datadir=$DATA_DIR
socket=$DATA_DIR/mysql.sock
log-error=$DATA_DIR/mysql.err
pid-file=$DATA_DIR/mysql.pid
server_id=$PORT
port=$PORT
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
lower_case_table_names=1
max_connections=10000
default_authentication_plugin=mysql_native_password

[mysql]
socket=$DATA_DIR/mysql.sock
default-character-set=utf8mb4

[client]
socket=$DATA_DIR/mysql.sock
EOF

    $MYSQL_HOME/bin/mysqld --defaults-file=$CONF_FILE --initialize-insecure --user=mysql
    chown -R mysql:mysql $DATA_DIR

    cat > /etc/systemd/system/${SERVICE_NAME}.service <<EOF
[Unit]
Description=MySQL Server
After=network.target

[Service]
User=mysql
Group=mysql
Type=notify
ExecStart=$MYSQL_HOME/bin/mysqld --defaults-file=$CONF_FILE
LimitNOFILE=65535
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

    systemctl daemon-reload
    systemctl start $SERVICE_NAME
    systemctl enable $SERVICE_NAME

    # 等待服务启动
    echo -n "等待MySQL服务启动"
    retries=0
    while [ $retries -lt 30 ]; do
        if [ -S $DATA_DIR/mysql.sock ]; then
            echo -e "\n服务启动成功!"
            break
        fi
        echo -n "."
        sleep 1
        ((retries++))
    done

    $MYSQL_HOME/bin/mysql -S $DATA_DIR/mysql.sock <<EOF
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '${MYSQL_ROOT_PASSWORD}';
CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '${MYSQL_ROOT_PASSWORD}';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
DELETE FROM mysql.user WHERE User='';
FLUSH PRIVILEGES;
EOF
}

# 安装单实例
if [ "$mode" == "1" ]; then
    echo "-----------------------------安装单实例--------------------------------------"
    initialize_instance "/mnt/mysql" 3306 "/etc/my.cnf" "mysqld"
else
    echo "-----------------------------安装多实例--------------------------------------"
    declare -A instances=(
        ["instance1"]=3306
        ["instance2"]=3307
        ["instance3"]=3308
    )

    for instance in "${!instances[@]}"; do
        echo "正在安装实例: $instance"
        initialize_instance "/mnt/mysql_${instance}" "${instances[$instance]}" "/etc/my_${instance}.cnf" "mysql_${instance}"
    done
fi

# 环境配置
grep -q "MYSQL_HOME" /etc/profile || {
    echo "export MYSQL_HOME=$MYSQL_HOME" >> /etc/profile
    echo 'export PATH=$MYSQL_HOME/bin:$PATH' >> /etc/profile
}
source /etc/profile

echo "-----------------------------安装完成--------------------------------------"
echo -e "\e[32m连接信息:\e[0m"
if [ "$mode" == "1" ]; then
    echo "本地连接: mysql -uroot -p'${MYSQL_ROOT_PASSWORD}' -S /mnt/mysql/mysql.sock"
else
    for instance in "${!instances[@]}"; do
        echo "实例 $instance: mysql -uroot -p'${MYSQL_ROOT_PASSWORD}' -S /mnt/mysql_${instance}/mysql.sock"
    done
fi
echo "总耗时: $(( $(date +%s) - start_time ))秒"

http://www.kler.cn/a/584850.html

相关文章:

  • k8s面试题总结(十五)
  • Docker根目录迁移与滚动日志设置
  • react和vue 基础使用对比
  • 数据库MySQL原理(相关程序)
  • 瞭解安全防火牆術語(適合剛接觸Firepower的使用者)
  • leetcode:728. 自除数(python3解法)
  • 第6节: 网络安全入门:ACL与NAT技术详解
  • ConcurrentModificationException:检测到并发修改完美解决方法
  • 计算机二级web易错点(2)-选择题
  • 通过C++编程语言实现“数据结构“课程中的树
  • Pycharm(五)序列的操作
  • 基于ragflow中deepdoc对pdf文档的rag系统
  • QQuick3D-Camera的介绍
  • 【2025前端高频面试题——系列三之vue生命周期:vue3】
  • 机器学习(李宏毅)——Explainable AI
  • 【UniApp跳转外部链接】实现方案
  • (全)2024下半年真题 系统架构设计师 综合知识 答案解析01
  • Ceph(2):Ceph简介
  • OpenText ETX 助力欧洲之翼航空公司远程工作升级
  • 98. 验证二叉搜索树