我用
restore database vod8  from disk='D:\Program Files\Microsoft SQL Server\MSSQL\BACKUP\vod8.bak';
时提示服务器: 消息 3101,级别 16,状态 1,行 1
因为数据库正在使用,所以未能获得对数据库的排它访问权。
服务器: 消息 3013,级别 16,状态 1,行 1
RESTORE DATABASE 操作异常终止。
是怎么回事呢?

解决方案 »

  1.   

    强制还原已存在的数据库
    --上面的优点问题,修正如下USE master
    GOIF EXISTS (SELECT * FROM sysobjects 
    WHERE id = object_id(N'[dbo].[spForceRestoreDB]') 
    AND OBJECTPROPERTY(id, N'IsProcedure') = 1)
    DROP PROCEDURE [dbo].[spForceRestoreDB]
    GOSET 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 intIF NOT EXISTS( select name from master.dbo.sysdatabases WHERE name = @DatabaseName)
    BEGIN
    PRINT 'Database ' + @DatabaseName + ' not found '
    PRINT 'Enter valid Datbase name'
    RETURN
    ENDEXEC 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
    ENDWAITFOR 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
      

  2.   

    --这样试一下
    USE Master
     
    DECLARE tables_cursor CURSOR
       FOR
    select spid from master..sysprocesses where dbid=db_id('数据库名')
    OPEN tables_cursor
    DECLARE @tablename sysname
    FETCH NEXT FROM tables_cursor INTO @tablename
    WHILE (@@FETCH_STATUS <> -1)
    BEGIN
       exec ('kill '+ @tablename)
       FETCH NEXT FROM tables_cursor INTO @tablename
    END
    restore database test from disk='数据库备份所在路径'
      

  3.   

    USE Master
     
    DECLARE tables_cursor CURSOR
       FOR
    select spid from master..sysprocesses where dbid=db_id('test')
    OPEN tables_cursor
    DECLARE @tablename sysname
    FETCH NEXT FROM tables_cursor INTO @tablename
    WHILE (@@FETCH_STATUS <> -1)
    BEGIN
       exec ('kill '+ @tablename)
       FETCH NEXT FROM tables_cursor INTO @tablename
    END
    Close tables_cursor
    DEALLOCATE tables_cursorrestore database test from disk='数据库备份所在路径'
      

  4.   

    关闭,然后确定用户进入的时候不要默认为你要还原的数据库,改为master 就可以了。