从本地服务器迁移数据到阿里云服务器的流程

本地服务器硬伤

我们目前使用的服务器是本地的,是电信宽带的,目前存在两个大问题,第一是跨区域访问,移动wifi会比较慢,很容易超时,第二个就是机房会停电,所以需要把本地服务器部署的docker项目,部署到阿里云上,并且把文件,数据库,redis进行迁移

阿里云准备

先购买了一台阿里云服务器,一台数据库服务器,后续为了不停机部署,还会再买一台阿里云服务器,用过切换域名的ip,来切换云服务器,A服务器先部署项目,部署完,切换ip到A,然后部署B,部署完,再切换到B

准备

为了不影响本地服务器的正在运行的项目的使用,决定用最笨的办法来备份,先做数据库,文件,redis的备份,将备份文件拷贝到阿里云服务器上,然后解压加载

备份mysql

备份脚本
mysql_daily_backup.sh

#!/bin/bash
set -e
BACKUP_DIR="/data/ChipletRing_web/mysql_backup"
CONTAINER="mysql"
MYSQL_USER="root"
MYSQL_PASS="Zxsd@147"
DB_NAME="ring_iot"
DATE=$(date +%Y%m%d_%H%M%S)

# 创建目录
mkdir -p "$BACKUP_DIR"

echo "开始MySQL备份: $(date '+%Y-%m-%d %H:%M:%S')"
echo "备份目录: $BACKUP_DIR"
echo "备份数据库: $DB_NAME"

# 检查Docker权限
if ! sudo docker ps >/dev/null 2>&1; then
    echo "错误: 没有Docker执行权限"
    exit 1
fi

# 检查MySQL容器
if ! sudo docker ps | grep -q "$CONTAINER"; then
    echo "错误: MySQL容器 '$CONTAINER' 未运行"
    exit 1
fi

# 执行备份 - 直接输出压缩文件
BACKUP_FILE="$BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz"
echo "备份文件: $BACKUP_FILE"

# 使用临时文件流式处理,避免内存占用
TEMP_FILE=$(mktemp)
trap 'rm -f "$TEMP_FILE"' EXIT

# 执行mysqldump并压缩
if sudo docker exec "$CONTAINER" mysqldump -u"$MYSQL_USER" -p"$MYSQL_PASS" \
  --opt \
  --default-character-set=utf8 \
  --hex-blob \
  --single-transaction \
  --skip-triggers \
  --skip-lock-tables \
  "$DB_NAME" > "$TEMP_FILE"; then
  
  # 检查临时文件是否有效
  FILE_SIZE=$(du -k "$TEMP_FILE" | cut -f1)
  if [ "$FILE_SIZE" -lt 10 ]; then
    echo "警告: 备份数据大小异常 ($FILE_SIZE KB),可能备份失败"
    rm -f "$TEMP_FILE"
    exit 1
  fi
  
  # 压缩到最终文件
  gzip -c "$TEMP_FILE" > "$BACKUP_FILE"
  COMPRESSED_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
  ORIGINAL_SIZE=$(du -h "$TEMP_FILE" | cut -f1)
  
  echo "✓ 备份成功"
  echo "原始大小: $ORIGINAL_SIZE, 压缩后: $COMPRESSED_SIZE"
  
  # 清理临时文件
  rm -f "$TEMP_FILE"
  
  # 清理30天前的备份
  find "$BACKUP_DIR" -name "${DB_NAME}_*.sql.gz" -type f -mtime +30 -delete 2>/dev/null || true
  
  echo "备份完成"
else
  echo "✗ mysqldump 执行失败"
  rm -f "$TEMP_FILE"
  exit 1
fi

运行脚本
sudo /data/ChipletRing_web/mysql_daily_backup.sh

会把数据库文件备份到/data/ChipletRing_web/mysql_backup文件夹里

备份redis

我尝试了几种办法,都没把redis所有数据备份完整,后来才知道,我的redis 的aof是开启的,要一起备份
备份脚本

#!/bin/bash
# redis_backup_minimal.sh - 极简版Redis备份

set -e

# 配置
REDIS_CONTAINER="redis"
REDIS_PASSWORD="edhwwlfur@4363374"
BACKUP_DIR="/data/ChipletRing_web/redis_backup"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/redis_backup_${TIMESTAMP}.tar.gz"

# 创建备份目录
mkdir -p ${BACKUP_DIR}

# 执行备份
sudo docker exec ${REDIS_CONTAINER} redis-cli -a ${REDIS_PASSWORD} BGSAVE > /dev/null 2>&1
sleep 3
sudo docker exec ${REDIS_CONTAINER} redis-cli -a ${REDIS_PASSWORD} BGREWRITEAOF > /dev/null 2>&1
sleep 5

# 创建临时目录
TEMP_DIR=$(mktemp -d)

# 复制RDB
sudo docker cp ${REDIS_CONTAINER}:/bitnami/redis/data/dump.rdb ${TEMP_DIR}/dump.rdb > /dev/null 2>&1

# 复制AOF目录(如果存在)
if sudo docker exec ${REDIS_CONTAINER} test -d /bitnami/redis/data/appendonlydir; then
    mkdir -p ${TEMP_DIR}/appendonlydir
    sudo docker cp ${REDIS_CONTAINER}:/bitnami/redis/data/appendonlydir/. ${TEMP_DIR}/appendonlydir/ > /dev/null 2>&1
fi

# 压缩备份
cd ${TEMP_DIR}
tar -czf ${BACKUP_FILE} . > /dev/null 2>&1

# 清理临时目录
rm -rf ${TEMP_DIR}

echo "${BACKUP_FILE}"

备份文件保存在/data/ChipletRing_web/redis_backup里

备份文件

备份文件夹

 cd /data/ChipletRing_web/ring
rsync -av --progress uploadPath/ uploadPath_backUp/
#相同文件不会删除重新复制,而是会跳过(通过对比文件属性判断)
#压缩文件夹
tar czf backup.tar.gz uploadPath_backUp

迁移

把备份后的文件,都迁移到阿里云服务器的文件夹里,mysql和redis备份,我放在/root/tmp文件夹下,文件备份,放在/root/ring里

恢复mysql

[root@iZbp13gx45nwiseimw9mxsZ tmp]# cd /root/tmp


[root@iZbp13gx45nwiseimw9mxsZ tmp]# ls -la
total 1252444
drwxr-xr-x  2 root root       4096 Dec 25 16:29 .
dr-xr-x---. 5 root root       4096 Dec 25 14:26 ..
-rw-r--r--  1 root root 1282482976 Dec 25 16:30 ring_iot_20251225_162026.sql.gz
-rw-r--r--  1 root root        337 Dec 25 14:52 数据迁移到阿里云服务器.txt
数据库导入:
[root@iZbp13gx45nwiseimw9mxsZ tmp]# gzip -d ring_iot_20251225_162026.sql.gz
[root@iZbp13gx45nwiseimw9mxsZ tmp]# mysql -h 自己的阿里云数据库地址.mysql.rds.aliyuncs.com -P 3306 -u root -p ring_iot  < /root/tmp/ring_iot_20251225_162026.sql
Enter password: 

这样就能把文件备份到阿里云数据库里,13G预计半小时才能导入

redis恢复

将以下命令的文件名修改为root/tmp下的redis_backup_xx.tar.gz的实际名字

cd /root/tmp && \
tar -xzf redis_backup_20260105_180833.tar.gz 2>/dev/null && \
sudo docker stop redis 2>/dev/null || true && \
sudo docker cp dump.rdb redis:/bitnami/redis/data/dump.rdb && \
sudo docker cp appendonlydir redis:/bitnami/redis/data/ 2>/dev/null || true && \
sudo docker start redis && \
sudo docker exec -u root redis chown -R 1001:1001 /bitnami/redis/data && \
sleep 15 && \
echo "Key数量: $(sudo docker exec redis redis-cli -a 密码@4363374 dbsize)"

文件恢复

 gzip -d backup.tar.gz

tar -xvf backup.tar
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值