本地服务器硬伤
我们目前使用的服务器是本地的,是电信宽带的,目前存在两个大问题,第一是跨区域访问,移动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



3万+

被折叠的 条评论
为什么被折叠?



