
The script below is intended for SQL Server 2005 and above. Run the script below to see when is the last successful integrity check with DBINFO command and its dbi_dbccLastKnownGood field. DBINFO is an undocumented DBCC procedure that return some interesting information about the database. If there is 1900-01-01 00:00:00.000 on the result, that means no integrity check has ever ran before for that particular database. Run the DBCC CHECKDB again and you should see the date updated if the integrity check run successfully.
DECLARE @DB nvarchar(max) = NULL;
--SET @DB = N'YourDatabase'; --NULL to list all databases
DECLARE @Command nvarchar(max);
DECLARE @ExecCommand nvarchar(max);
CREATE TABLE #DBInfoTemp
(
ParentObject varchar(255)
, [Object] varchar(255)
, Field varchar(255)
, [Value] varchar(255)
);
CREATE TABLE #LastCkTemp
(
DatabaseName varchar(255)
, LastKnownGoodDate varchar(255)
);
IF @DB IS NULL
BEGIN
SET @Command = N'
INSERT INTO #DBInfoTemp
EXEC (''DBCC DBINFO([?]) WITH TABLERESULTS'');'
END
ELSE
BEGIN
SET @Command = N'
INSERT INTO #DBInfoTemp
EXEC (''DBCC DBINFO([' + @DB + ']) WITH TABLERESULTS'');'
END
SET @ExecCommand = @Command + N'
INSERT INTO #LastCkTemp
SELECT
MAX(CASE WHEN di.Field = ''dbi_dbname''
THEN di.Value
ELSE NULL
END) AS DatabaseName
, MAX(CASE WHEN di.Field = ''dbi_dbccLastKnownGood''
THEN di.Value
ELSE NULL
END) AS LastCheckDBDate
FROM #DBInfoTemp di
WHERE
di.Field = ''dbi_dbccLastKnownGood''
OR di.Field = ''dbi_dbname'';
TRUNCATE TABLE #DBInfoTemp;
';
IF @DB IS NULL
BEGIN
EXEC sp_MSforeachdb @ExecCommand;
END
ELSE
BEGIN
EXEC (@ExecCommand);
END
SELECT
ck.DatabaseName
, ck.LastKnownGoodDate
FROM #LastCkTemp ck;
DROP TABLE #LastCkTemp, #DBInfoTemp;
You can also use DBCC PAGE to find out the last known good time stored in the boot page. DBCC TRACEON is to get the DBCC PAGE output. Why 9 for DBCC PAGE? Because Paul Randal say so! Page 9 is where it stores the last known good information. After you run the command, scroll to find dbi_dbccLastKnownGood
DBCC TRACEON (3604); DBCC PAGE (YourDatabase, 1, 9, 3) ;
You can download sample corrupted SQL 2008 R2 databases provided by Paul Randal here at this link. Good for testing your DBCC CheckDB script when it detects corruption.

Another observation (or more a confirmation) is if the DBCC CHECKDB step (or native maintenance plan) encounters corruption, the SQL agent job will fail with errors. This behavior has been my assumption, but some website suggest otherwise. At least now I tested it and confirmed the behavior. Since there is a size limitation on the job history, you may want to consider using WITH NO_INFOMSGS parameter option to suppress information message in order to spare more space for error message.
Update: 1/26/2013
If the database is in READ_ONLY mode, the dbi_dbccLastKnownGood does not get updated on a successful consistency check.
No comments:
Post a Comment