SQL Server元数据损坏(metadata corruption)修复
原文:SQL Server元数据损坏(metadata corruption)修复

在升级一个SQL Server 2000的数据库时,遇到了一致性错误,其中有几个错误是元数据损坏(metadata corruption),特意研究了一下这个案例,因为以前也零零散散的遇到过一些一致性相关错误,但是难得遇到元数据损坏的案例。

如下所示,数据库从SQL Server 2000还原到SQL Server 2008以后,在做一致性检查时,发现有元数据损坏(metadata corruption),下面是实验是构造的一个测试环境

DBCC CHECKCATALOG (TEST) WITH NO_INFOMSGS;
GO
 
DBCC CHECKDB(TEST) WITH NO_INFOMSGS;
GO

Msg 8992, Level 16, State 1, Line 1

Check Catalog Msg 3853, State 1: Attribute (object_id=1362819917) of row (object_id=1362819917,parameter_id=1) in sys.parameters does not have a matching row (object_id=1362819917) in sys.objects.

Msg 8992, Level 16, State 1, Line 1

Check Catalog Msg 3853, State 1: Attribute (object_id=1362819917) of row (object_id=1362819917,parameter_id=2) in sys.parameters does not have a matching row (object_id=1362819917) in sys.objects.

CHECKDB found 0 allocation errors and 2 consistency errors not associated with any single object.

CHECKDB found 0 allocation errors and 2 consistency errors in database 'TEST'.

那么我们先找到系统视图sys.parameters的数据来源于那个系统基础表(System Base-Table Metadata),如下脚本所示,我们可以找到sys.parameters 最终来源于sys.syscolpars和 sys.sysobjvalues(关于如何获取视图视图定义,此处不做展开分析)

SET QUOTED_IDENTIFIER ON
SET ANSI_NULLS ON
GO
CREATE VIEW sys.parameters AS
    SELECT object_id, name,
        parameter_id, system_type_id,
        user_type_id, max_length,
        precision, scale,
        is_output, is_cursor_ref,
        has_default_value, is_xml_document,
        default_value, xml_collection_id,
        is_readonly
    FROM sys.parameters$
    WHERE number = 1
 
GO
 
 
 
CREATE VIEW sys.parameters$ AS
    SELECT c.id AS object_id,
        c.number, c.name,
        c.colid AS parameter_id,
        c.xtype AS system_type_id,
        c.utype AS user_type_id,
        c.length AS max_length,
        c.prec AS precision,
        c.scale AS scale,
        sysconv(bit, c.status & 512) AS is_output,        -- CPM_OUTPUT
        sysconv(bit, c.status & 1024) AS is_cursor_ref,    -- CPM_CURSORREF
        sysconv(bit, isnull(v.objid, 0)) AS has_default_value,
        sysconv(bit, c.status & 2048) AS is_xml_document, -- CPM_XML_DOC        
        v.value AS default_value,
        xmlns AS xml_collection_id,
        sysconv(bit, c.status & 4194304) AS is_readonly -- CPM_IS_READONLY = 0x00400000
    FROM sys.syscolpars c
    LEFT JOIN sys.sysobjvalues v ON v.valclass = 9 AND v.objid = c.id AND v.subobjid = c.colid AND v.valnum = 0    -- SVC_PARAMDEFAULT
    WHERE number > 0 AND has_access('CO', c.id) = 1

但是系统基础表sys.syscolpars和sys.sysobjvalues在正常情况下是不可见的。只有在数据库专用管理员连接方式(DAC Dedicated Administrator Connection)连接下才能可见。如下所示,可以判断数据来源于sys.syscolpars系统基础表。

此时即使在专用管理员连接下面也是无法删除这些数据的,会报“Ad hoc update to system catalogs is not supported”,对应中文提示为“不支持对系统目录进行即席更新”。如下所示:

EXEC sp_configure 'allow_updates', 1;

RECONFIGURE WITH OVERRIDE;

GO

USE TEST;

GO

DELETE FROM  sys.syscolpars WHERE id=1362819917;

GO

那么难道就没有办法解决这种问题了吗? 答案是当然有,不过,这种方式是没有官方文档而且也不被官方Support的,如果你要按下面方法操作,是有一定风险的。所以如果你决定按照下面方式修复元数据损坏的话,先做好备份。以防万一。

你必须将数据库实例在单用户模式下面启动,然后以专用管理员(DAC)连接到数据库,然后就可以删除基础表下面的数据了,如下截图所示:

C:\Documents and Settings>net stop mssqlserver

The SQL Server (MSSQLSERVER) service is stopping.

The SQL Server (MSSQLSERVER) service was stopped successfully.

C:\Documents and Settings>net start mssqlserver /m"Microsoft SQL Serve

r Management Studio - Query"

The SQL Server (MSSQLSERVER) service is starting.

The SQL Server (MSSQLSERVER) service was started successfully.

USE TEST;
GO
DELETE FROM  sys.syscolpars WHERE id=1362819917;
GO
 
----------------------------------------------------------------------------------
Warning: System table ID 41 has been updated directly in database ID 5 and cache coherence may not have been maintained. SQL Server should be restarted.
 
(2 row(s) affected)

此时再去检查数据库一致性,你就会看到上面遇到的元数据损坏错误不见了。如下截图所示:

其实如果是从SQL Server 2000还原的话,在SQL Server 2000当中是可以修改相关系统表的,如果执行了DBCC CHECKDB命令发现了元数据问题,那么可以直接修改系统表解决问题(当然只是部分情况),如果已经还原到了SQL Server 2008 以上数据库时,就必须按这种方式折腾,由于这种方式,官方是不支持的。所以还是有一定风险的。因为你不清楚潜在的风险,也不能确保任何场景都能解决问题而不出现意外情况。所以操作之前,尽量多测试、做好备份以防万一。

posted on 2018-04-08 10:51 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/8743602.html

SQL Server元数据损坏(metadata corruption)修复相关推荐

  1. SQL Server数据库损坏、检测以及简单的修复办法

    简介 在一个理想的世界中,不会存在任何数据库的损坏,就像我们不会将一些严重意外情况列入我们生活中的日常一样,而一旦这类事情发生,一定会对我们的生活造成非常显著的影响,在SQL Server中也同样如此 ...

  2. react sql格式化_为SQL Server数据库损坏做准备; 初步React与分析

    react sql格式化 Corruption is a looming thought through every administrator's mind, from sysadmins to d ...

  3. 访问 Microsoft SQL Server 元数据的三种

    上海微创软件有限公司 肖桂东 适用读者:Microsoft SQL Server 中.高级用户 元数据简介 元数据 (metadata) 最常见的定义为"有关数据的结构数据",或者 ...

  4. 针对开发人员的Microsoft SQL Server元数据

    Microsoft SQL Server 2016最近在关系数据库管理系统(RDBMS)中处于领先地位. 高性能,安全性,分析和云兼容性的结合使其成为领先的RDBMS . SQL Server 201 ...

  5. SQL server卸载软件(可修复注册表)

    本软件可以用于卸载各种流氓软件本人只测试了SQL server,其他软件可自行测试 如果你在卸载SQL server重装时,试尽了各种办法不妨试试微软官方推荐的修复软件.(亲测免安装) 蓝奏云下载 密 ...

  6. dbnetlib sqlserver不存在或拒绝访问_SQL Server数据库损坏和修复

    常见错误解读 823错误 错误信息是:"在文件'%ls'中.偏移量为%#016I64x的位置执行%S_MSG期间,操作系统已经向SQL Server返回了错误%ls." " ...

  7. 如何使用损坏或删除SQL Server事务日志文件重建数据库

    This is the last article, but not the least one, in the SQL Server Transaction Log series. In this s ...

  8. MS Sql Server 数据库或表修复(DBCC CHECKDB)

    MS Sql Server 提供了很多数据库修复的命令,当数据库质疑或是有的无法完成读取时可以尝试这些修复命令.  1. DBCC CHECKDB  重启服务器后,在没有进行任何操作的情况下,在SQL ...

  9. 常用SQL Server数据修复命令DBCC一览(转载)

    MS Sql Server 提供了很多数据库修复的命令,当数据库质疑或是有的无法完成读取时可以尝试这些修复命令. 1. DBCC CHECKDB  重启服务器后,在没有进行任何操作的情况下,在SQL查 ...

最新文章

  1. php 去掉nbsp,php 正则去掉pnbsp;/p 空格 nbsp;
  2. 如何设置NeoFinder在共享网络中的目录数据库
  3. 001 【Chrome】浏览器自带取色器
  4. VBA基础语法:类型转换函数
  5. maven项目中的pom文件依赖关系
  6. 二月(不积跬步无以至千里)
  7. python实现抢票github_面向回家编程!GitHub标星两万的”Python抢票教程”,我们先帮你跑了一遍...
  8. lm曲线公式推导_宏观经济学 - LM曲线
  9. c++ 线程进度条_AMD R9 5900X 跑分曝光,单线程性能大幅提升;天猫“官宣”苹果iPhone 12:暗示10月16日开启预定...
  10. SE14激活并调整数据库时报数据库对象不一致错误
  11. 测试apk-异常管控WiFi Scan攻击者开发
  12. primary key与unique的区别
  13. PUTTY 中文教程
  14. QT UI控件和事件
  15. 用Android Studio设计的一个简单的闹钟APP
  16. lcDFS1 深度优先遍历1[记忆化搜索]
  17. 测试前如何进行配置项测试?
  18. 球场外也有比赛,央视影音逆袭世界杯,极速高清全靠腾讯云
  19. 【Mysql性能调优】高性能表结构及索引设计的最优实践
  20. axios 响应拦截 token失效导致出现多个提示框的解决办法

热门文章

  1. Linux arm 下载程序,arm-linux—gcc如何下载安装
  2. mybatis 关联查询 延迟加载
  3. nginx ngx_http_core_module(http server location)
  4. opencv 直方图
  5. Oracle union多表查询
  6. LIST函数JAVA特点_Java 集合系列 07 List总结(LinkedList, ArrayList等使用场景和性能分析)...
  7. vSphere 5.5:使用 RVC VSAN 监控工具
  8. 漫谈云计算与OpenStack的前世今生
  9. 分享一下把pdftk的合并pdf功能添加到TC(Totalcommander)
  10. Java基础学习总结(116)——Map使用相关问题总结