【脚本升级】银河麒麟V10一键安装MySQL9.3.0

安装截图:



脚本内容:

bash 复制代码
#!/bin/bash
# 自动处理运行中进程、清理数据目录并优化备份的MySQL安装脚本

# 版本设置
DEFAULT_VERSION="9.3.0"
GLIBC_VERSION="2.17"

# 颜色配置
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m'

# 日志配置
LOG_FILE="/var/log/mysql_install_$(date +%Y%m%d_%H%M%S).log"
exec > >(tee -a $LOG_FILE) 2>&1
MYSQL_ROOT_PASSWORD="123456"

# 进度条函数
progress_bar() {
    local duration=$1
    local width=50
    local interval=2
    local total_ticks=$((duration * 10))
    local steps=$((total_ticks / interval))
    
    echo -ne "${BLUE}["
    for ((i=0; i<width; i++)); do echo -ne " "; done
    echo -ne "] 0%${NC}\r"
    
    for ((i=0; i<steps; i++)); do
        sleep 0.$interval
        local percent=$((i * 100 / steps))
        local filled=$((i * width / steps))
        echo -ne "${BLUE}["
        for ((j=0; j<filled; j++)); do echo -ne "#"; done
        for ((j=filled; j<width; j++)); do echo -ne " "; done
        echo -ne "] $percent%${NC}\r"
    done
    echo -ne "${GREEN}["
    for ((i=0; i<width; i++)); do echo -ne "#"; done
    echo -ne "] 100%${NC}\n"
}

# 状态提示函数
success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
error() { echo -e "${RED}[ERROR]${NC} $1"; }
info() { echo -e "${BLUE}[INFO]${NC} $1"; }
warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; }

# 版本比较函数
version_ge() {
    local v1=(${1//./ })
    local v2=(${2//./ })
    local len=$(( ${#v1[@]} > ${#v2[@]} ? ${#v1[@]} : ${#v2[@]} ))
    
    for ((i=0; i<len; i++)); do
        local num1=${v1[i]:-0}
        local num2=${v2[i]:-0}
        if (( num1 > num2 )); then return 0; fi
        if (( num1 < num2 )); then return 1; fi
    done
    return 0
}

# 全量备份函数(添加--single-transaction参数)
full_backup() {
    info "开始MySQL全量备份..."
    local backup_dir="/backup/mysql/full"
    local backup_file="$backup_dir/mysql_full_$(date +%Y%m%d_%H%M%S).sql.gz"
    
    mkdir -p $backup_dir || { 
        error "无法创建全量备份目录 $backup_dir"
        return 1
    }
    
    # 添加--single-transaction确保InnoDB数据一致性
    mysqldump -uroot -p$MYSQL_ROOT_PASSWORD --single-transaction \
    --all-databases --routines --events --triggers | gzip > $backup_file
    
    if [ $? -eq 0 ]; then
        success "MySQL全量备份成功: $backup_file"
        find $backup_dir -name "mysql_full_*.sql.gz" -type f -mtime +30 -delete
        return 0
    else
        error "MySQL全量备份失败"
        return 1
    fi
}

# 增量备份函数
incremental_backup() {
    info "开始MySQL增量备份..."
    local backup_dir="/backup/mysql/incremental"
    local backup_file="$backup_dir/mysql_incr_$(date +%Y%m%d_%H%M%S).sql.gz"
    
    mkdir -p $backup_dir || { 
        error "无法创建增量备份目录 $backup_dir"
        return 1
    }
    
    local binlog_enabled=$(/usr/local/mysql/bin/mysql -uroot -p$MYSQL_ROOT_PASSWORD -e "SHOW VARIABLES LIKE 'log_bin';" 2>/dev/null | grep -c ON)
    
    if [ $binlog_enabled -eq 0 ]; then
        warning "未启用binlog,将启用并重启MySQL"
        sed -i '/log-bin/d' /etc/my.cnf
        echo "log-bin=mysql-bin" >> /etc/my.cnf
        service mysql restart || { error "MySQL重启失败"; return 1; }
        success "已启用binlog并重启MySQL"
        full_backup
        return $?
    fi
    
    local current_binlog=$(/usr/local/mysql/bin/mysql -uroot -p$MYSQL_ROOT_PASSWORD -e "SHOW MASTER STATUS;" 2>/dev/null | grep mysql-bin | awk '{print $1}')
    mysqlbinlog /data/mysql/$current_binlog | gzip > $backup_file
    
    if [ $? -eq 0 ]; then
        success "MySQL增量备份成功: $backup_file"
        find $backup_dir -name "mysql_incr_*.sql.gz" -type f -mtime +7 -delete
        return 0
    else
        error "MySQL增量备份失败"
        return 1
    fi
}

# 检查SELinux状态
get_selinux_status() {
    if [ -f /usr/sbin/getenforce ]; then
        echo $(getenforce)
    else
        echo "Disabled"
    fi
}

# 主程序
clear
echo -e "${PURPLE}##############################################################################${NC}"
echo -e "${PURPLE}#                        MySQL 一键安装与备份工具                            #${NC}"
echo -e "${PURPLE}##############################################################################${NC}"
echo "安装日志将同时输出到屏幕和文件: $LOG_FILE"
echo

start_time=$(date +%s)
info "MySQL安装流程启动"

# 1. 输入版本信息
echo -e "\n${CYAN}【步骤1/13】请输入要安装的MySQL版本(默认: $DEFAULT_VERSION):${NC}"
read version
version=${version:-$DEFAULT_VERSION}
info "准备安装MySQL $version"

PACKAGE_NAME="mysql-${version}-linux-glibc${GLIBC_VERSION}-x86_64.tar.xz"
info "安装包名称: $PACKAGE_NAME"

# 2. 清理旧文件
echo -e "\n${CYAN}【步骤2/13】清理旧的MySQL文件...${NC}"
find / -name mysql | xargs rm -rf || warning "清理旧文件时出现问题"
success "旧文件清理完成"

# 3. 检查并终止MySQL进程(自动处理)
echo -e "\n${CYAN}【步骤3/13】检查并处理MySQL进程...${NC}"
mysql_pids=$(ps -ef | grep mysqld | grep -v grep | awk '{print $2}')
if [ -n "$mysql_pids" ]; then
    info "发现运行中的MySQL进程: $mysql_pids"
    info "正在终止MySQL进程..."
    # 强制终止所有MySQL进程
    kill -9 $mysql_pids || {
        error "终止MySQL进程失败,请手动执行: kill -9 $mysql_pids"
        exit 1
    }
    # 确认进程已终止
    sleep 2
    remaining_pids=$(ps -ef | grep mysqld | grep -v grep | awk '{print $2}')
    if [ -n "$remaining_pids" ]; then
        error "仍有MySQL进程未终止: $remaining_pids,请手动处理"
        exit 1
    fi
    success "所有MySQL进程已成功终止"
    
    # 删除数据目录
    info "正在删除旧数据目录: /data/mysql"
    rm -rf /data/mysql || {
        error "删除/data/mysql目录失败,请手动删除"
        exit 1
    }
    success "旧数据目录已删除"
else
    success "无运行中的MySQL进程"
fi

# 4. 检查系统依赖
echo -e "\n${CYAN}【步骤4/13】检查系统依赖...${NC}"
glibc_installed=$(ldd --version | grep -oE 'glibc [0-9]+\.[0-9]+' | awk '{print $2}')
if [ -n "$glibc_installed" ]; then
    info "当前glibc版本: $glibc_installed,要求: $GLIBC_VERSION"
    if ! version_ge "$glibc_installed" "$GLIBC_VERSION"; then
        error "系统glibc版本过低(当前: $glibc_installed,需要: $GLIBC_VERSION)"
        exit 1
    fi
else
    warning "无法检测glibc版本,跳过检查"
fi

mem_total=$(free -g | awk '/Mem:/{print $2}')
if [ -z "$mem_total" ] || [ $mem_total -lt 2 ]; then
    warning "内存不足(当前: ${mem_total:-未知}GB,建议至少2GB)"
fi
success "系统依赖检查通过"

# 5. 检查SELinux状态
echo -e "\n${CYAN}【步骤5/13】检查SELinux设置...${NC}"
selinux_status=$(get_selinux_status)
info "当前SELinux状态: $selinux_status"
if [ "$selinux_status" = "Enforcing" ]; then
    warning "SELinux处于强制模式,可能导致权限问题"
    setenforce 0 || warning "关闭SELinux失败,请手动处理"
fi
success "SELinux检查完成"

# 6. 准备目录和用户
echo -e "\n${CYAN}【步骤6/13】准备目录和用户...${NC}"
current_dir=$(pwd)
target_dir="/opt"

if [ ! -d "$target_dir" ]; then
    error "目录 $target_dir 不存在,请检查系统"
    exit 1
fi
success "确认 $target_dir 目录存在"

mv $current_dir/* $target_dir || warning "部分文件移动失败(可能已存在)"
success "文件移动完成"

# 重新创建数据目录(确保干净的环境)
mkdir -p /data/mysql
groupadd mysql || warning "mysql组已存在"
useradd -r -g mysql mysql || warning "mysql用户已存在"
chown -R mysql:mysql /data/mysql
chmod 700 /data/mysql

if [ "$selinux_status" != "Disabled" ] && command -v chcon &> /dev/null; then
    chcon -R -t mysqld_db_t /data/mysql 2>/dev/null || warning "SELinux上下文设置失败(可忽略)"
else
    info "SELinux未启用,跳过上下文设置"
fi
success "数据目录和用户准备完成"

# 7. 解压安装包
echo -e "\n${CYAN}【步骤7/13】解压安装包...${NC}"
cd /opt
if [ ! -f "$PACKAGE_NAME" ]; then
    error "安装包 $PACKAGE_NAME 不存在于/opt目录"
    exit 1
fi
info "正在解压 $PACKAGE_NAME(过程省略)"
tar -xJpf $PACKAGE_NAME >> $LOG_FILE 2>&1 || { error "解压失败"; exit 1; }
success "安装包解压完成"

# 8. 移动安装目录
echo -e "\n${CYAN}【步骤8/13】移动安装目录...${NC}"
mv mysql-$version-linux-glibc${GLIBC_VERSION}-x86_64/ /usr/local/mysql || { error "移动目录失败"; exit 1; }
chown -R mysql:mysql /usr/local/mysql/
success "安装目录移动完成"

# 9. 卸载冲突组件
echo -e "\n${CYAN}【步骤9/13】卸载冲突组件...${NC}"
yum remove mariadb* -y >/dev/null 2>&1 || warning "卸载冲突组件时出错"
success "冲突组件处理完成"

# 10. 配置my.cnf
echo -e "\n${CYAN}【步骤10/13】配置参数文件...${NC}"
cat <<EOF >/etc/my.cnf
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/mysql
socket=/tmp/mysql.sock
log-error=/data/mysql/mysql.err
pid-file=/data/mysql/mysql.pid
server_id=1
port=3306
sort_buffer_size = 4M
join_buffer_size = 4M
read_buffer_size = 8M
read_rnd_buffer_size = 4M
tmp_table_size = 32M
max_heap_table_size = 32M
sync_binlog = 1
innodb_flush_log_at_trx_commit = 1
innodb_flush_method=O_DIRECT
character-set-server=utf8mb4
innodb_file_per_table=on
max_connections=10000
binlog_format=row
log-bin=mysql-bin
gtid-mode=on
enforce-gtid-consistency=on
[mysql]
socket=/tmp/mysql.sock
prompt="\u@\h:\d>"
[client]
EOF
success "my.cnf配置完成"

# 11. 初始化数据库
echo -e "\n${CYAN}【步骤11/13】初始化数据库...${NC}"
echo -e "${YELLOW}初始化可能需要几分钟,请耐心等待...${NC}"
cd /usr/local/mysql/bin

if [ ! -f "./mysqld" ]; then
    error "未找到mysqld二进制文件,解压可能不完整"
    exit 1
fi

./mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql/ --datadir=/data/mysql/ --user=mysql --initialize

if [ $? -eq 0 ]; then
    success "数据库初始化完成"
else
    error "数据库初始化失败!详细错误信息:"
    echo "----------------------------------------"
    cat /data/mysql/mysql.err | grep -i error
    echo "----------------------------------------"
    error "请根据以上错误信息排查问题后重试"
    exit 1
fi

# 12. 配置服务与环境变量
echo -e "\n${CYAN}【步骤12/13】配置服务与环境变量...${NC}"
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
chmod +x /etc/init.d/mysql

export PATH=$PATH:/usr/local/mysql/bin:/usr/local/mysql/lib
echo 'export PATH=$PATH:/usr/local/mysql/bin:/usr/local/mysql/lib' >> /etc/profile
source /etc/profile || warning "刷新环境变量失败,已手动添加"

if ! command -v mysql &> /dev/null; then
    error "mysql命令仍不可用,请检查安装目录:/usr/local/mysql/bin"
    exit 1
fi
success "服务与环境变量配置完成"

# 13. 启动服务
echo -e "\n${CYAN}【步骤13/13】启动服务...${NC}"
echo -e "${YELLOW}启动服务中...${NC}"
progress_bar 10

service mysql start || {
    warning "首次启动失败,尝试第二次启动..."
    sleep 3
    service mysql start || {
        error "服务启动失败!查看详细日志:/data/mysql/mysql.err"
        exit 1
    }
}
success "MySQL服务启动成功"

# 后续配置 - 处理密码过期
echo -e "\n${CYAN}【额外配置】设置root用户认证方式...${NC}"
MYSQL_OLDPASSWORD=$(awk '/A temporary password/{print $NF}' /data/mysql/mysql.err)
if [ -z "$MYSQL_OLDPASSWORD" ]; then
    error "无法获取临时密码,请查看日志:/data/mysql/mysql.err"
    exit 1
fi

/usr/local/mysql/bin/mysql --connect-expired-password -uroot -p"$MYSQL_OLDPASSWORD" -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '$MYSQL_ROOT_PASSWORD'; flush privileges;" || {
    error "修改密码失败,请手动执行:"
    echo "/usr/local/mysql/bin/mysql --connect-expired-password -uroot -p'$MYSQL_OLDPASSWORD'"
    echo "ALTER USER 'root'@'localhost' IDENTIFIED BY '$MYSQL_ROOT_PASSWORD'; flush privileges;"
    exit 1
}

# 允许远程访问
/usr/local/mysql/bin/mysql --connect-expired-password -uroot -p"$MYSQL_ROOT_PASSWORD" -e "update mysql.user set host ='%' where user ='root'; flush privileges;"
success "密码和远程访问配置完成"

# 配置开机启动
chkconfig --add mysql
chkconfig mysql on || warning "开机启动配置可能失败"

# 安装完成
end_time=$(date +%s)
execution_time=$((end_time - start_time))

echo -e "\n${GREEN}##############################################################################${NC}"
echo -e "${GREEN}#                        MySQL 安装成功!                                    #${NC}"
echo -e "${GREEN}#  版本: $version                                                           #${NC}"
echo -e "${GREEN}#  安装路径: /usr/local/mysql                                                #${NC}"
echo -e "${GREEN}#  数据路径: /data/mysql                                                     #${NC}"
echo -e "${GREEN}#  初始密码: $MYSQL_ROOT_PASSWORD                                            #${NC}"
echo -e "${GREEN}#  安装耗时: ${execution_time} 秒                                            #${NC}"
echo -e "${GREEN}#  日志文件: $LOG_FILE                                                      #${NC}"
echo -e "${GREEN}##############################################################################${NC}\n"

# 初始全量备份
full_backup

echo -e "${CYAN}备份命令:${NC}"
echo -e "${YELLOW}  全量备份: $0 full_backup${NC}"
echo -e "${YELLOW}  增量备份: $0 incremental_backup${NC}"

if [ "$1" = "full_backup" ]; then
    full_backup
elif [ "$1" = "incremental_backup" ]; then
    incremental_backup
fi
相关推荐
y = xⁿ11 小时前
MySQL八股知识合集
android·mysql·adb
andr_gale11 小时前
04_rc文件语法规则
android·framework·aosp
一只小白菜12 小时前
macOS MySQL 简易操作手册(基于 zsh + MySQL 8.0.24)
adb
祖国的好青年12 小时前
VS Code 搭建 React Native 开发环境(Windows 实战指南)
android·windows·react native·react.js
黄林晴13 小时前
警惕!AGP 9.2 别只改版本号,R8 规则与构建链路全线收紧
android·gradle
小米渣的逆袭13 小时前
Android ADB 完全使用指南
android·adb
儿歌八万首13 小时前
Jetpack Compose Canvas 进阶:结合 animateFloatAsState 让自定义图形动起来
android·动画·compose
zhangphil14 小时前
Android Page 3 Flow读sql数据库媒体文件,Kotlin
android·kotlin
神探小白牙15 小时前
echarts,3d堆叠图
android·3d·echarts