实用脚本能批量迁移吗?

wen 实用脚本 22

本文目录导读:

实用脚本能批量迁移吗?

  1. 服务器/云资源迁移
  2. 数据库批量迁移
  3. 文件/数据批量迁移
  4. 容器/虚拟机镜像迁移
  5. 配置/环境迁移
  6. 重要提示
  7. 你的具体场景是什么?

当然可以!实用脚本完全能实现批量迁移,而且这正是脚本自动化发挥最大价值的地方。

“批量迁移”的具体实现方式取决于你所说的“迁移”具体指什么,为了给你最准确的方案,我按最常见的几种场景分别说明:

服务器/云资源迁移

典型场景:从旧服务器迁移到新服务器,或从自建机房迁到云。

实用脚本示例(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
# 再推送到新服务器(同理)

重要提示

  1. 先验证再批量

    • 先做一次单台机器的迁移测试
    • 使用 --dry-run (rsync) 或 --what-if 参数预览效果
  2. 错误处理

    # 添加错误处理,避免一个失败就中断
    for item in list; do
        if command; then
            echo "OK: $item"
        else
            echo "FAIL: $item" >> migration_errors.log
        fi
    done
  3. 断点续传

    • rsync 支持断点续传(--partial
    • 大型迁移建议分批次、分目录进行
  4. 速率控制

    rsync --bwlimit=5000  # 限制带宽为5MB/s,避免影响生产

你的具体场景是什么?

如果你能告诉我:

  • 迁移什么(文件?数据库?服务器?配置?)
  • 从哪到哪(本地到本地?本地到云?旧服务器到新服务器?)
  • 数据量大小(几百MB?几TB?)
  • 频率要求(一次性迁移?定期增量同步?)

我可以帮你写一个完全定制化的脚本,包括断点续传、日志记录、邮件通知等高级功能。

抱歉,评论功能暂时关闭!