我尝试使用C#和SMO从.BAK
文件恢复数据库。这是我的代码。
public static void RestoreDatabase()
{
string dbConnString = Configuration.DatabaseConnectionString;
ServerConnection connection = new ServerConnection(@"dbserver\sqlexpress", "user", "password");
Server smoServer = new Server(connection);
Restore rstDatabase = new Restore();
rstDatabase.Action = RestoreActionType.Database;
rstDatabase.Database = "AppDb";
BackupDeviceItem bkpDevice = new BackupDeviceItem(@"TestData\db-backup.bak", DeviceType.File);
rstDatabase.Devices.Add(bkpDevice);
rstDatabase.ReplaceDatabase = true;
// Kill all processes
smoServer.KillAllProcesses(rstDatabase.Database);
// Set single-user mode
Database db = smoServer.Databases[rstDatabase.Database];
db.DatabaseOptions.UserAccess = DatabaseUserAccess.Single;
db.Alter(TerminationClause.RollbackTransactionsImmediately);
rstDatabase.SqlRestore(smoServer);
}
然而,当我尝试运行此方法时,我在尝试终止所有进程时收到以下(错误)消息:
无法使用KILL杀死自己的进程。
如果有人能帮忙解决这个问题,我将非常感激。
答案 0 :(得分:6)
不要致电KillAllProcesses
。 RollbackTransactionsImmediately
就够了。它会立即杀死该数据库中的所有会话。
KillAllProcesses
对你没有帮助,因为在完成杀戮会话后,可能会出现一个新会话。
答案 1 :(得分:2)
当我尝试恢复数据库并且某处存在活动连接时,它始终发生在我身上,并且在没有更多活动连接到数据库之前,数据库将无法恢复。
通常我所做的是,我执行以下命令集来断开所有人的连接,然后恢复数据库。
ALTER DATABASE [DatabaseName]
SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
-- at this point all the users will be disconnected and the database is in
-- single-user mode
Use [DatabaseName] --<-- Grab that single connection
GO
Use [master] --<-- Disconnect from database and connect to Master DB for restore
GO
RESTORE DATABASE [DatabaseName] --<-- Finally restore database tara
FROM DISK .........
GO