Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录
切换导航
U
ubains-module-test
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
1
议题
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
郑晓兵
ubains-module-test
Commits
2a283bbe
提交
2a283bbe
authored
4月 10, 2026
作者:
陈泽健
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat(fix):调整mysql_x86函数,去除数据库导入操作
上级
7ec3bad3
显示空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
280 行增加
和
370 行删除
+280
-370
auto_middleware_install.sh
自动化部署脚本/x86架构/新统一平台/auto_middleware_install.sh
+280
-370
没有找到文件。
自动化部署脚本/x86架构/新统一平台/auto_middleware_install.sh
浏览文件 @
2a283bbe
...
@@ -137,264 +137,6 @@ function docker_x86() {
...
@@ -137,264 +137,6 @@ function docker_x86() {
# - $PWD/UbainsmysqlBakUp.sh
# - $PWD/UbainsmysqlBakUp.sh
# 并确保宿主机 /data/middleware/mysql/ 目录存在
# 并确保宿主机 /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() {
#function mysql_x86() {
# # --- 配置参数 ---
# # --- 配置参数 ---
# local container_name="umysql"
# local container_name="umysql"
...
@@ -473,149 +215,138 @@ function mysql_x86() {
...
@@ -473,149 +215,138 @@ function mysql_x86() {
# return 1
# return 1
# fi
# fi
#
#
# sleep 120
# # ------------------- 2. 【核心修改】主动探测 MySQL 服务状态 -------------------
# log "INFO" "⏳ 正在等待 MySQL 服务就绪 (主动探测中)..."
#
#
# log "INFO" "✅ 容器启动成功,等待 MySQL 服务就绪..."
# # 定义一个内部函数用于等待
#
# wait_for_mysql() {
# # ------------------- 初始化数据库:创建用户、数据库、授权、导入数据 -------------------
# local max_retries=60 # 最大尝试次数 (60 * 2秒 = 120秒)
# log "INFO" "🔧 初始化数据库:创建用户、数据库、授权..."
# local count=0
#
# log "INFO" "🔧 初始化数据库:创建用户、数据库、授权..."
#
#
#
# 先拷贝 nacos_mysql.sql 到容器内
#
# 循环检测
#
log "INFO" "📁 拷贝 /data/temp/nacos_mysql.sql 到容器 '$container_name' 内..."
#
while [ $count -lt $max_retries ]; do
#
if $SUDO docker cp "/data/temp/nacos_mysql.sql" "$container_name:/tmp/nacos_mysql.sql"; then
#
# 使用 mysqladmin ping 检测
#
log "INFO" "✅ SQL 文件已成功拷贝到容器内"
#
# 注意:这里使用 127.0.0.1 而不是 localhost,避免使用 socket 文件可能带来的路径问题
#
else
#
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 "ERROR" "⛔ 无法拷贝 nacos_mysql.sql 到容器,请检查文件路径或容器状态
"
#
log "INFO" "✅ MySQL 服务已就绪!
"
#
return 1
#
return 0
# fi
# fi
#
#
# # 先拷贝 devops_voice.sql 到容器内
# # 如果失败,等待 2 秒后重试
# log "INFO" "📁 拷贝 /data/temp/devops_voice.sql 到容器 '$container_name' 内..."
# sleep 2
# if $SUDO docker cp "/data/temp/devops_voice.sql" "$container_name:/tmp/devops_voice.sql"; then
# count=$((count + 1))
# log "INFO" "✅ SQL 文件已成功拷贝到容器内"
# # 每 10 次打印一次进度,避免看起来像卡死
# else
# if [ $((count % 10)) -eq 0 ]; then
# log "ERROR" "⛔ 无法拷贝 devops_voice.sql 到容器,请检查文件路径或容器状态"
# log "INFO" " 等待中... (已尝试 ${count}/${max_retries} 次)"
# return 1
# fi
# fi
# done
#
#
# # 先拷贝 huazhao2.sql 到容器内
# log "ERROR" "⛔ 等待 MySQL 启动超时,请检查容器日志"
# log "INFO" "📁 拷贝 /data/temp/huazhao2.sql 到容器 '$container_name' 内..."
# $SUDO docker logs "$container_name" | tail -20
# if $SUDO docker cp "/data/temp/huazhao2.sql" "$container_name:/tmp/huazhao2.sql"; then
# log "INFO" "✅ SQL 文件已成功拷贝到容器内"
# else
# log "ERROR" "⛔ 无法拷贝 huazhao2.sql 到容器,请检查文件路径或容器状态"
# return 1
# return 1
# fi
# }
#
# # 调用等待函数,如果返回失败则退出整个函数
# wait_for_mysql || return 1
#
# log "INFO" "✅ 容器启动成功,等待 MySQL 服务就绪..."
#
#
# # 先拷贝 offline.sql 到容器内
# # ------------------- 3. 【关键优化】清理潜在的死锁源 -------------------
# log "INFO" "📁 拷贝 /data/temp/offline.sql 到容器 '$container_name' 内..."
# log "INFO" "🧹 正在清理潜在的僵尸连接..."
# if $SUDO docker cp "/data/temp/offline.sql" "$container_name:/tmp/offline.sql"; then
# # 获取所有非系统用户的连接 ID 并杀掉,防止旧事务占用锁
# log "INFO" "✅ SQL 文件已成功拷贝到容器内"
# # 使用 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
# else
# log "ERROR" "⛔ 无法拷贝 offline.sql 到容器,请检查文件路径或容器状态"
# log "INFO" "✅ 无残留连接需要清理"
# return 1
# fi
# fi
#
#
# # 定义要执行的 SQL 命令序列(注意顺序)
# # ------------------- 初始化数据库:创建用户、数据库、授权、导入数据 -------------------
# local init_sql=(
# log "INFO" "🔧 初始化数据库:创建用户、数据库、授权..."
# "CREATE USER IF NOT EXISTS 'nacos'@'%' IDENTIFIED BY 'nacos2025';"
#
# "CREATE USER IF NOT EXISTS 'mysqluser'@'%' IDENTIFIED BY 'dNrprU&2S';"
# # ------------------- 4. 拷贝 SQL 文件 -------------------
# "CREATE DATABASE IF NOT EXISTS nacos_mysql CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
# log "INFO" "📁 正在拷贝 SQL 文件到容器..."
# "CREATE DATABASE IF NOT EXISTS devops CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
# local sql_files=("nacos_mysql.sql" "devops_voice.sql" "huazhao2.sql" "offline.sql" "ubains.sql" "devops.sql")
# "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 file in "${sql_files[@]}"; do
# for sql in "${init_sql[@]}"; do
# if $SUDO docker cp "/data/temp/$file" "$container_name:/tmp/$file"; then
# $SUDO docker exec "$container_name" mysql -uroot -p"$mysql_root_password" -e "$sql"
# log "INFO" "✅ 拷贝 $file 成功"
# if [[ $? -ne 0 ]]; then
# else
# log "ERROR" "⛔ 执行SQL语句失败: $sql"
# log "ERROR" "⛔ 拷贝 $file 失败"
# log "INFO" "📄 输出容器最近日志..."
# $SUDO docker logs "$container_name" | tail -30
# return 1
# return 1
# fi
# fi
# done
# 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
#
# ------------------- 6. 【修正版】带死锁重试的导入函数 -------------------
#
log "INFO" "✅ nacos_mysql.sql 数据导入成功"
#
import_sql() {
#
# 在导入数据后执行 IP 替换
#
local db=$1
# lo
g "INFO" "🔄 正在更新配置中的 IP 地址..."
# lo
cal file=$2
#
$SUDO docker exec "$container_name" mysql -uroot -p"$mysql_root_password" -D nacos_mysql -e \
#
local max_retries=3
#
"UPDATE config_info SET content = REPLACE(content, '192.168.5.234', '"$server_ip"')
#
local retry_count=0
#
WHERE data_id IN ('auth-sso-auth-dev.yml','auth-sso-gateway-dev.yml','auth-sso-system-dev.yml');"
#
local success=false
#
#
# log "INFO" "🔄 正在保存配置..."
# while [ $retry_count -lt $max_retries ]; do
# $SUDO docker exec "$container_name" mysql -uroot -p"$mysql_root_password" -D nacos_mysql -e \
# log "INFO" "📥 正在导入 $file 到 $db... (尝试 $((retry_count + 1))/$max_retries)"
# "FLUSH PRIVILEGES;"
#
#
# if [[ $? -eq 0 ]]; then
# # 【关键修改】使用 cat 管道符,让容器自己读取文件并传给 mysql
# log "INFO" "✅ 配置保存成功"
# # 这样既避免了宿主机的路径问题,又比 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
# else
#
log "ERROR" "⛔ 配置保存失败
"
#
log "ERROR" "⛔ $file 导入失败:重试 $max_retries 次后仍遇到死锁
"
#
return 1
#
log "ERROR" "📄 错误详情: $output"
# fi
# fi
#
# else
# else
#
log "ERROR" "⛔ 数据导入失败,请检查 nacos_mysql.sql 文件内容或权限"
#
# 非死锁错误,直接失败
#
log "INFO" "📄 输出容器日志以排查问题...
"
#
log "ERROR" "⛔ $file 导入失败 (非死锁错误)
"
#
$SUDO docker logs "$container_name" | tail -50
#
log "ERROR" "📄 错误详情: $output"
# return 1
# return 1
# fi
# fi
# sleep 60
# done
#
# # 执行 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"
#
#
# if [[ $? -eq 0 ]]; then
# if [ "$success" = false ]; then
# log "INFO" "✅ devops_voice.sql 数据导入成功"
# else
# log "ERROR" "⛔ 数据导入失败,请检查 devops_voice.sql 文件内容或权限"
# log "INFO" "📄 输出容器日志以排查问题..."
# $SUDO docker logs "$container_name" | tail -50
# return 1
# return 1
# fi
# fi
# sleep 60
# return 0
# }
#
#
# # ------------------- 7. 执行导入 -------------------
# # 导入 Nacos 并更新 IP
# import_sql "nacos_mysql" "nacos_mysql.sql" || return 1
#
#
# # 执行 source 导入 huazhao2.sql 到 huazhao2 数据库
# log "INFO" "🔄 正在更新 Nacos 配置 IP..."
# log "INFO" "📥 正在导入 huazhao2.sql 到数据库 huazhao2..."
# $SUDO docker exec "$container_name" mysql -uroot -p"$mysql_root_password" -D huazhao2 -e "source /tmp/huazhao2.sql"
#
#
# if [[ $? -eq 0 ]]; then
# # 【修正】使用 -e MYSQL_PWD="$mysql_root_password" 传递密码,避免 & 符号被 Shell 解析
# log "INFO" "✅ huazhao2.sql 数据导入成功"
# # 注意:这里不需要在 mysql 命令里再写 -p
# else
# $SUDO docker exec -e MYSQL_PWD="$mysql_root_password" "$container_name" mysql -uroot -D nacos_mysql -e \
# log "ERROR" "⛔ 数据导入失败,请检查 huazhao2.sql 文件内容或权限"
# "UPDATE config_info SET content = REPLACE(content, '192.168.9.84', '"$server_ip"')
# log "INFO" "📄 输出容器日志以排查问题..."
# WHERE data_id IN ('auth-sso-auth-dev.yml','auth-sso-gateway-dev.yml','auth-sso-system-dev.yml');"
# $SUDO docker logs "$container_name" | tail -50
# return 1
# fi
# sleep 60
#
#
# # 执行 source 导入 offline.sql 到 offline 数据库
# $SUDO docker exec -e MYSQL_PWD="$mysql_root_password" "$container_name" mysql -uroot -D nacos_mysql -e "FLUSH PRIVILEGES;"
# log "INFO" "📥 正在导入 offline.sql 到数据库 offline..."
# $SUDO docker exec "$container_name" mysql -uroot -p"$mysql_root_password" -D offline -e "source /tmp/offline.sql"
#
#
# if [[ $? -eq 0 ]]; then
# # 导入其他数据库
# log "INFO" "✅ offline.sql 数据导入成功"
# import_sql "devops_voice" "devops_voice.sql" || return 1
# else
# import_sql "huazhao2" "huazhao2.sql" || return 1
# log "ERROR" "⛔ 数据导入失败,请检查 offline.sql 文件内容或权限"
# import_sql "offline" "offline.sql" || return 1
# log "INFO" "📄 输出容器日志以排查问题..."
# import_sql "ubains" "ubains.sql" || return 1
# $SUDO docker logs "$container_name" | tail -50
# import_sql "devops" "devops.sql" || return 1
# return 1
# fi
# sleep 60
#
#
# # ------------------- 提升用户权限 -------------------
# # ------------------- 提升用户权限 -------------------
# for user in "root" "mysqluser"; do
# for user in "root" "mysqluser"; do
...
@@ -668,9 +399,188 @@ function mysql_x86() {
...
@@ -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
()
function
emqx_x86
()
{
{
# ------------------- 定义变量 -------------------
# ------------------- 定义变量 -------------------
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论