实用脚本能批量还原吗?

wen 实用脚本 21

本文目录导读:

实用脚本能批量还原吗?

  1. 场景一:批量还原 SQL 数据库备份(.bak 文件)
  2. 场景二:批量恢复文件到历史版本(如 Git / SVN)
  3. 场景三:批量恢复系统快照或虚拟机快照
  4. 场景四:批量恢复文件从备份存储(如 Rsync / Robocopy)
  5. 核心限制与建议

“实用脚本”这个说法比较宽泛,具体能否批量还原,取决于你指的“还原”是什么场景。

以下分几个最常见的需求场景来说明,并给出对应的脚本示例或思路:

批量还原 SQL 数据库备份(.bak 文件)

如果你有一批 .bak 文件,想批量还原到 SQL Server(最典型的批量还原需求)。

可行方案:使用 PowerShell 脚本批处理 (.bat) 调用 sqlcmd

核心逻辑:遍历文件夹下的所有 .bak 文件,为每个文件生成 RESTORE DATABASE 命令。

示例脚本(PowerShell,适用于 SQL Server):

# 设置参数
$instanceName = "localhost"         # SQL 实例名
$backupFolder = "C:\Backups\"       # 备份文件存放目录
$dataFileFolder = "D:\Data\"        # 数据库数据文件目标路径
$logFileFolder = "D:\Logs\"         # 日志文件目标路径
# 遍历所有 .bak 文件
Get-ChildItem -Path $backupFolder -Filter *.bak | ForEach-Object {
    $backupFile = $_.FullName
    $dbName = $_.BaseName  # 假设文件名就是数据库名 ( MyDB.bak -> MyDB)
    Write-Host "正在还原数据库: $dbName" -ForegroundColor Green
    # 生成 RESTORE DATABASE 命令 (使用 REPLACE, RECOVERY, MOVE 处理路径)
    $restoreScript = @"
RESTORE DATABASE [$dbName]
FROM DISK = N'$backupFile'
WITH FILE = 1,
    MOVE N'$($dbName)_Data' TO N'$dataFileFolder$($dbName).mdf',  -- 需要先确认逻辑文件名
    MOVE N'$($dbName)_Log' TO N'$logFileFolder$($dbName)_log.ldf',
    REPLACE, RECOVERY, STATS = 10;
"@
    # 执行还原 (使用 sqlcmd)
    sqlcmd -S $instanceName -Q $restoreScript
    if ($?) {
        Write-Host "$dbName 还原成功" -ForegroundColor Green
    } else {
        Write-Host "$dbName 还原失败" -ForegroundColor Red
    }
}

注意:你需要提前用 RESTORE FILELISTONLY 确认每个 bak 文件内部的逻辑文件名,否则可能失败,对于异构备份(如不同实例),调整 MOVE 路径即可。


批量恢复文件到历史版本(如 Git / SVN)

如果你指的是代码版本控制的还原,脚本可以做到:

  • Git 批量还原指定文件:比如想一次性还原所有被修改过的文件到最新版本。
    git checkout -- .
  • Git 批量还原到指定提交日期
    # 将整个仓库还原到 7 天前的状态
    git checkout `git rev-list -n 1 --before="7 days ago" main`
  • SVN 批量还原
    # 递归还原所有更改
    svn revert -R .

批量恢复系统快照或虚拟机快照

如果你指的是 VMware / Hyper-V系统快照

  • VMware PowerCLI
    # 批量还原所有名为 "BeforeUpdate" 的快照
    Get-VM -Name "WebServer*" | Get-Snapshot -Name "BeforeUpdate" | Restore-Snapshot -Confirm:$false
  • Hyper-V
    Get-VM | Get-VMSnapshot | Where { $_.Name -eq "Checkpoint1" } | Restore-VMSnapshot
  • Windows 系统还原点(不太适合批量,但可以用脚本触发)
    # 恢复最近的一个系统还原点
    Get-ComputerRestorePoint | Sort-Object -Property CreationTime -Descending | Select -First 1 | Restore-Computer

批量恢复文件从备份存储(如 Rsync / Robocopy)

如果你有冷备份文件,想批量恢复所有缺失的或损坏的文件:

  • Robocopy(Windows)

    robocopy \\backup-server\share\Backup C:\OriginalFiles *.* /mir /r:3 /w:5

    这个命令会强制将目标文件夹(C:\OriginalFiles)镜像为备份中的状态(相当于批量还原)。

  • rsync(Linux)

    rsync -avP /mnt/backup/folder/ /original/folder/

    同样是批量覆盖。


核心限制与建议

  1. 依赖具体工具:实用脚本本质上是调用底层命令(sqlcmd、git、robocopy、rsync、PowerCLI),是否能批量还原取决于你工具的命令行支持程度。
  2. 先测试:批量还原有破坏性(覆盖数据),务必先用 -WhatIf(PowerShell)、--dry-run(rsync)或在小范围测试环境试运行。
  3. 确认一致性:如果是数据库备份,批量还原时,数据库实例的资源(内存、磁盘I/O)可能成为瓶颈,可能需要增加延时。

如果你能告诉我具体是什么“实用脚本”或什么“还原”场景(批量还原Word文档到修改前版本、批量还原手机照片、批量还原MySQL数据库等),我可以给出更精确的代码示例。

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