use*_*235 5 sql-server sql-server-2012
尝试创建聚簇索引时出现以下错误
该语句已终止。
消息596,级别21,状态1,第0行
无法继续执行,因为会话处于终止状态。消息0,级别20,状态0,行0
当前命令发生严重错误。结果(如果有的话)应丢弃。
索引是:
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE CLUSTERED INDEX IX_CO_DES_INPUT
ON dbo.CO_DES_INPUT(DESIGN_ID, PRODUCT_INPUT_NUM, INPUT_NAME)
WITH(STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
ALTER TABLE dbo.CO_DES_INPUT
SET (LOCK_ESCALATION = TABLE)
GO
COMMIT
Run Code Online (Sandbox Code Playgroud)
我在用
Windows NT 6.3(内部版本9600 :)上的Microsoft SQL Server 2012(SP3)(KB3072779)-11.0.6020.0(X64)标准版(64位)
我跑了
DBCC CheckDB ('concept-test') WITH NO_INFOMSGS, ALL_ERRORMSGS
Run Code Online (Sandbox Code Playgroud)
它没有发现任何问题
由于收到此错误,恐怕数据库已损坏。我该如何纠正我的问题并将此索引放在桌子上?
谢谢
导致该状态的常见原因有:
首先找出问题的原因。请返回上一步,并检查是否由上述原因引起。例如,没有足够的磁盘空间。
对于根本原因,我们必须首先解决根本问题,然后修复数据库。
包括:
如果您解决了基本问题,则可以按照以下步骤操作。请注意,在启动之前,如果数据库是虚拟机,则强烈建议使用虚拟机快照。
打开SSMS并连接到失败的SQL Server实例。
查找处于可疑状态的数据库,并注意不要扩展它。只需创建一个新查询即可。
执行以下SQL
EXEC sp_resetstatus database_name;
ALTER DATABASE database_name SET EMERGENCY
Run Code Online (Sandbox Code Playgroud)
这会将数据库设置为紧急情况,以允许进一步修复。
执行以下SQL
DBCC CHECKDB (database_name)
DBCC CHECKCATALOG (database_name)
Run Code Online (Sandbox Code Playgroud)
这将在当前故障数据库上运行故障扫描。您可能会发现很多失败。这些错误可以依次检查。请注意,此步骤不会修复任何错误。
要运行数据库修复脚本,必须将数据库设置为单个用户。这也可以防止可能正在维修的其他人意外进入。
同时,我们要回滚最近的事务,因为最后的事务一定失败了,并且最后的事务很可能导致数据库失败。
ALTER DATABASE database_name SET SINGLE_USER WITH ROLLBACK IMMEDIATE
Run Code Online (Sandbox Code Playgroud)
DBCC CHECKDB (database_name, REPAIR_FAST) -- quick fix
DBCC CHECKDB (database_name, REPAIR_REBUILD) -- reset index
DBCC CHECKDB (database_name, REPAIR_ALLOW_DATA_LOSS) -- Allows correction of missing data
DBCC CHECKALLOC (database_name, REPAIR_REBUILD) -- Fixed allocation problem
DBCC DBREINDEX (database_name, REPAIR_REBUILD) -- fix index problem
Run Code Online (Sandbox Code Playgroud)
上面的代码将尝试修复数据库错误。如果您在执行过程中遇到障碍,请查看本文末尾有关高频问题的章节。
请注意,在上面的代码中,REPAIR_ALLOW_DATA_LOSS表示允许为了修复数据库而丢弃数据。第六步可能会花费很长时间,而大约30GB的数据库通常会花费几个小时。需要耐心等待。
运行上述SQL可能无法完全解决。您可以使用以下SQL多次修复该错误。
DECLARE @Number INT = 1 ;
While @Number < = 10
Begin
PRINT @Number;
SET @Number = @Number + 1 ;
DBCC CHECKDB(database_name, REPAIR_ALLOW_DATA_LOSS)
End
Run Code Online (Sandbox Code Playgroud)
此时,数据库已还原。我们可以重新允许与数据库的多个连接。
ALTER DATABASE database_name SET MULTI_USER
Run Code Online (Sandbox Code Playgroud)
此时,数据库已达到可用状态。应该立即备份数据库以导出可用数据状态的副本。如果数据库是虚拟机,建议在备份的同时拍摄快照。
同时,建议重新启动整个数据库服务器,并在重新启动后检查数据库是否仍然正常。这是为了避免重复数据库泄漏的可能原因。
可用数据可用后,我们可以检查当前数据库状态是否为较新状态。
在上述过程结束时,尽管大多数数据已经可用,但是数据库中仍然存在更多错误。
您可以使用以下SQL查看这些错误:
DBCC CHECKDB (database_name)
Run Code Online (Sandbox Code Playgroud)
如果要修复此部分错误,可以尝试备份然后还原备份,这可能可以解决此部分问题。
当数据库处于单用户状态时,我们将无法离开当前连接。因为一旦我们离开,可能会直接占用其他连接。
在这种情况下,我们必须手动终止冲入的其他连接,以确保我们是操作数据库的唯一用户。
方法如下:
首先执行以下SQL
Select d.name, d.dbid, spid, login_time, nt_domain, nt_username, loginame
From sysprocesses p inner join sysdatabases d on p.dbid = d.dbid
Where d.name = 'testdb01'
Go
Run Code Online (Sandbox Code Playgroud)
您将看到输出会话的列表,并找出传入连接的SPID。例如,SPID为51。
执行以下SQL
Kill 51
Go
Run Code Online (Sandbox Code Playgroud)
此时,我们可以继续在此单用户数据库上执行SQL。
| 归档时间: |
|
| 查看次数: |
12030 次 |
| 最近记录: |