本文目录导读:

当然可以!实用脚本完全能实现批量迁移,而且这正是脚本自动化发挥最大价值的地方。
“批量迁移”的具体实现方式取决于你所说的“迁移”具体指什么,为了给你最准确的方案,我按最常见的几种场景分别说明:
服务器/云资源迁移
典型场景:从旧服务器迁移到新服务器,或从自建机房迁到云。
实用脚本示例(Linux):
#!/bin/bash
# 批量迁移用户和网站配置
# 源服务器列表
SERVERS=("web1.example.com" "web2.example.com" "db.example.com")
DEST_USER="root"
DEST_IP="新服务器IP"
for server in "${SERVERS[@]}"; do
echo "开始迁移: $server"
# 同步用户数据
rsync -avz --progress -e ssh /home/ "$DEST_USER@$DEST_IP:/home/"
# 同步网站配置文件
rsync -avz --progress -e ssh /etc/nginx/sites-enabled/ "$DEST_USER@$DEST_IP:/etc/nginx/sites-enabled/"
echo "完成迁移: $server"
done
关键点:
- 使用
rsync进行增量同步(只传变化的部分) - 配合
ssh密钥认证实现无密码批量操作 - 可添加
-n参数先进行演练
数据库批量迁移
典型场景:将多个数据库从旧服务器批量导出并导入新服务器。
实用脚本示例:
#!/bin/bash
# 批量导出并导入MySQL数据库
DB_LIST=("db1" "db2" "db3" "db4")
BACKUP_DIR="/tmp/db_backup"
DEST_DB_HOST="新数据库IP"
DEST_DB_USER="root"
DEST_DB_PASS="password"
mkdir -p $BACKUP_DIR
# 批量导出(旧服务器)
for db in "${DB_LIST[@]}"; do
echo "正在导出: $db"
mysqldump --single-transaction -u root -p密码 $db > "$BACKUP_DIR/${db}.sql"
done
# 批量导入(新服务器)
for db in "${DB_LIST[@]}"; do
echo "正在导入: $db"
mysql -h $DEST_DB_HOST -u $DEST_DB_USER -p$DEST_DB_PASS -e "CREATE DATABASE IF NOT EXISTS $db"
mysql -h $DEST_DB_HOST -u $DEST_DB_USER -p$DEST_DB_PASS $db < "$BACKUP_DIR/${db}.sql"
done
文件/数据批量迁移
典型场景:从NAS、旧硬盘或云存储迁移大量文件。
实用脚本示例(Python,支持并发):
#!/usr/bin/env python3
# 多线程批量迁移文件
import os
import shutil
from concurrent.futures import ThreadPoolExecutor, as_completed
SOURCE_DIR = "/old_nas/data/"
DEST_DIR = "/new_storage/data/"
FILE_LIST = ["file1.mp4", "file2.pdf", "file3.zip"] # 或使用os.listdir()
def copy_file(filename):
src = os.path.join(SOURCE_DIR, filename)
dst = os.path.join(DEST_DIR, filename)
if os.path.isfile(src):
shutil.copy2(src, dst)
return f"Success: {filename}"
return f"Skipped: {filename} (not a file)"
# 使用线程池提高效率
with ThreadPoolExecutor(max_workers=8) as executor:
futures = {executor.submit(copy_file, f): f for f in FILE_LIST}
for future in as_completed(futures):
print(future.result())
容器/虚拟机镜像迁移
典型场景:批量将Docker容器或VM从旧平台迁到新平台。
实用脚本(Docker批量迁移):
#!/bin/bash
# 导出所有运行中的容器为镜像并迁移
# 旧服务器:批量导出
docker ps --format "{{.Names}}" | while read container; do
echo "导出: $container"
docker commit $container "${container}_migrated"
docker save "${container}_migrated" > "/tmp/${container}.tar"
done
# 传输到新服务器
scp /tmp/*.tar root@新服务器IP:/tmp/
# 新服务器:批量导入
for tarfile in /tmp/*.tar; do
name=$(basename "$tarfile" .tar)
echo "导入: $name"
docker load < "$tarfile"
# 可选:自动启动
docker run -d --name "$name" "${name}_migrated"
done
配置/环境迁移
典型场景:迁移多台服务器的环境变量、cron任务、SSH密钥等。
实用脚本(Ansible方式,纯bash版):
#!/bin/bash
# 批量同步系统配置
SERVERS=("10.0.0.1" "10.0.0.2" "10.0.0.3")
SSH_USER="ops"
CONFIG_FILES=("/etc/hosts" "/etc/ntp.conf" "/etc/ssh/sshd_config")
DEST_BASE="/backup/configs"
mkdir -p $DEST_BASE
# 从源服务器拉取配置
for config in "${CONFIG_FILES[@]}"; do
for server in "${SERVERS[@]}"; do
echo "拉取 ${server}:${config}"
scp "${SSH_USER}@${server}:${config}" "${DEST_BASE}/$(basename ${config})_${server}"
done
done
# 再推送到新服务器(同理)
重要提示
-
先验证再批量:
- 先做一次单台机器的迁移测试
- 使用
--dry-run(rsync) 或--what-if参数预览效果
-
错误处理:
# 添加错误处理,避免一个失败就中断 for item in list; do if command; then echo "OK: $item" else echo "FAIL: $item" >> migration_errors.log fi done -
断点续传:
- rsync 支持断点续传(
--partial) - 大型迁移建议分批次、分目录进行
- rsync 支持断点续传(
-
速率控制:
rsync --bwlimit=5000 # 限制带宽为5MB/s,避免影响生产
你的具体场景是什么?
如果你能告诉我:
- 迁移什么(文件?数据库?服务器?配置?)
- 从哪到哪(本地到本地?本地到云?旧服务器到新服务器?)
- 数据量大小(几百MB?几TB?)
- 频率要求(一次性迁移?定期增量同步?)
我可以帮你写一个完全定制化的脚本,包括断点续传、日志记录、邮件通知等高级功能。