提交 2a283bbe authored 作者: 陈泽健's avatar 陈泽健

feat(fix):调整mysql_x86函数,去除数据库导入操作

上级 7ec3bad3
......@@ -137,264 +137,6 @@ function docker_x86() {
# - $PWD/UbainsmysqlBakUp.sh
# 并确保宿主机 /data/middleware/mysql/ 目录存在
#==============================================================#
function mysql_x86() {
# --- 配置参数 ---
local container_name="umysql"
local image_tar="/data/temp/umysql.tar.gz"
local image_name="139.9.60.86:5000/umysql:v5.2"
local image_id="4c5574ba4b04"
local mysql_root_password="dNrprU&2S"
local mysql_port="8306"
local host_data_dir="/data/middleware/mysql"
local backup_script_src="$PWD/UbainsmysqlBakUp.sh"
local backup_script_dst="/usr/local/docker/UbainsmysqlBakUp.sh"
local cron_user="root"
log "INFO" "=================================================================="
log "INFO" "开始部署 MySQL 服务 (Docker 版, x86)"
log "INFO" "=================================================================="
# 自动判断是否需要 sudo
local SUDO=""
if [[ $(id -u) -ne 0 ]]; then
if command -v sudo >/dev/null; then
SUDO="sudo"
else
log "ERROR" "⛔ 当前不是 root 用户,且系统未安装 sudo,无法执行操作"
return 1
fi
fi
# ------------------- 检查容器是否已运行 -------------------
log "INFO" "🔍 检查容器 '$container_name' 是否已运行..."
if $SUDO docker ps --format '{{.Names}}' | grep -qw "$container_name"; then
log "INFO" "✅ 容器 '$container_name' 已在运行"
return 0
fi
# ------------------- 检查镜像是否存在 -------------------
log "INFO" "🔍 检查镜像 $image_name 是否存在..."
if $SUDO docker images --format '{{.Repository}}:{{.Tag}}' | grep -qw "$image_name"; then
log "INFO" "✅ 镜像 $image_name 已存在"
else
log "WARN" "❌ 镜像 $image_name 不存在,开始加载离线包..."
if [[ ! -f "$image_tar" ]]; then
log "ERROR" "⛔ 镜像文件不存在: $image_tar"
return 1
fi
if $SUDO docker load -i "$image_tar"; then
log "INFO" "🎉 镜像加载成功"
else
log "ERROR" "⛔ 镜像加载失败,请检查文件完整性"
return 1
fi
fi
# ------------------- 启动容器 -------------------
log "INFO" "🚀 正在启动 MySQL 容器: $container_name"
$SUDO docker run -d \
--name "$container_name" \
--mac-address="02:42:ac:11:00:05" \
-p "${mysql_port}:3306" \
-v "${host_data_dir}/conf/my.cnf:/etc/mysql/my.cnf" \
-v "${host_data_dir}/conf.d:/etc/mysql/conf.d" \
-v "${host_data_dir}/log:/var/log/mysql" \
-v "${host_data_dir}/data:/var/lib/mysql" \
-v "/etc/localtime:/etc/localtime:ro" \
--restart=always \
-e "MYSQL_ROOT_PASSWORD=$mysql_root_password" \
"$image_name"
if [[ $? -ne 0 ]]; then
log "ERROR" "⛔ 容器启动失败,请检查端口占用或磁盘权限"
log "INFO" "📄 查看最近容器日志以排查问题..."
$SUDO docker logs "$container_name" 2>/dev/null || true
return 1
fi
# ------------------- 2. 【核心修改】主动探测 MySQL 服务状态 -------------------
log "INFO" "⏳ 正在等待 MySQL 服务就绪 (主动探测中)..."
# 定义一个内部函数用于等待
wait_for_mysql() {
local max_retries=60 # 最大尝试次数 (60 * 2秒 = 120秒)
local count=0
# 循环检测
while [ $count -lt $max_retries ]; do
# 使用 mysqladmin ping 检测
# 注意:这里使用 127.0.0.1 而不是 localhost,避免使用 socket 文件可能带来的路径问题
if $SUDO docker exec "$container_name" mysqladmin ping -h"127.0.0.1" -u"root" -p"$mysql_root_password" --silent 2>/dev/null; then
log "INFO" "✅ MySQL 服务已就绪!"
return 0
fi
# 如果失败,等待 2 秒后重试
sleep 2
count=$((count + 1))
# 每 10 次打印一次进度,避免看起来像卡死
if [ $((count % 10)) -eq 0 ]; then
log "INFO" " 等待中... (已尝试 ${count}/${max_retries} 次)"
fi
done
log "ERROR" "⛔ 等待 MySQL 启动超时,请检查容器日志"
$SUDO docker logs "$container_name" | tail -20
return 1
}
# 调用等待函数,如果返回失败则退出整个函数
wait_for_mysql || return 1
log "INFO" "✅ 容器启动成功,等待 MySQL 服务就绪..."
# ------------------- 3. 【关键优化】清理潜在的死锁源 -------------------
log "INFO" "🧹 正在清理潜在的僵尸连接..."
# 获取所有非系统用户的连接 ID 并杀掉,防止旧事务占用锁
# 使用 awk 过滤掉 'Id' 标题行和 'system user' 等系统进程
local kill_sql=$($SUDO docker exec "$container_name" mysql -uroot -p"$mysql_root_password" -e "SHOW FULL PROCESSLIST;" 2>/dev/null | \
awk 'NR>1 && $4 != "system user" && $4 != "event_scheduler" && $11 !~ /NULL/ {print "KILL " $1 ";"}')
if [[ -n "$kill_sql" ]]; then
# 将所有 KILL 命令拼接执行
echo "$kill_sql" | $SUDO docker exec -i "$container_name" mysql -uroot -p"$mysql_root_password" 2>/dev/null
log "INFO" "✅ 已清理残留连接"
else
log "INFO" "✅ 无残留连接需要清理"
fi
# ------------------- 初始化数据库:创建用户、数据库、授权、导入数据 -------------------
log "INFO" "🔧 初始化数据库:创建用户、数据库、授权..."
# ------------------- 4. 拷贝 SQL 文件 -------------------
log "INFO" "📁 正在拷贝 SQL 文件到容器..."
local sql_files=("nacos_mysql.sql" "devops_voice.sql" "huazhao2.sql" "offline.sql" "ubains.sql" "devops.sql")
for file in "${sql_files[@]}"; do
if $SUDO docker cp "/data/temp/$file" "$container_name:/tmp/$file"; then
log "INFO" "✅ 拷贝 $file 成功"
else
log "ERROR" "⛔ 拷贝 $file 失败"
return 1
fi
done
# ------------------- 6. 【修正版】带死锁重试的导入函数 -------------------
import_sql() {
local db=$1
local file=$2
local max_retries=3
local retry_count=0
local success=false
while [ $retry_count -lt $max_retries ]; do
log "INFO" "📥 正在导入 $file$db... (尝试 $((retry_count + 1))/$max_retries)"
# 【关键修改】使用 cat 管道符,让容器自己读取文件并传给 mysql
# 这样既避免了宿主机的路径问题,又比 source 命令更稳定
local output
output=$($SUDO docker exec "$container_name" sh -c "cat /tmp/$file | mysql -uroot -p'$mysql_root_password' $db" 2>&1)
local exit_code=$?
if [ $exit_code -eq 0 ]; then
log "INFO" "✅ $file 导入成功"
success=true
break
elif echo "$output" | grep -q "Deadlock found"; then
retry_count=$((retry_count + 1))
if [ $retry_count -lt $max_retries ]; then
log "WARN" "⚠️ 检测到死锁 (Error 1213),等待 5 秒后重试..."
sleep 5
else
log "ERROR" "⛔ $file 导入失败:重试 $max_retries 次后仍遇到死锁"
log "ERROR" "📄 错误详情: $output"
fi
else
# 非死锁错误,直接失败
log "ERROR" "⛔ $file 导入失败 (非死锁错误)"
log "ERROR" "📄 错误详情: $output"
return 1
fi
done
if [ "$success" = false ]; then
return 1
fi
return 0
}
# ------------------- 7. 执行导入 -------------------
# 导入 Nacos 并更新 IP
import_sql "nacos_mysql" "nacos_mysql.sql" || return 1
log "INFO" "🔄 正在更新 Nacos 配置 IP..."
$SUDO docker exec "$container_name" mysql -uroot -p"$mysql_root_password" -D nacos_mysql -e \
"UPDATE config_info SET content = REPLACE(content, '192.168.9.84', '"$server_ip"')
WHERE data_id IN ('auth-sso-auth-dev.yml','auth-sso-gateway-dev.yml','auth-sso-system-dev.yml');"
$SUDO docker exec "$container_name" mysql -uroot -p"$mysql_root_password" -D nacos_mysql -e "FLUSH PRIVILEGES;"
# 导入其他数据库
import_sql "devops_voice" "devops_voice.sql" || return 1
import_sql "huazhao2" "huazhao2.sql" || return 1
import_sql "offline" "offline.sql" || return 1
import_sql "ubains" "ubains.sql" || return 1
import_sql "devops" "devops.sql" || return 1
# ------------------- 提升用户权限 -------------------
for user in "root" "mysqluser"; do
$SUDO docker exec "$container_name" mysql -u"root" -p"$mysql_root_password" -e \
"UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='$user' AND Host='%'; FLUSH PRIVILEGES;" 2>/dev/null
done
log "INFO" "✅ 用户权限提升完成"
# ------------------- 部署备份脚本 -------------------
log "INFO" "📦 部署备份脚本到容器..."
$SUDO mkdir -p "$(dirname "$backup_script_dst")"
if $SUDO cp -f "$backup_script_src" "$backup_script_dst"; then
$SUDO chmod +x "$backup_script_dst"
log "INFO" "✅ 备份脚本已复制到: $backup_script_dst"
else
log "ERROR" "⛔ 备份脚本复制失败,请检查源文件是否存在"
return 1
fi
# ------------------- 配置定时任务 -------------------
log "INFO" "⏰ 配置定时备份任务 (每天 13:00)"
local cron_job="0 13 * * * bash $backup_script_dst"
if $SUDO crontab -u "$cron_user" -l 2>/dev/null | grep -Fq "$backup_script_dst"; then
log "INFO" "✅ 定时任务已存在"
else
( $SUDO crontab -u "$cron_user" -l 2>/dev/null; echo "$cron_job" ) | $SUDO crontab -u "$cron_user" -
if [[ $? -eq 0 ]]; then
log "INFO" "✅ 定时任务添加成功"
else
log "ERROR" "⛔ 定时任务添加失败"
return 1
fi
fi
# ------------------- 重启 crond -------------------
log "INFO" "🔄 重启 crond 服务..."
if command -v systemctl >/dev/null; then
$SUDO systemctl restart crond || $SUDO systemctl restart cron
else
$SUDO service crond restart || $SUDO service cron restart
fi
log "INFO" "✅ crond 服务已重启"
# ------------------- 最终状态输出 -------------------
log "INFO" "🎉 MySQL 部署完成!"
$SUDO docker ps --filter "name=$container_name" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
return 0
}
#function mysql_x86() {
# # --- 配置参数 ---
# local container_name="umysql"
......@@ -473,149 +215,138 @@ function mysql_x86() {
# return 1
# fi
#
# sleep 120
# # ------------------- 2. 【核心修改】主动探测 MySQL 服务状态 -------------------
# log "INFO" "⏳ 正在等待 MySQL 服务就绪 (主动探测中)..."
#
# log "INFO" "✅ 容器启动成功,等待 MySQL 服务就绪..."
#
# # ------------------- 初始化数据库:创建用户、数据库、授权、导入数据 -------------------
# log "INFO" "🔧 初始化数据库:创建用户、数据库、授权..."
#
# log "INFO" "🔧 初始化数据库:创建用户、数据库、授权..."
# # 定义一个内部函数用于等待
# wait_for_mysql() {
# local max_retries=60 # 最大尝试次数 (60 * 2秒 = 120秒)
# local count=0
#
# # 先拷贝 nacos_mysql.sql 到容器内
# log "INFO" "📁 拷贝 /data/temp/nacos_mysql.sql 到容器 '$container_name' 内..."
# if $SUDO docker cp "/data/temp/nacos_mysql.sql" "$container_name:/tmp/nacos_mysql.sql"; then
# log "INFO" "✅ SQL 文件已成功拷贝到容器内"
# else
# log "ERROR" "⛔ 无法拷贝 nacos_mysql.sql 到容器,请检查文件路径或容器状态"
# return 1
# # 循环检测
# while [ $count -lt $max_retries ]; do
# # 使用 mysqladmin ping 检测
# # 注意:这里使用 127.0.0.1 而不是 localhost,避免使用 socket 文件可能带来的路径问题
# if $SUDO docker exec "$container_name" mysqladmin ping -h"127.0.0.1" -u"root" -p"$mysql_root_password" --silent 2>/dev/null; then
# log "INFO" "✅ MySQL 服务已就绪!"
# return 0
# fi
#
# # 先拷贝 devops_voice.sql 到容器内
# log "INFO" "📁 拷贝 /data/temp/devops_voice.sql 到容器 '$container_name' 内..."
# if $SUDO docker cp "/data/temp/devops_voice.sql" "$container_name:/tmp/devops_voice.sql"; then
# log "INFO" "✅ SQL 文件已成功拷贝到容器内"
# else
# log "ERROR" "⛔ 无法拷贝 devops_voice.sql 到容器,请检查文件路径或容器状态"
# return 1
# # 如果失败,等待 2 秒后重试
# sleep 2
# count=$((count + 1))
# # 每 10 次打印一次进度,避免看起来像卡死
# if [ $((count % 10)) -eq 0 ]; then
# log "INFO" " 等待中... (已尝试 ${count}/${max_retries} 次)"
# fi
# done
#
# # 先拷贝 huazhao2.sql 到容器内
# log "INFO" "📁 拷贝 /data/temp/huazhao2.sql 到容器 '$container_name' 内..."
# if $SUDO docker cp "/data/temp/huazhao2.sql" "$container_name:/tmp/huazhao2.sql"; then
# log "INFO" "✅ SQL 文件已成功拷贝到容器内"
# else
# log "ERROR" "⛔ 无法拷贝 huazhao2.sql 到容器,请检查文件路径或容器状态"
# log "ERROR" "⛔ 等待 MySQL 启动超时,请检查容器日志"
# $SUDO docker logs "$container_name" | tail -20
# return 1
# fi
# }
#
# # 调用等待函数,如果返回失败则退出整个函数
# wait_for_mysql || return 1
#
# log "INFO" "✅ 容器启动成功,等待 MySQL 服务就绪..."
#
# # 先拷贝 offline.sql 到容器内
# log "INFO" "📁 拷贝 /data/temp/offline.sql 到容器 '$container_name' 内..."
# if $SUDO docker cp "/data/temp/offline.sql" "$container_name:/tmp/offline.sql"; then
# log "INFO" "✅ SQL 文件已成功拷贝到容器内"
# # ------------------- 3. 【关键优化】清理潜在的死锁源 -------------------
# log "INFO" "🧹 正在清理潜在的僵尸连接..."
# # 获取所有非系统用户的连接 ID 并杀掉,防止旧事务占用锁
# # 使用 awk 过滤掉 'Id' 标题行和 'system user' 等系统进程
# local kill_sql=$($SUDO docker exec "$container_name" mysql -uroot -p"$mysql_root_password" -e "SHOW FULL PROCESSLIST;" 2>/dev/null | \
# awk 'NR>1 && $4 != "system user" && $4 != "event_scheduler" && $11 !~ /NULL/ {print "KILL " $1 ";"}')
#
# if [[ -n "$kill_sql" ]]; then
# # 将所有 KILL 命令拼接执行
# echo "$kill_sql" | $SUDO docker exec -i "$container_name" mysql -uroot -p"$mysql_root_password" 2>/dev/null
# log "INFO" "✅ 已清理残留连接"
# else
# log "ERROR" "⛔ 无法拷贝 offline.sql 到容器,请检查文件路径或容器状态"
# return 1
# log "INFO" "✅ 无残留连接需要清理"
# fi
#
# # 定义要执行的 SQL 命令序列(注意顺序)
# local init_sql=(
# "CREATE USER IF NOT EXISTS 'nacos'@'%' IDENTIFIED BY 'nacos2025';"
# "CREATE USER IF NOT EXISTS 'mysqluser'@'%' IDENTIFIED BY 'dNrprU&2S';"
# "CREATE DATABASE IF NOT EXISTS nacos_mysql CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
# "CREATE DATABASE IF NOT EXISTS devops CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
# "CREATE DATABASE IF NOT EXISTS devops_voice CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
# "CREATE DATABASE IF NOT EXISTS offline CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
# "CREATE DATABASE IF NOT EXISTS huazhao2 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
# "GRANT ALL PRIVILEGES ON nacos_mysql.* TO 'nacos'@'%';"
# "GRANT ALL PRIVILEGES ON devops.* TO 'mysqluser'@'%';"
# "FLUSH PRIVILEGES;"
# )
# # ------------------- 初始化数据库:创建用户、数据库、授权、导入数据 -------------------
# log "INFO" "🔧 初始化数据库:创建用户、数据库、授权..."
#
# # ------------------- 4. 拷贝 SQL 文件 -------------------
# log "INFO" "📁 正在拷贝 SQL 文件到容器..."
# local sql_files=("nacos_mysql.sql" "devops_voice.sql" "huazhao2.sql" "offline.sql" "ubains.sql" "devops.sql")
#
# # 执行前半部分 SQL
# for sql in "${init_sql[@]}"; do
# $SUDO docker exec "$container_name" mysql -uroot -p"$mysql_root_password" -e "$sql"
# if [[ $? -ne 0 ]]; then
# log "ERROR" "⛔ 执行SQL语句失败: $sql"
# log "INFO" "📄 输出容器最近日志..."
# $SUDO docker logs "$container_name" | tail -30
# for file in "${sql_files[@]}"; do
# if $SUDO docker cp "/data/temp/$file" "$container_name:/tmp/$file"; then
# log "INFO" "✅ 拷贝 $file 成功"
# else
# log "ERROR" "⛔ 拷贝 $file 失败"
# return 1
# fi
# done
#
# # 执行 source 导入 nacos_mysql.sql 到 nacos_mysql 数据库
# log "INFO" "📥 正在导入 nacos_mysql.sql 到数据库 nacos_mysql..."
# $SUDO docker exec "$container_name" mysql -uroot -p"$mysql_root_password" -D nacos_mysql -e "source /tmp/nacos_mysql.sql"
#
# if [[ $? -eq 0 ]]; then
# log "INFO" "✅ nacos_mysql.sql 数据导入成功"
# # 在导入数据后执行 IP 替换
# log "INFO" "🔄 正在更新配置中的 IP 地址..."
# $SUDO docker exec "$container_name" mysql -uroot -p"$mysql_root_password" -D nacos_mysql -e \
# "UPDATE config_info SET content = REPLACE(content, '192.168.5.234', '"$server_ip"')
# WHERE data_id IN ('auth-sso-auth-dev.yml','auth-sso-gateway-dev.yml','auth-sso-system-dev.yml');"
# # ------------------- 6. 【修正版】带死锁重试的导入函数 -------------------
# import_sql() {
# local db=$1
# local file=$2
# local max_retries=3
# local retry_count=0
# local success=false
#
# log "INFO" "🔄 正在保存配置..."
# $SUDO docker exec "$container_name" mysql -uroot -p"$mysql_root_password" -D nacos_mysql -e \
# "FLUSH PRIVILEGES;"
# while [ $retry_count -lt $max_retries ]; do
# log "INFO" "📥 正在导入 $file 到 $db... (尝试 $((retry_count + 1))/$max_retries)"
#
# if [[ $? -eq 0 ]]; then
# log "INFO" "✅ 配置保存成功"
# # 【关键修改】使用 cat 管道符,让容器自己读取文件并传给 mysql
# # 这样既避免了宿主机的路径问题,又比 source 命令更稳定
# local output
# output=$($SUDO docker exec "$container_name" sh -c "cat /tmp/$file | mysql -uroot -p'$mysql_root_password' $db" 2>&1)
# local exit_code=$?
#
# if [ $exit_code -eq 0 ]; then
# log "INFO" "✅ $file 导入成功"
# success=true
# break
# elif echo "$output" | grep -q "Deadlock found"; then
# retry_count=$((retry_count + 1))
# if [ $retry_count -lt $max_retries ]; then
# log "WARN" "⚠️ 检测到死锁 (Error 1213),等待 5 秒后重试..."
# sleep 5
# else
# log "ERROR" "⛔ 配置保存失败"
# return 1
# log "ERROR" "⛔ $file 导入失败:重试 $max_retries 次后仍遇到死锁"
# log "ERROR" "📄 错误详情: $output"
# fi
#
# else
# log "ERROR" "⛔ 数据导入失败,请检查 nacos_mysql.sql 文件内容或权限"
# log "INFO" "📄 输出容器日志以排查问题..."
# $SUDO docker logs "$container_name" | tail -50
# # 非死锁错误,直接失败
# log "ERROR" "⛔ $file 导入失败 (非死锁错误)"
# log "ERROR" "📄 错误详情: $output"
# return 1
# fi
# sleep 60
#
# # 执行 source 导入 devops_voice.sql 到 devops_voice 数据库
# log "INFO" "📥 正在导入 devops_voice.sql 到数据库 devops_voice..."
# $SUDO docker exec "$container_name" mysql -uroot -p"$mysql_root_password" -D devops_voice -e "source /tmp/devops_voice.sql"
# done
#
# if [[ $? -eq 0 ]]; then
# log "INFO" "✅ devops_voice.sql 数据导入成功"
# else
# log "ERROR" "⛔ 数据导入失败,请检查 devops_voice.sql 文件内容或权限"
# log "INFO" "📄 输出容器日志以排查问题..."
# $SUDO docker logs "$container_name" | tail -50
# if [ "$success" = false ]; then
# return 1
# fi
# sleep 60
# return 0
# }
#
# # ------------------- 7. 执行导入 -------------------
# # 导入 Nacos 并更新 IP
# import_sql "nacos_mysql" "nacos_mysql.sql" || return 1
#
# # 执行 source 导入 huazhao2.sql 到 huazhao2 数据库
# log "INFO" "📥 正在导入 huazhao2.sql 到数据库 huazhao2..."
# $SUDO docker exec "$container_name" mysql -uroot -p"$mysql_root_password" -D huazhao2 -e "source /tmp/huazhao2.sql"
# log "INFO" "🔄 正在更新 Nacos 配置 IP..."
#
# if [[ $? -eq 0 ]]; then
# log "INFO" "✅ huazhao2.sql 数据导入成功"
# else
# log "ERROR" "⛔ 数据导入失败,请检查 huazhao2.sql 文件内容或权限"
# log "INFO" "📄 输出容器日志以排查问题..."
# $SUDO docker logs "$container_name" | tail -50
# return 1
# fi
# sleep 60
# # 【修正】使用 -e MYSQL_PWD="$mysql_root_password" 传递密码,避免 & 符号被 Shell 解析
# # 注意:这里不需要在 mysql 命令里再写 -p
# $SUDO docker exec -e MYSQL_PWD="$mysql_root_password" "$container_name" mysql -uroot -D nacos_mysql -e \
# "UPDATE config_info SET content = REPLACE(content, '192.168.9.84', '"$server_ip"')
# WHERE data_id IN ('auth-sso-auth-dev.yml','auth-sso-gateway-dev.yml','auth-sso-system-dev.yml');"
#
# # 执行 source 导入 offline.sql 到 offline 数据库
# log "INFO" "📥 正在导入 offline.sql 到数据库 offline..."
# $SUDO docker exec "$container_name" mysql -uroot -p"$mysql_root_password" -D offline -e "source /tmp/offline.sql"
# $SUDO docker exec -e MYSQL_PWD="$mysql_root_password" "$container_name" mysql -uroot -D nacos_mysql -e "FLUSH PRIVILEGES;"
#
# if [[ $? -eq 0 ]]; then
# log "INFO" "✅ offline.sql 数据导入成功"
# else
# log "ERROR" "⛔ 数据导入失败,请检查 offline.sql 文件内容或权限"
# log "INFO" "📄 输出容器日志以排查问题..."
# $SUDO docker logs "$container_name" | tail -50
# return 1
# fi
# sleep 60
# # 导入其他数据库
# import_sql "devops_voice" "devops_voice.sql" || return 1
# import_sql "huazhao2" "huazhao2.sql" || return 1
# import_sql "offline" "offline.sql" || return 1
# import_sql "ubains" "ubains.sql" || return 1
# import_sql "devops" "devops.sql" || return 1
#
# # ------------------- 提升用户权限 -------------------
# for user in "root" "mysqluser"; do
......@@ -668,9 +399,188 @@ function mysql_x86() {
#}
#x86架构安装mqtt
function mysql_x86() {
# --- 配置参数 ---
local container_name="umysql"
local image_tar="/data/temp/umysql.tar.gz"
local image_name="139.9.60.86:5000/umysql:v5.2"
local image_id="4c5574ba4b04"
local mysql_root_password="dNrprU&2S"
local mysql_port="8306"
local host_data_dir="/data/middleware/mysql"
local backup_script_src="$PWD/UbainsmysqlBakUp.sh"
local backup_script_dst="/usr/local/docker/UbainsmysqlBakUp.sh"
local cron_user="root"
log "INFO" "=================================================================="
log "INFO" "开始部署 MySQL 服务 (Docker 版, x86)"
log "INFO" "=================================================================="
# 自动判断是否需要 sudo
local SUDO=""
if [[ $(id -u) -ne 0 ]]; then
if command -v sudo >/dev/null; then
SUDO="sudo"
else
log "ERROR" "⛔ 当前不是 root 用户,且系统未安装 sudo,无法执行操作"
return 1
fi
fi
# ------------------- 检查容器是否已运行 -------------------
log "INFO" "🔍 检查容器 '$container_name' 是否已运行..."
if $SUDO docker ps --format '{{.Names}}' | grep -qw "$container_name"; then
log "INFO" "✅ 容器 '$container_name' 已在运行"
return 0
fi
# ------------------- 检查镜像是否存在 -------------------
log "INFO" "🔍 检查镜像 $image_name 是否存在..."
if $SUDO docker images --format '{{.Repository}}:{{.Tag}}' | grep -qw "$image_name"; then
log "INFO" "✅ 镜像 $image_name 已存在"
else
log "WARN" "❌ 镜像 $image_name 不存在,开始加载离线包..."
if [[ ! -f "$image_tar" ]]; then
log "ERROR" "⛔ 镜像文件不存在: $image_tar"
return 1
fi
if $SUDO docker load -i "$image_tar"; then
log "INFO" "🎉 镜像加载成功"
else
log "ERROR" "⛔ 镜像加载失败,请检查文件完整性"
return 1
fi
fi
# ------------------- 启动容器 -------------------
log "INFO" "🚀 正在启动 MySQL 容器: $container_name"
$SUDO docker run -d \
--name "$container_name" \
--mac-address="02:42:ac:11:00:05" \
-p "${mysql_port}:3306" \
-v "${host_data_dir}/conf/my.cnf:/etc/mysql/my.cnf" \
-v "${host_data_dir}/conf.d:/etc/mysql/conf.d" \
-v "${host_data_dir}/log:/var/log/mysql" \
-v "${host_data_dir}/data:/var/lib/mysql" \
-v "/etc/localtime:/etc/localtime:ro" \
--restart=always \
-e "MYSQL_ROOT_PASSWORD=$mysql_root_password" \
"$image_name"
if [[ $? -ne 0 ]]; then
log "ERROR" "⛔ 容器启动失败,请检查端口占用或磁盘权限"
log "INFO" "📄 查看最近容器日志以排查问题..."
$SUDO docker logs "$container_name" 2>/dev/null || true
return 1
fi
sleep 120
log "INFO" "✅ 容器启动成功,等待 MySQL 服务就绪..."
# ------------------- 初始化数据库:创建用户、数据库、授权、导入数据 -------------------
log "INFO" "🔧 初始化数据库:创建用户、数据库、授权..."
# 定义要执行的 SQL 命令序列(注意顺序)
local init_sql=(
"CREATE USER IF NOT EXISTS 'nacos'@'%' IDENTIFIED BY 'nacos2025';"
"CREATE USER IF NOT EXISTS 'mysqluser'@'%' IDENTIFIED BY 'dNrprU&2S';"
"CREATE DATABASE IF NOT EXISTS nacos_mysql CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
"CREATE DATABASE IF NOT EXISTS devops CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
"CREATE DATABASE IF NOT EXISTS devops_voice CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
"CREATE DATABASE IF NOT EXISTS offline CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
"CREATE DATABASE IF NOT EXISTS huazhao2 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
"GRANT ALL PRIVILEGES ON nacos_mysql.* TO 'nacos'@'%';"
"GRANT ALL PRIVILEGES ON devops.* TO 'mysqluser'@'%';"
"FLUSH PRIVILEGES;"
)
# 执行前半部分 SQL
for sql in "${init_sql[@]}"; do
$SUDO docker exec "$container_name" mysql -uroot -p"$mysql_root_password" -e "$sql"
if [[ $? -ne 0 ]]; then
log "ERROR" "⛔ 执行SQL语句失败: $sql"
log "INFO" "📄 输出容器最近日志..."
$SUDO docker logs "$container_name" | tail -30
return 1
fi
done
# 执行 source 导入 nacos_mysql.sql 到 nacos_mysql 数据库
log "INFO" "📥 正在导入 nacos_mysql.sql 到数据库 nacos_mysql..."
log "INFO" "✅ nacos_mysql.sql 数据导入成功"
# 在导入数据后执行 IP 替换
log "INFO" "🔄 正在更新配置中的 IP 地址..."
$SUDO docker exec "$container_name" mysql -uroot -p"$mysql_root_password" -D nacos_mysql -e \
"UPDATE config_info SET content = REPLACE(content, '192.168.9.84', '"$server_ip"')
WHERE data_id IN ('auth-sso-auth-dev.yml','auth-sso-gateway-dev.yml','auth-sso-system-dev.yml');"
log "INFO" "🔄 正在保存配置..."
$SUDO docker exec "$container_name" mysql -uroot -p"$mysql_root_password" -D nacos_mysql -e \
"FLUSH PRIVILEGES;"
if [[ $? -eq 0 ]]; then
log "INFO" "✅ 配置保存成功"
else
log "ERROR" "⛔ 配置保存失败"
return 1
fi
# ------------------- 提升用户权限 -------------------
for user in "root" "mysqluser"; do
$SUDO docker exec "$container_name" mysql -u"root" -p"$mysql_root_password" -e \
"UPDATE mysql.user SET Grant_priv='Y', Super_priv='Y' WHERE User='$user' AND Host='%'; FLUSH PRIVILEGES;" 2>/dev/null
done
log "INFO" "✅ 用户权限提升完成"
# ------------------- 部署备份脚本 -------------------
log "INFO" "📦 部署备份脚本到容器..."
$SUDO mkdir -p "$(dirname "$backup_script_dst")"
if $SUDO cp -f "$backup_script_src" "$backup_script_dst"; then
$SUDO chmod +x "$backup_script_dst"
log "INFO" "✅ 备份脚本已复制到: $backup_script_dst"
else
log "ERROR" "⛔ 备份脚本复制失败,请检查源文件是否存在"
return 1
fi
# ------------------- 配置定时任务 -------------------
log "INFO" "⏰ 配置定时备份任务 (每天 13:00)"
local cron_job="0 13 * * * bash $backup_script_dst"
if $SUDO crontab -u "$cron_user" -l 2>/dev/null | grep -Fq "$backup_script_dst"; then
log "INFO" "✅ 定时任务已存在"
else
( $SUDO crontab -u "$cron_user" -l 2>/dev/null; echo "$cron_job" ) | $SUDO crontab -u "$cron_user" -
if [[ $? -eq 0 ]]; then
log "INFO" "✅ 定时任务添加成功"
else
log "ERROR" "⛔ 定时任务添加失败"
return 1
fi
fi
# ------------------- 重启 crond -------------------
log "INFO" "🔄 重启 crond 服务..."
if command -v systemctl >/dev/null; then
$SUDO systemctl restart crond || $SUDO systemctl restart cron
else
$SUDO service crond restart || $SUDO service cron restart
fi
log "INFO" "✅ crond 服务已重启"
# ------------------- 最终状态输出 -------------------
log "INFO" "🎉 MySQL 部署完成!"
$SUDO docker ps --filter "name=$container_name" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
return 0
}
#x86架构安装mqtt
function emqx_x86()
{
# ------------------- 定义变量 -------------------
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论