AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 57432
Accepted
M.Ali
M.Ali
Asked: 2014-01-24 15:14:13 +0800 CST2014-01-24 15:14:13 +0800 CST 2014-01-24 15:14:13 +0800 CST

“数据库正在转换”错误

  • 772

今天我试图在已经存在的数据库上恢复数据库,我只需右键单击 SSMS 中的数据库 --> 任务 --> 脱机,这样我就可以恢复数据库。

一个小的弹出窗口出现并显示Query Executing.....了一段时间,然后抛出一个错误说Database is in use cannot take it offline。我从中收集到该数据库的一些活动连接,因此我尝试执行以下查询

USE master
GO
ALTER DATABASE My_DatabaseName
SET OFFLINE WITH ROLLBACK IMMEDIATE
GO

再次在这一点上,SSMS 显示Query Executing.....了一段时间,然后抛出以下错误:

Msg 5061, Level 16, State 1, Line 1
ALTER DATABASE failed because a lock could not be placed on database 'My_DatabaseName'. Try again later.
Msg 5069, Level 16, State 1, Line 1
ALTER DATABASE statement failed.

在此之后,我无法通过 SSMS 连接到数据库。当我尝试使用 SSMS 使其脱机时,它抛出了一个错误消息:

Database is in Transition. Try later .....

在这一点上,我根本无法触及数据库,我尝试过的任何操作都返回了相同的错误消息Database is in Transition。

我在谷歌上阅读了一些人们遇到类似问题的问题,他们建议关闭 SSMS 并再次打开它,我也是如此,因为它只是一个开发服务器,我刚刚使用 SSMS 删除了数据库并在新数据库上恢复。

我的问题是什么可能导致这种情况?以及如何避免这种情况在未来发生,如果我将来遇到同样的情况,除了删除整个数据库之外,还有其他方法可以解决它吗???

谢谢

sql-server sql-server-2008-r2
  • 3 3 个回答
  • 71503 Views

3 个回答

  • Voted
  1. Best Answer
    Thomas Stringer
    2014-01-24T16:49:21+08:002014-01-24T16:49:21+08:00

    复制品

    1. 打开 SSMS
    2. 在新的查询窗口中输入以下内容

      use <YourDatabase>;
      go
      
    3. 转到对象资源管理器(SSMS)并右键单击<YourDatabase>-> Tasks->Take Offline
    4. 打开第二个新查询窗口并输入以下内容:

      use <YourDatabase>;
      go
      

    系统将提示您以下消息:

    消息 952,级别 16,状态 1,第 1 行
    数据库“TestDb1”正在转换。稍后尝试该语句。

    发生这种情况的原因可以从与以下类似的诊断查询中找到:

    select
        l.resource_type,
        l.request_mode,
        l.request_status,
        l.request_session_id,
        r.command,
        r.status,
        r.blocking_session_id,
        r.wait_type,
        r.wait_time,
        r.wait_resource,
        request_sql_text = st.text,
        s.program_name,
        most_recent_sql_text = stc.text
    from sys.dm_tran_locks l
    left join sys.dm_exec_requests r
    on l.request_session_id = r.session_id
    left join sys.dm_exec_sessions s
    on l.request_session_id = s.session_id
    left join sys.dm_exec_connections c
    on s.session_id = c.session_id
    outer apply sys.dm_exec_sql_text(r.sql_handle) st
    outer apply sys.dm_exec_sql_text(c.most_recent_sql_handle) stc
    where l.resource_database_id = db_id('<YourDatabase>')
    order by request_session_id;
    

    对于它的价值,您不需要对象资源管理器来重现此错误。您只需要一个尝试相同操作的被阻止请求(在这种情况下,使数据库脱机)。有关 T-SQL 中的三个步骤,请参见以下屏幕截图:

    在此处输入图像描述

    您最有可能看到的是您的对象资源管理器会话被另一个会话阻止(由 显示blocking_session_id)。该对象资源管理器会话将尝试获取X数据库上的排他锁 ( )。在上述重现的情况下,对象资源管理器会话被授予更新锁 ( U) 并尝试转换为排他锁 ( X)。它有一个 wait_type LCK_M_X,被第一个查询窗口表示的会话阻塞(在数据库上获取use <YourDatabase>共享锁 ( S))。

    然后这个错误来自另一个试图获得锁的会话,并且这个错误消息导致会话拒绝访问试图转换到不同状态的数据库(在这种情况下,在线状态到离线过渡)。

    下次你应该怎么做?

    首先,不要惊慌,也不要开始删除数据库。您需要采取故障排除方法(使用与上述类似的诊断查询)来找出您看到的原因。有了这样的消息,或者当某些东西出现“挂起”时,您应该自动假设缺乏并发性并开始深入研究阻塞(sys.dm_tran_locks这是一个好的开始)。

    作为旁注,我真的相信你最好在采取任何随机行动之前找出问题的根源。不仅是这个操作,而且适用于所有你不期望的行为。知道是什么真正导致了你的问题,很明显这真的没什么大不了的。你基本上有一个阻塞链,而父阻塞器是你很可能刚刚发出的KILL,或者如果它是你不想要的会话请求,KILL那么你可以等到它完成。无论哪种方式,您都知道根据您的特定情况(回滚或等待提交)做出正确和谨慎的决定。

    另一件值得注意的事情,这是我总是选择 T-SQL 替代方案而不是 GUI 的原因之一。您确切地知道您正在使用 T-SQL 执行什么以及 SQL Server 在做什么。毕竟,您发出了明确的命令。当您使用 GUI 时,实际的 T-SQL 将是一个抽象。在这种情况下,我查看了被阻止的对象资源管理器尝试使数据库脱机,结果是ALTER DATABASE <YourDatabase> SET OFFLINE. 没有尝试回滚,这就是它无限期等待的原因。在您的情况下,如果您想回滚在该数据库上具有锁定的会话,ALTER DATABASE ... SET OFFLINE WITH ROLLBACK IMMEDIATE那么如果您最初确定回滚是可以的,那么您很可能就足够了。

    • 24
  2. Michael Bollhoefer
    2018-12-04T10:34:09+08:002018-12-04T10:34:09+08:00

    只需关闭 SQL Server Management Studio (SSMS) 并重新打开即可解决我的问题。

    • 5
  3. garima
    2017-02-10T03:37:03+08:002017-02-10T03:37:03+08:00

    无需执行任何操作,只需SqLWB.exe从任务管理器中终止进程,打开 SQL Server,右键单击数据库并使其脱机。如果它不起作用,则在会话被终止后,键入命令

    ALTER DATABASE [Test4] SET OFFLINE WITH ROLLBACK IMMEDIATE
    

    然后离线。它也适用于我。

    • 0

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve