PowerShell一键还原所有数据库脚本

[复制链接]
查看45 | 回复0 | 7 天前 | 显示全部楼层 |阅读模式
我们在搭建网狐端的时候数据库很多,需要一个一个的去还原,这里我做了一个一键还原脚本
只需要修改数据库的实例名 数据库保存路径执行命令就可以还原数据库

1.png

命令:
  1. # 加载SQL Server管理对象
  2. [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null
  3. [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended") | Out-Null

  4. # 配置参数
  5. $sqlServer = "C20250416167611\SQLEXPRESS"  # SQL Server实例名
  6. $backupFolder = "C:\Program Files\Microsoft SQL Server\MSSQL14.SQLEXPRESS\MSSQL\Backup"     # 备份文件存放目录
  7. $dataFolder = "D:\Data"  # 数据文件存放目录

  8. # 创建目录(如果不存在)
  9. if (!(Test-Path -Path $backupFolder)) {
  10.     New-Item -ItemType Directory -Path $backupFolder | Out-Null
  11. }

  12. # 获取所有.bak文件
  13. $bakFiles = Get-ChildItem -Path $backupFolder -Filter "*.bak"

  14. foreach ($file in $bakFiles) {
  15.     try {
  16.         $dbName = [System.IO.Path]::GetFileNameWithoutExtension($file.Name)
  17.         $backupFile = $file.FullName
  18.         
  19.         # 首先获取备份文件中的逻辑文件名
  20.         $getFileListSQL = @"
  21.         RESTORE FILELISTONLY FROM DISK = N'$backupFile'
  22. "@
  23.         $fileList = Invoke-Sqlcmd -ServerInstance $sqlServer -Query $getFileListSQL
  24.         
  25.         # 提取逻辑文件名(假设第一个是数据文件,第二个是日志文件)
  26.         $dataLogicalName = $fileList[0].LogicalName
  27.         $logLogicalName = $fileList[1].LogicalName
  28.         
  29.         # 构建还原语句
  30.         $restoreSQL = @"
  31.         RESTORE DATABASE [$dbName]
  32.         FROM DISK = N'$backupFile'
  33.         WITH FILE = 1,  
  34.         MOVE N'$dataLogicalName' TO N'$dataFolder$dbName.mdf',  
  35.         MOVE N'$logLogicalName' TO N'$dataFolder${dbName}_log.ldf',  
  36.         NOUNLOAD, REPLACE, STATS = 5;
  37. "@
  38.         
  39.         Write-Host "正在还原数据库: $dbName ..."
  40.         Invoke-Sqlcmd -ServerInstance $sqlServer -Query $restoreSQL -QueryTimeout 0
  41.         Write-Host "成功还原数据库: $dbName" -ForegroundColor Green
  42.         
  43.         # 设置数据库为简单恢复模式(可选)
  44.         $setRecoverySQL = "ALTER DATABASE [$dbName] SET RECOVERY SIMPLE WITH NO_WAIT"
  45.         Invoke-Sqlcmd -ServerInstance $sqlServer -Query $setRecoverySQL
  46.     }
  47.     catch {
  48.         Write-Host "还原数据库 $dbName 时出错: $_" -ForegroundColor Red
  49.     }
  50. }

  51. Write-Host "所有数据库还原操作完成"
复制代码


高级模式
B Color Image Link Quote Code Smilies

本版积分规则