• 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

    clipboard

    下面是巡检检查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系统将数据从其它服务器采集过来,然后在报表里面展示,非常的节省时间。

    image

  • 相关阅读:
    02_排版标记
    21_listview展示数据内容回顾
    00_前情回顾
    20_通过listview展示数据库数据_完成
    18_simpleadapter和ArrayAdapter总结
    19_通过listview展示数据库数据_数据库准备数据完成
    前端面试题-url、href、src
    前端面试题-url、href、src
    前端面试题-url、href、src
    这8个方法让你成为最优秀的程序员
  • 原文地址:https://www.cnblogs.com/kerrycode/p/5489721.html
Copyright © 2020-2023  润新知