MS SQL巡检系列——检查数据库上一次DBCC CHECKDB的时间

DBCC CHECKDB检查指定数据库中的所有对象的逻辑和物理完整性,具体请参考MSDN文档。我们必须定期对数据库做完整性检查(DBCC CHECKDB),以便能及时发现一些数据库损坏(Corruption)的情况。如果你的数据库长时间没有做DBCC CHECKDB,这样是做是不合理,并且很危险的。那么我们怎么检查数据库上一次做DBCC CHECKDB的时间呢? 可以通过DBCC DBINFO来获取上一次做DBCC CHECKDB时间,DBCC DBINFO (db_name) 显示数据库的结构信息 ,它是一个未公开的命令,官方没有相关文档。适用于SQL SERVER 2005以及以上版本。

DBCC DBINFO ('YourSQLDba') WITH TABLERESULTS ;

DBCC DBINFO () WITH TABLERESULTS ;

 

如下所示,你找到Field值为dbi_dbccLastKnownGood的记录,表示这个数据库在2016-05-13 01:30:11.560做了DBCC CHECKDB,如果没有做过DBCC CHECKDB命令,VALUE值为1900-01-01 00:00:00.000

下面是巡检检查DBCC CHECKDB情况的脚本(只是巡检脚本的一部分)。此处定义的是至少一周必须做一次DBCC CHECKDB,否则提示那些数据库必须做完整性检查(DBCC CHECKDB)。具体情况,可以根据自身实际情况酌情处理。

CREATE TABLE #Db
  (
    DbName sysname
  )
  CREATE TABLE #Database
  (
    DbName sysname
  );
 
  INSERT INTO #Db
  SELECT name FROM sys.databases WHERE state_desc='ONLINE' AND database_id !=2;
 
  INSERT INTO #Database
  SELECT name FROM sys.databases WHERE state_desc='ONLINE' AND database_id !=2;
 
CREATE TABLE #DBCC_CHECKDB
(
    [DbName]        sysname  NULL   ,
    [ParentObject]  VARCHAR(120),
    [Object]        VARCHAR(120),
    [Field]         VARCHAR(60) ,
    [Value]         VARCHAR(120)
)
 
DECLARE @DbName   NVARCHAR(512);
DECLARE @SqlText  NVARCHAR(1024);
 
SET @DbName ='';
WHILE(1=1)
 
BEGIN
 SELECT TOP 1 
      @DbName = DbName
    FROM #Db
    WHERE DbName > @DbName -- next Dbname greater than @dbname
    ORDER BY DbName -- dbName order 
 
  -- exit loop if no more name greater than the last one used
    If @@rowcount = 0 Break 
 
    PRINT @DbName;
SET @SqlText='DBCC DBINFO (''' + LTRIM(RTRIM(@DbName)) + ''') WITH TABLERESULTS ' 
INSERT INTO #DBCC_CHECKDB([ParentObject],[Object],[Field], [Value])
EXEC(@SqlText);
 
UPDATE #DBCC_CHECKDB SET DbName = @DbName WHERE DbName IS NULL;
 
 Delete Db
  From #Db Db WHERE DbName=@DbName;
 
END
 
--SELECT * FROM #DBCC_CHECKDB WHERE Field='dbi_dbccLastKnownGood';
 
 
SELECT  db.DbName ,
        dc.ParentObject ,
        dc.Object,
        dc.Field ,
        dc.Value ,
        CASE WHEN DATEDIFF(DAY, CAST(dc.Value AS DATE), GETDATE()) > 7
             THEN 'You need do a dbcc checkdb now'
             ELSE 'dbcc checkdb is done during the past seven day'
        END AS CheckStatus
FROM    #Database db
        INNER JOIN #DBCC_CHECKDB dc ON db.DbName = dc.DbName
WHERE   Field = 'dbi_dbccLastKnownGood';
 
DROP TABLE #Db;
DROP TABLE #Database;
DROP TABLE #DBCC_CHECKDB;

测试效果如下截图所示,定期对服务器做巡检,就能对所有服务器的情况有所了解,当然如果服务器很多的情况下,一台一台去检查也非常麻烦,我们通过MyDBA系统将数据从其它服务器采集过来,然后在报表里面展示,非常的节省时间。

时间: 2024-10-18 07:42:31

MS SQL巡检系列——检查数据库上一次DBCC CHECKDB的时间的相关文章

MS SQL巡检系列——检查外键字段是否缺少索引

前言感想:一时兴起,突然想写一个关于MS SQL的巡检系列方面的文章,因为我觉得这方面的知识分享是有价值,也是非常有意义的.一方面,很多经验不足的人,对于巡检有点茫然,不知道要从哪些方面巡检,另外一方面,网上关于MS SQL巡检方面的资料好像也不是特别多.写这个系列只是一个分享,自己的初衷是一个知识梳理.总结提炼过程,有些知识和脚本也不是原创,文章很多地方融入了自己的一些想法和见解的,不足和肤浅之处肯定也非常多,抛砖引玉,也希望大家提意见和建议.补充,指正其中的不足之处.Stay Hungry

MS SQL巡检系列——检查重复索引

前言感想:一时兴起,突然想写一个关于MS SQL的巡检系列方面的文章,因为我觉得这方面的知识分享是有价值,也是非常有意义的.一方面,很多经验不足的人,对于巡检有点茫然,不知道要从哪些方面巡检,另外一方面,网上关于MS SQL巡检方面的资料好像也不是特别多.写这个系列只是一个分享,自己的初衷是一个知识梳理.总结提炼过程,有些知识和脚本也不是原创,文章很多地方也是融入了自己的一些想法和见解的,不足和肤浅之处肯定也非常多,抛砖引玉,也希望大家提意见和建议.补充,指正其中的不足之处.Stay Hungr

MS SQL 事物日志传送能否跨数据库版本吗?

    SQL SERVER的事物日志传送(log shipping)功能,相信很多人都使用过或正在应用,这是MS SQL提供的一个非常强大的功能,一般需要一个主数据库服务器(primary/production database server)和辅助数据库服务器(standby server)来完成这个配置,默认情况下,主数据库和辅助数据库的版本应该是一致的,那么如果这两个数据库版本不一致,会不会有什么问题?还能做log shipping配置吗? 那么数据库版本不一致分两种情况:     1:

SQL Server误区:使用BACKUP ... WITH CHECKSUM可以替代DBCC CheckDB

误区 #27:使用BACKUP ... WITH CHECKSUM可以替代DBCC CheckDB 错误 乍一看,由于BACKUP WITH CHECKSUM会检测所有分配出去的页的校验和的值,这个误区貌似是这么回事,但实际上并不是这么回事,原因如下: 由SQL Server 2000或是更早版本升上来的数据库page checksums必须开启,在开启后,并不是数据库中所有的页都会被叫上页校验和,当页损坏发生时,IO系统可不会区分损坏的页是有页校验和还是没有校验和的.所以使用BACKUP ..

MS SQL基础教程:常见的数据库对象

数据库对象是数据库的组成部分,常见的有以下几种: 3.3.1 表(Table ) 数据库中的表与我们日常生活中使用的表格类似,它也是由行(Row) 和列(Column)组成的.图3-1 中黑底白字的部分称为行,图3-2 中黑底白字的部分称为列.列由同类的信息组成,每列又称为一个字段,每列的标题称为字段名.行包括了若干列信息项.一行数据称为一个或一条记录,它表达有一定意义的信息组合.一个数据库表由一条或多条记录组成,没有记录的表称为空表.每个表中通常都有一个主关键字,用于惟一地确定一条记录,如图3

MS SQL 数据库状态为SUSPECT的处理方法

当SQL SERVER数据库状态为质疑(SUSPECT)状态时,我们可以用以下方法来处理: 1. 修改数据库为紧急模式:ALTER DATABASE DBName SET EMERGENCY . 2. 检查数据库的完整性:DBCC  CHECKDB('DBName') 3. 检查没有错误则恢复数据库为正常模式:ALTER DATABASE  DBName SET ONLINE; 4  如检查数据库有错误则修改数据库为单用户模式,依情况选择以下命令行进行修复数据; Code Snippet DBC

html javascript-html可以调用javascript来连接ms sql吗?

问题描述 html可以调用javascript来连接ms sql吗? 请问 在本地机器上 能用html调用javascript来连接ms sql server吗?这个本地机器没有安装任何web server. 同样的开发环境下,我可以用html调用javacript 来连接ms access. 连接成功,并且返回query信息在网页中! 不知道该怎样用在连接sql server中! 下面给出代码: <html> <head> <h1>VHIT ICO IS THE BE

ms sql 一个技术难点 高手进

问题描述 ms sql 一个技术难点 高手进 已知的是开始时间和结束时间 我需要求出这样的东西 举例说明:从开始时间到结束时间按月求出天数 如从1.1--2.20 那么所得出的结果是 XXX 1月(31天)2月(20天)以此类推 解决方案 使用case when,当做if方式来写,写12列(1-12月) 解决方案二: 有什么办法可以自适应呢? 比如我查询的是1月 其他月就不出现

SQL Server误区30日谈 第2天 DBCC CHECKDB会导致阻塞_MsSql

误区 #2: DBCC CHECKDB会引起阻塞,因为这个命令默认会加锁 这是错误的!     在SQL Server 7.0以及之前的版本中,DBCC CHECKDB命令的本质是C语言实现的一个不断嵌套循环的代码并对表加表锁(循环嵌套算法时间复杂度是嵌套次数的N次方,作为程序员的你懂得),这种方式并不和谐,并且-..     在SQL Server 2000时代,一个叫Steve Lindell的哥们(现在仍然在SQL Server Team)使用分析事务日志的方法来检查数据库的一致性的方式重