gpt4 book ai didi

sql-server-2008 - SQL 数据库的 SMO 还原不会覆盖

转载 作者:行者123 更新时间:2023-12-04 07:13:51 25 4
gpt4 key购买 nike

我正在尝试使用 SMO 从备份文件恢复数据库。如果数据库尚不存在,则它可以正常工作。但是,如果数据库已经存在,那么我不会收到任何错误,但数据库不会被覆盖。

“恢复”过程仍然需要同样长的时间,所以看起来它正在工作并进行恢复,但最终数据库并没有改变。

我正在使用 SMO 在 Powershell 中执行此操作。代码有点长,但我已将其包含在下面。您会注意到我设置了 $restore.ReplaceDatabase = $true。此外,我使用 try-catch block 并报告任何错误(我希望如此),但不会返回任何错误。

有什么明显的错误吗?有没有可能是我没有报告某些错误,而它对我隐藏了?

感谢您提供的任何帮助或建议!

function Invoke-SqlRestore {
param(
[string]$backup_file_name,
[string]$server_name,
[string]$database_name,
[switch]$norecovery=$false
)

# Get a new connection to the server
[Microsoft.SqlServer.Management.Smo.Server]$server = New-SMOconnection -server_name $server_name
Write-Host "Starting restore to $database_name on $server_name."

Try {
$backup_device = New-Object("Microsoft.SqlServer.Management.Smo.BackupDeviceItem") ($backup_file_name, "File")

# Get local paths to the Database and Log file locations
If ($server.Settings.DefaultFile.Length -eq 0) {$database_path = $server.Information.MasterDBPath }
Else { $database_path = $server.Settings.DefaultFile}
If ($server.Settings.DefaultLog.Length -eq 0 ) {$database_log_path = $server.Information.MasterDBLogPath }
Else { $database_log_path = $server.Settings.DefaultLog}

# Load up the Restore object settings
$restore = New-Object Microsoft.SqlServer.Management.Smo.Restore
$restore.Action = 'Database'
$restore.Database = $database_name
$restore.ReplaceDatabase = $true

if ($norecovery.IsPresent) { $restore.NoRecovery = $true }
Else { $restore.Norecovery = $false }

$restore.Devices.Add($backup_device)

# Get information from the backup file
$restore_details = $restore.ReadBackupHeader($server)
$data_files = $restore.ReadFileList($server)

# Restore all backup files
ForEach ($data_row in $data_files) {
$logical_name = $data_row.LogicalName
$physical_name = Get-FileName -path $data_row.PhysicalName

$restore_data = New-Object("Microsoft.SqlServer.Management.Smo.RelocateFile")
$restore_data.LogicalFileName = $logical_name

if ($data_row.Type -eq "D") {
# Restore Data file
$restore_data.PhysicalFileName = $database_path + "\" + $physical_name
}
Else {
# Restore Log file
$restore_data.PhysicalFileName = $database_log_path + "\" + $physical_name
}
[Void]$restore.RelocateFiles.Add($restore_data)
}

$restore.SqlRestore($server)

# If there are two files, assume the next is a Log
if ($restore_details.Rows.Count -gt 1) {
$restore.Action = [Microsoft.SqlServer.Management.Smo.RestoreActionType]::Log
$restore.FileNumber = 2
$restore.SqlRestore($server)
}
}
Catch {
$ex = $_.Exception
Write-Output $ex.message
$ex = $ex.InnerException
while ($ex.InnerException) {
Write-Output $ex.InnerException.message
$ex = $ex.InnerException
}
Throw $ex
}
Finally {
$server.ConnectionContext.Disconnect()
}
Write-Host "Restore ended without any errors."
}

最佳答案

我有同样的问题,我正在尝试从同一服务器但使用不同名称的备份恢复数据库。我已经分析了恢复过程,它没有添加具有不同文件名的“with move”。这就是为什么它会在数据库不存在时恢复数据库,但在数据库存在时失败。.PhysicalFileName 属性存在问题。

关于sql-server-2008 - SQL 数据库的 SMO 还原不会覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4627325/

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