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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM