备份失败,“数据库正在使用中”

时间:2012-07-15 11:01:36

标签: sql-server

备份:

private void Button1_Click(object sender, EventArgs e)
{
   SqlCommand cmd = new SqlCommand("backup database emp to disk ='C:\\emp.bak'", con);
    con.Open();
    cmd.ExecuteNonQuery();
    // ExecutenonQuery();
    con.Close();
}

但是当我恢复时:

private void Button2_Click(object sender, EventArgs e)
{
    SqlCommand cmd = new SqlCommand("restore database emp from  disk ='C:\\emp.bak'", con);
    con.Open();
    cmd.ExecuteNonQuery();
    // ExecutenonQuery();
    con.Close();
}

我收到错误:

  

RESTORE无法处理数据库'\ temp',因为此会话正在使用它。建议在执行此操作时使用master数据库。   RESTORE DATABASE异常终止。

任何人都可以帮助我

4 个答案:

答案 0 :(得分:1)

可能你应该按照它的建议使用master数据库。

为什么不使用SMO库? down是使用SMO备份和恢复数据库的示例。

如何进行备份

Server server = new Server(sqlServer);

var bdi = new BackupDeviceItem(String.Format(@"C:\Opticien\Data\Sauvegardes\{0}", backupName), DeviceType.File);
var backup = new Backup() { Database = databaseName, Initialize = true };
backup.Devices.Add(bdi);

backup.SqlBackup(server);

如何恢复:

var server = new Server(sqlServer);
var restore = new Restore()
{
     Database = database,
     Action = RestoreActionType.Database,
     ReplaceDatabase = true,
};
restore.Devices.AddDevice(backupPath, DeviceType.File);
var dt = restore.ReadFileList(server);
var dLogicalName = dt.Rows[0]["LogicalName"].ToString();

restore.RelocateFiles.Add(new RelocateFile(dLogicalName, String.Format(@"C:\Opticien\Data\{0}.mdf", database)));
restore.RelocateFiles.Add(new RelocateFile(dLogicalName + "_Log", String.Format(@"C:\Opticien\Data\{0}.ldf", database)));

restore.SqlRestore(server);
祝你好运

答案 1 :(得分:0)

通常,在发出还原命令时,您确实希望SQL数据库处于单用户模式,以便在发生这种情况时可以保证其他进程不使用相同的数据库。如果其他人当时正在使用数据库,您将收到类似于您目前看到的错误。

查看Single User文档

答案 2 :(得分:0)

您可能需要考虑在恢复之前终止当前会话:

use master
ALTER DATABASE YourDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

--do you stuff here 

ALTER DATABASE YourDatabase SET MULTI_USER

更多详情:

How do you kill all current connections to a SQL Server 2005 database?

答案 3 :(得分:0)

如果要还原SQL数据库,请确保任何进程都不使用此数据库。 它最好使用另一个名称来恢复数据库。 我编辑我的答案:

DECLARE @SPId int
DECLARE @SQL nvarchar(100)

--SET @DatabaseName = N'AdventureWorks2008'
SET @DatabaseName = DB_NAME()
DECLARE my_cursor CURSOR FAST_FORWARD FOR
SELECT SPId FROM MASTER..SysProcesses
WHERE DBId = DB_ID(@DatabaseName) AND SPId <> @@SPId

OPEN my_cursor

FETCH NEXT FROM my_cursor INTO @SPId

WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQL = 'KILL ' + CAST(@SPId as nvarchar(10))
print @SQL
EXEC sp_executeSQL @SQL
--KILL @SPId -- Causing Incorrect syntax near '@spid'.

FETCH NEXT FROM my_cursor INTO @SPId
END

CLOSE my_cursor
DEALLOCATE my_cursor