Moh*_*yan 37 c# sql t-sql database-restore
我正在使用以下代码来恢复数据库,
void Restore(string ConnectionString, string DatabaseFullPath, string backUpPath)
{
string sRestore =
"USE [master] RESTORE DATABASE [" + DatabaseFullPath + "] FROM DISK = N'" + backUpPath + "' WITH FILE = 1, NOUNLOAD, STATS = 10";
using (SqlConnection con = new SqlConnection(ConnectionString))
{
con.Open();
SqlCommand cmdBackUp = new SqlCommand(sRestore, con);
cmdBackUp.ExecuteNonQuery();
}
}
Run Code Online (Sandbox Code Playgroud)
但我收到以下异常
"Exclusive access could not be obtained because the database is in use.
RESTORE DATABASE is terminating abnormally.
Changed database context to 'master'."
Run Code Online (Sandbox Code Playgroud)
我该如何解决?
Kei*_*thS 52
只有在数据库没有任何连接时(除了你的数据库),才能进行恢复.MS SQL Server上关闭所有用户的简单方法是:
ALTER DATABASE [MyDB] SET Single_User WITH Rollback Immediate
GO
Run Code Online (Sandbox Code Playgroud)
现在,您可以执行恢复而不受惩罚.完成恢复后,请确保将其重新设置为多用户模式:
ALTER DATABASE [MyDB] SET Multi_User
GO
Run Code Online (Sandbox Code Playgroud)
Moh*_*yan 14
因此,我写了以下方法来恢复我的数据库,
我是否正确?
void Restore(string ConnectionString, string DatabaseFullPath, string backUpPath)
{
using (SqlConnection con = new SqlConnection(ConnectionString))
{
con.Open();
string UseMaster = "USE master";
SqlCommand UseMasterCommand = new SqlCommand(UseMaster, con);
UseMasterCommand.ExecuteNonQuery();
string Alter1 = @"ALTER DATABASE [" + DatabaseFullPath + "] SET Single_User WITH Rollback Immediate";
SqlCommand Alter1Cmd = new SqlCommand(Alter1, con);
Alter1Cmd.ExecuteNonQuery();
string Restore = @"RESTORE DATABASE [" + DatabaseFullPath + "] FROM DISK = N'" + backUpPath + @"' WITH FILE = 1, NOUNLOAD, STATS = 10";
SqlCommand RestoreCmd = new SqlCommand(Restore, con);
RestoreCmd.ExecuteNonQuery();
string Alter2 = @"ALTER DATABASE [" + DatabaseFullPath + "] SET Multi_User";
SqlCommand Alter2Cmd = new SqlCommand(Alter2, con);
Alter2Cmd.ExecuteNonQuery();
labelReport.Text = "Successful";
}
}
Run Code Online (Sandbox Code Playgroud)
最好的方法
Alter Database <Db_Name> SET [SINGLE_USER | RESTRICTED_USER]
With ROLLBACK [IMMEDIATE | AFTER 30]
go
--do your job that needs exclusive access
go
--Back to normal mode
Alter Database <Db_Name> SET MULTI_USER
Run Code Online (Sandbox Code Playgroud)
WITH ROLLBACK AFTER nnn - 此选项将在等待nnn秒以完成打开的事务后回滚所有打开的事务.在我们的示例中,我们指定进程应该在回滚任何打开的事务之前等待30秒.
当RESTRICTED_USER指定,只有成员的db_owner,dbcreator或系统管理员角色可以使用该数据库.MULTI_USER将数据库返回到正常运行状态.
第二种方式:使用ssms 2008 R2我们可以做同样的事情
若要更改数据库属性,SQL Server 必须关闭与数据库的所有其他连接.您确定要更改属性并关闭所有其他连接吗?是还是不是
第三种方式:以下命令也将关闭所有连接.
ALTER DATABASE [DbName] SET OFFLINE
go
ALTER DATABASE [DbName] SET ONLINE
Run Code Online (Sandbox Code Playgroud)
现在数据库已准备好进行恢复
更多(mssqltips:获得恢复SQL Server数据库的独占访问权限)
小智 9
在执行还原之前,可以使用SMO SqlServer对象上的方法来锁定指定数据库上的所有进程:
sqlServer.KillAllProcesses("databaseName");
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
24579 次 |
最近记录: |