代码之家  ›  专栏  ›  技术社区  ›  maltman

Powershell SMO SQL还原问题

  •  0
  • maltman  · 技术社区  · 5 年前

    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null
    [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended") | Out-Null
    [Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo") | Out-Null
    [Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoEnum") | Out-Null
    
    $backupFile = 'C:\Temp\User_20191029152532.bak'
    
    $server = New-Object ("Microsoft.SqlServer.Management.Smo.Server") "(local)"
    $backupDevice = New-Object("Microsoft.SqlServer.Management.Smo.BackupDeviceItem") ($backupFile, "File")
    $smoRestore = new-object("Microsoft.SqlServer.Management.Smo.Restore")
    
    $smoRestore.NoRecovery = $false;
    $smoRestore.ReplaceDatabase = $true;
    $smoRestore.Action = "Database"
    $smoRestorePercentCompleteNotification = 10;
    $smoRestore.Devices.Add($backupDevice)
    
    $smoRestoreDetails = $smoRestore.ReadBackupHeader($server)
    
    "Database Name from Backup Header : " +$smoRestoreDetails.Rows[0]["DatabaseName"]
    
    $smoRestore.Database =$smoRestoreDetails.Rows[0]["DatabaseName"]
    
    $smoRestoreFile = New-Object("Microsoft.SqlServer.Management.Smo.RelocateFile")
    $smoRestoreLog = New-Object("Microsoft.SqlServer.Management.Smo.RelocateFile")
    
    $smoRestoreFile.LogicalFileName = $smoRestoreDetails.Rows[0]["DatabaseName"]
    $smoRestoreFile.PhysicalFileName = $server.Information.MasterDBPath + "\" + $smoRestore.Database + "_Data.mdf"
    $smoRestoreLog.LogicalFileName = $smoRestoreDetails.Rows[0]["DatabaseName"] + "_Log"
    $smoRestoreLog.PhysicalFileName = $server.Information.MasterDBLogPath + "\" + $smoRestore.Database + "_Log.ldf"
    $smoRestore.RelocateFiles.Add($smoRestoreFile)
    $smoRestore.RelocateFiles.Add($smoRestoreLog)
    
    $smoRestore.SqlRestore($server)
    

    如果我运行这个,一切正常。不过,我想提供一个变量,用于恢复备份。所以我将代码的顶部改为:

    $path = 'C:\Temp'
    $db_name = 'User'
    $file = Get-ChildItem $path '*.bak' | Select-Object basename | Where-Object {$_.basename -like $db_name + '*' }
    
    $backupFile = $path + '\' + $file
    

    使用“1”参数调用“ReadBackupReader”时发生异常:“执行Transact-SQL语句或批处理时发生异常。”



    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    +FullyQualifiedErrorId:ExecutionFailureException

    0 回复  |  直到 5 年前
        1
  •  0
  •   maltman    5 年前

    就我而言,这是个愚蠢的问题$文件中没有扩展名。添加。bak to$file修复了这个问题。