#!/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 保留作为备份。"