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