64 lines
1.9 KiB
Bash
64 lines
1.9 KiB
Bash
#!/bin/bash
|
|
# MySQL 数据卷迁移脚本
|
|
# 将旧自动命名卷的数据复制到 external 卷 henan_mysql_data
|
|
# 用法:bash migrate-mysql-volume.sh [旧卷名]
|
|
# 不传参数时自动检测 docker_henan_mysql_data 和 docker-cn_henan_mysql_data
|
|
|
|
set -e
|
|
|
|
NEW_VOL="henan_mysql_data"
|
|
IMAGE="mysql:8.0.24"
|
|
|
|
# 自动检测旧卷名
|
|
if [ -n "$1" ]; then
|
|
OLD_VOL="$1"
|
|
else
|
|
for candidate in docker_henan_mysql_data docker-cn_henan_mysql_data; do
|
|
if docker volume inspect "$candidate" >/dev/null 2>&1; then
|
|
OLD_VOL="$candidate"
|
|
break
|
|
fi
|
|
done
|
|
fi
|
|
|
|
if [ -z "$OLD_VOL" ]; then
|
|
echo "ERROR: 未找到旧数据卷,请手动指定:bash migrate-mysql-volume.sh <旧卷名>"
|
|
echo "可用的卷列表:"
|
|
docker volume ls --format ' {{.Name}}' | grep -i mysql || echo " (无 mysql 相关卷)"
|
|
exit 1
|
|
fi
|
|
|
|
# 检查新卷是否存在
|
|
if ! docker volume inspect "$NEW_VOL" >/dev/null 2>&1; then
|
|
echo "创建 external 卷: $NEW_VOL"
|
|
docker volume create "$NEW_VOL"
|
|
fi
|
|
|
|
# 检查旧卷数据大小
|
|
OLD_SIZE=$(docker run --rm -v "${OLD_VOL}:/data" "$IMAGE" sh -c "du -sh /data" 2>/dev/null | awk '{print $1}')
|
|
echo "旧卷 $OLD_VOL 数据量: $OLD_SIZE"
|
|
|
|
# 停掉 MySQL 容器(如果在运行)
|
|
if docker inspect henan_mysql_db >/dev/null 2>&1; then
|
|
echo "停止 MySQL 容器..."
|
|
docker stop henan_mysql_db 2>/dev/null || true
|
|
fi
|
|
|
|
# 清空新卷(避免数据叠加)
|
|
echo "清空新卷 $NEW_VOL ..."
|
|
docker volume rm "$NEW_VOL" >/dev/null
|
|
docker volume create "$NEW_VOL" >/dev/null
|
|
|
|
# 复制数据
|
|
echo "开始迁移 $OLD_VOL -> $NEW_VOL ..."
|
|
docker run --rm \
|
|
-v "${OLD_VOL}:/from" \
|
|
-v "${NEW_VOL}:/to" \
|
|
"$IMAGE" \
|
|
sh -c "cp -a /from/. /to/"
|
|
|
|
# 验证
|
|
NEW_SIZE=$(docker run --rm -v "${NEW_VOL}:/data" "$IMAGE" sh -c "du -sh /data" 2>/dev/null | awk '{print $1}')
|
|
echo "新卷 $NEW_VOL 数据量: $NEW_SIZE"
|
|
echo "迁移完成!旧卷 $OLD_VOL 保留作为备份。"
|