lah*_*rah 8 sql powershell sql-server-2012
我有这个cmdlet来恢复数据库,如果没有使用现有数据库,它可以正常工作.
Restore-SqlDatabase -ServerInstance $databaseServerInstance -Database $database -BackupFile $backupLocation -ReplaceDatabase
Run Code Online (Sandbox Code Playgroud)
但是当数据库正在使用时,覆盖失败:
System.Data.SqlClient.SqlError:无法获取独占访问权限,因为数据库正在使用中
我无法弄清楚是否有一种简单的方法(通过参数)来覆盖它并终止连接或将数据库置于单用户模式.有这样的事吗?或者我是否必须切换到SMO才能执行比基本恢复更复杂的操作?
我现在正在使用SMO API的解决方法首先删除数据库,但如果可能的话,我希望简化它.
$srv = new-object Microsoft.SqlServer.Management.Smo.Server($databaseServerInstance)
# If the database exists then drop it otherwise Restore-SqlDatabase may fail if connections are open to it
if ($srv.Databases[$database] -ne $null)
{
$srv.KillAllProcesses($database)
$srv.KillDatabase($database)
}
Restore-SqlDatabase -ServerInstance $databaseServerInstance -Database $database -BackupFile $backupLocation -ReplaceDatabase
Run Code Online (Sandbox Code Playgroud)
我正在使用Invoke-SqlCmd.Invoke-SqlCmd是sqlps模块的一部分,您可以从这里下载:
Push-Location;
Import-Module sqlps -DisableNameChecking;
Pop-Location
$serverPath = "SQLSERVER:\SQL\localhost\Default"
$databaseName = "YOUR_DATABASE"
$restoreFrom = join-path (Get-Location) "$databaseName-before.bak"
$databasePath = join-path $serverPath "Databases\$databaseName"
if(Test-Path $databasePath)
{
Invoke-SqlCmd "USE [master]; ALTER DATABASE [$databaseName] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; DROP DATABASE [$databaseName]"
}
Restore-SqlDatabase -Path $serverPath -Database $databaseName -BackupFile $restoreFrom
Run Code Online (Sandbox Code Playgroud)
您可以在此处找到有关如何使用Invoke-SqlCmd的更多信息:
SQL SERVER - FIX - 术语"Invoke-Sqlcmd"未被识别为cmdlet的名称
von*_*ryz -1
将数据库设置为单用户模式并回滚任何现有事务。这是通过像这样的 Tsql 语句完成的,
ALTER DATABASE MyDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
Run Code Online (Sandbox Code Playgroud)
既然您已经这样做了,为什么不在执行恢复之前删除数据库呢?
USE master; -- or some other db than the one you are going to drop
DROP DATABASE MyDatabase;
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用该选项恢复数据库WITH REPLACE。
| 归档时间: |
|
| 查看次数: |
8221 次 |
| 最近记录: |