网站总是在用数据库MYDATABASE,想执行其中的一个存储过程RESTORE_DB来强制还原数据库MYDATABASE,报错如下,那么我要怎么做呢?

HNU 2005-09-27 10:31:36
服务器: 消息 6104,级别 16,状态 1,行 1
不能用 KILL 来取消您自己的进程。
服务器: 消息 3101,级别 16,状态 1,行 1
因为数据库正在使用,所以未能获得对数据库的排它访问权。
服务器: 消息 3013,级别 16,状态 1,行 1
RESTORE DATABASE 操作异常终止。
...全文
186 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
HNU 2005-09-27
  • 打赏
  • 举报
回复
上面说错了,应该是:想调用MYDATABASE下spForceRestoreDB 来还原MYDATABASE
HNU 2005-09-27
  • 打赏
  • 举报
回复
想调用MYDATABASE下spForceRestoreDB 来还原spForceRestoreDB
HNU 2005-09-27
  • 打赏
  • 举报
回复
spForceRestoreDB 还是建立在master下,我想建立在MYDATABASE下
vivianfdlpw 2005-09-27
  • 打赏
  • 举报
回复
USE master
GO

IF EXISTS (SELECT * FROM sysobjects
WHERE id = object_id(N'[dbo].[spForceRestoreDB]')
AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
DROP PROCEDURE [dbo].[spForceRestoreDB]
GO

SET QUOTED_IDENTIFIER OFF SET ANSI_NULLS ON
GO

/*
强制还原已存在的数据库
调用;
use master
go
exec master..spForceRestoreDB 'test'
,'c:\test.bak'
,'c:\db\test_data.mdf'
,'c:\db\test_log.mdf'
*/
CREATE PROCEDURE spForceRestoreDB
@DatabaseName varchar(50), --要恢复的数据库名
@BackupFile varchar(255), --备份文件路径
@NewDataFilePath varchar(255), --新物理文件位置
@NewLogFilePath varchar(255) --新日志文件位置
WITH ENCRYPTION
AS
BEGIN
SET NOCOUNT ON
DECLARE @exists int

IF NOT EXISTS( select name from master.dbo.sysdatabases WHERE name = @DatabaseName)
BEGIN
PRINT ' Database ' + @DatabaseName + ' not found '
PRINT ' Enter valid Datbase name'
RETURN
END

EXEC master.dbo.xp_fileexist @BackupFile , @exists OUTPUT
if (@exists = 0)
BEGIN
PRINT ' File ' + @BackupFile + ' Does bot Exist'
PRINT ' Database cannot be restored'
PRINT ' Enter the valid Backup File'
RETURN
END

-- Cursor for all the spids running against this database
DECLARE SysProc CURSOR LOCAL FORWARD_ONLY DYNAMIC READ_ONLY FOR
SELECT spid
FROM master.dbo.sysprocesses
WHERE dbid = ( SELECT dbid FROM master.dbo.sysdatabases
WHERE name = @DatabaseName)

DECLARE @SysProcId smallint

-- Opens the Cursor
OPEN SysProc

-- Fetch the Process ID into the cursor
FETCH NEXT FROM SysProc INTO @SysProcId

DECLARE @KillStatement char(30)

WHILE @@FETCH_STATUS = 0
BEGIN
SET @KillStatement = 'KILL ' + CAST(@SysProcId AS char(30))

-- Kills the processes running against the database
EXEC (@KillStatement)

FETCH NEXT FROM SysProc INTO @SysProcId
END

WAITFOR DELAY '000:00:01'

create table #
(LogicalName varchar(255),
PhysicalName varchar(255),
Type varchar(20),
FileGroupName varchar(255),
Size varchar(20),
MaxSize varchar(20) )
declare @cmd varchar(200)
,@DataLogicName varchar(20)
,@logLogicName varchar(20)
select @cmd = 'RESTORE FILELISTONLY FROM disk = '''+ @BackupFile + ''''
insert # exec(@cmd)

select @DataLogicName=LogicalName from # where Type='D'
select @logLogicName=LogicalName from # where Type='L'
drop table #

DECLARE @strSql varchar(2000)

SET @strSql = 'RESTORE DATABASE '
SET @strSql = @strSql + QUOTENAME(@DatabaseName)
SET @strSql = @strSql + 'FROM DISK = N'+ '''' + @BackupFile + ''''
SET @strSql = @strSql + ' WITH FILE = 1, NOUNLOAD , STATS = 10, RECOVERY , REPLACE'
SET @strSql = @strSql + ',Move '''+@DataLogicName+''' to '''+@NewDataFilePath+''''
SET @strSql = @strSql + ',Move '''+@logLogicName+''' to '''+@NewLogFilePath+''''

--PRINT @strSql
-- Restore the Database
EXEC (@strSql)

SET NOCOUNT OFF
END
GO
HNU 2005-09-27
  • 打赏
  • 举报
回复

我现在在程序里链接master,执行其中的一个存储过程可以做到还原MYDATABASE

我想知道是否可以直接执行MYDATABASE中存储过程来还原?
fxf66 2005-09-27
  • 打赏
  • 举报
回复
当然不行啊,
还原MYDATABASE的命令'RESTORE DATABASE 先必须得到数据库的排他权,
如果把spForceRestoreDB放在MYDATABASE下,那spForceRestoreDB还在占用MYDATABASE资源
令'RESTORE DATABASE 就得不到数据库的排他权,所以出错.
估计用RESTORE DATABASE 强制还原时会先KILL掉正在使用MYDATABASE的所有进程,
由于在正在使用MYDATABASE的是调用RESTORE DATABASE的父进程,
自己不能KILL自己,故报错"不能用 KILL 来取消您自己的进程。"

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧