• SQLserver还原失败(数据库正在使用,无法获得对数据库的独占访问权)


    问题描述:

    Sql server还原失败(数据库正在使用,无法获得对数据库的独占访问权)

    数据库还原的时候还有其他进程连在上面,导致无法获得独占造成的。

    这个问题的原因在于有用户连接了当前要做还原的数据库,这里的用户甚至包括当前要做还原的用户。

    解决办法:

    方法一:

    删完进程马上有新的进程连进来,导致一直失败。
    单用户模式
    单用户模式设置:
    右键点击数据库 -> 属性 -> 选项 -> 状态 -> 限制访问(MULTI_USER 默认) -> 选择Single-> 确定。然后还原。

    或 GUI的模式,语句的办法比较简单

    USE MASTER
    GO
    ALTER DATABASE 库名 SET SINGLE_USER WITH ROLLBACK IMMEDIATE;  --单用户模式
    GO
    ALTER DATABASE 库名 SET MULTI_USER WITH ROLLBACK IMMEDIATE; --多用户模式
    GO

    设置单用户数据库必须要超级用户

    方法二:

    利用SQL语句,杀死正在使用该数据库的所有进程,sql代码如下:

    杀掉正在运行的进程:

    --杀死正在使用该数据库的所有进程
    declare @dbname varchar(50)
    set @dbname='数据库名'
    declare @sql varchar(50)
    declare cs_result cursor local for select 'kill '+cast(spid as varchar(50)) from sys.sysprocesses where db_name(dbid)=@dbname
    open cs_result
    fetch next from cs_result into @sql
    while @@fetch_status=0
    begin
        execute(@sql)
        fetch next from cs_result into @sql
    end
    close cs_result
    deallocate cs_result

    该SQL语句利用游标循环所有正在使用该数据库的进程,并通过kill命令杀死进程。

    方法三:

    将当前需要还原的数据进行OFFLINE,还原后,再将该数据库ONLINE。
    脚本如下,先运行第一脚本,还原成功后,运行第二脚本。

    1ALTER DATABASE [datebase] SET OFFLINE WITH ROLLBACK IMMEDIATE
    2ALTER DATABASE [datebase] SET ONLINE WITH ROLLBACK IMMEDIATE

    如果此时还原还是不行。可能是删完进程马上有新的进程连进来,
    导致一直失败。应用程序一直不停的进行数据库链接。
    这时,可以在单用户下还原。

  • 相关阅读:
    ajax实现无刷新上传附件并且显示进度条的实例
    thinkphp ajax 无刷新分页效果的实现
    微信错误码详述
    eclispse修改项目项目编码
    构建高性能web之路------mysql读写分离实战
    Hibernate 的Ehache学习
    sessionStorage和localStorage
    sql中的group by 和 having 用法解析
    Hibernate DetachedCriteria实现
    JavaScript eval_r() 函数
  • 原文地址:https://www.cnblogs.com/Sungeek/p/11883263.html
Copyright © 2020-2023  润新知