gpt4 book ai didi

sql - 使用 smo 和 powershell 将数据库备份恢复到新数据库时出错

转载 作者:行者123 更新时间:2023-12-02 11:14:13 24 4
gpt4 key购买 nike

从另一台服务器获取数据库备份,我试图恢复到本地主机上的 sqlexpress。此恢复将通过 GUI 进行,但我在使用 powershell 恢复它时遇到问题。我收到以下错误消息:

Exception calling "SqlRestore" with "1" argument(s): "Restore failed for Server
+ $smoRestore.SqlRestore <<<< ($server)
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException

错误消息指向该行的第 23 个字符:

        $smoRestore.SqlRestore($server)

脚本:

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoExtended") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SmoEnum") | Out-Null

Import-Module PSCX
Import-Module WebAdministration

function GetLatestItem(){
param([string]$RemotePath)
$returnString = Get-ChildItem $RemotePath -force -filter "*.7z" | sort @{expression={$_.LastWriteTime}; Descending=$true} | select Name -first 1
return $returnString.Name
}

function DatabaseExists(){
param([Microsoft.SqlServer.Management.Smo.Server]$server,[string]$databaseName)
foreach($database in $server.Databases){
if($database.Name -eq $databaseName){
$true
}
}
$false
}

$LocalFile = "C:\backups\backupname.bak.7z"
$LocalFilePath = "C:\backups\"

Expand-Archive $Localfile $LocalFilePath

# Most of the restore information was found at http://www.sqlmusings.com/2009/06/01/how-to-restore-sql-server-databases-using-smo-and-powershell/
$backupFile = $LocalFilePath + [IO.Path]::GetFileNameWithoutExtension($LocalFile)
[Microsoft.SqlServer.Management.Smo.Server]$server = New-Object ("Microsoft.SqlServer.Management.Smo.Server") ".\SQLEXPRESS"
$backupDevice = New-Object ("Microsoft.SqlServer.Management.Smo.BackupDeviceItem") ($backupFile, "File")
$smoRestore = New-Object Microsoft.SqlServer.Management.Smo.Restore

$smoRestore.NoRecovery = $true;
$smoREstore.ReplaceDatabase = $true;
$smoRestore.Action = "Database"
$smoRestore.PercentCompleteNotification = 10;
$smoRestore.Devices.Add($backupDevice)

# Get the details from the backup device for the database name and output that
$smoRestoreDetails = $smoRestore.ReadBackupHeader($server)
$databaseName = $smoRestoreDetails.Rows[0]["DatabaseName"]

"Database Name from Backup Header : " + $databaseName
$smoRestore.Database = $databaseName

if(DatabaseExists $server $databaseName -not){
$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.MasterDBPath + "\" + $smoRestore.Database + "_Log.ldf"
$smoRestore.RelocateFiles.Add($smoRestoreFile)
$smoRestore.RelocateFiles.Add($smoRestoreLog)
}

$smoRestore.SqlRestore($server)
if($error.Count -eq 0){
}
else{
$Error[0].exception.message
}

最佳答案

我有一个与您的非常相似的脚本,但有一些值得注意的差异:

  • 在调用 SqlRestore 之前,我会调用 $server.KillAllProcesses($databaseName)
  • 我有 $smoRestore.NoRecovery = $false,而不是 $true
  • 我有 $smoRestore.FileNumber = 1,而你根本没有。我认为这对应于在 GUI 中检查备份集中的文件。

我也有类似的代码用于设置逻辑/物理文件名,但我没有使用 $server.Information,而是从注册表中提取信息(不确定哪个“更好”)。另一个区别是我使用 $smoRestore.ReadFileList 而不是 $smoRestore.ReadBackupHeader

您还可以尝试在路径上使用一些 Write-Host 语句,以确保它们看起来正确(如果您还没有这样做的话)。

希望其中一项调整可以解决您的问题。如果您想从我的脚本中获得更多信息,请告诉我。

关于sql - 使用 smo 和 powershell 将数据库备份恢复到新数据库时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5123423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com