使用 Tsql,我如何知道 DBCC checkdb 上次在 SQL 服务器上运行的时间(2000、2005 或 2008)?
问候
在 2005 年及以上,您可以运行
DBCC DBINFO ('YourDatabaseName') WITH TABLERESULTS
寻找 dbi_dbccLastKnownGood
试试这个来检查 SQL 2005 以后的所有数据库
SET NOCOUNT ON;
DBCC TRACEON (3604);
CREATE TABLE #temp (
Id INT IDENTITY(1,1),
ParentObject VARCHAR(255),
[Object] VARCHAR(255),
Field VARCHAR(255),
[Value] VARCHAR(255)
)
CREATE TABLE #Results (
DBName VARCHAR(255),
LastGoodDBCC VARCHAR(255)
)
DECLARE @Name VARCHAR(255);
DECLARE looping_cursor CURSOR
FOR
SELECT name
FROM master.dbo.sysdatabases
WHERE CONVERT(varchar(500),databasepropertyex(name, 'Status'),0) = 'ONLINE'
OPEN looping_cursor
FETCH NEXT FROM looping_cursor INTO @Name
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO #temp
EXECUTE('DBCC PAGE (['+@Name+'], 1, 9, 3)WITH TABLERESULTS');
INSERT INTO #Results
SELECT @Name,MAX(VALUE) FROM #temp
WHERE Field = 'dbi_dbccLastKnownGood';
FETCH NEXT FROM looping_cursor INTO @Name
END
CLOSE looping_cursor;
DEALLOCATE looping_cursor;
SELECT DBName
,ISNULL(LastGoodDBCC,'1900-01-01 00:00:00.000') AS 'LastGoodDBCC'
FROM #Results
DROP TABLE #temp
DROP TABLE #Results
DBCC TRACEON (3604);
GO
-- page 9 is the boot page
DBCC PAGE (dbname, 1, 9, 3);
GO
您需要查找 dbi_dbccLastKnownGood 字段。那是 DBCC CHECKDB 最后一次运行时没有发现任何损坏。
从 SQL Server 2016 SP2 开始,您可以使用:
SELECT DATABASEPROPERTYEX(DB_NAME(), 'LastGoodCheckDbTime')
LastGoodCheckDbTime
上次在指定数据库上成功运行 DBCC CHECKDB 的日期和时间。
NULL = 输入无效 基本数据类型:日期时间
如果您使用 Ola Hallengren 的维护脚本,则此信息将保存在CommandLog
表中。以下是如何获取上周的所有 DBCC_CHECKDB 执行:
USE [master]
GO
SELECT *
FROM [CommandLog]
WHERE [CommandType] ='DBCC_CHECKDB'
AND (CONVERT([datetime], [StartTime], 102) >= GETDATE() - 7)
ORDER BY [StartTime], [EndTime]
上面的查询产生不正确的结果,因为 #temp 表在游标内没有被截断
SET NOCOUNT ON;
DBCC TRACEON (3604);
CREATE TABLE #temp (
Id INT IDENTITY(1,1),
ParentObject VARCHAR(255),
[Object] VARCHAR(255),
Field VARCHAR(255),
[Value] VARCHAR(255)
)
CREATE TABLE #Results (
DBName VARCHAR(255),
LastGoodDBCC VARCHAR(255)
)
DECLARE @Name VARCHAR(255);
DECLARE looping_cursor CURSOR
FOR
SELECT name
FROM master.dbo.sysdatabases
WHERE CONVERT(varchar(500),databasepropertyex(name, 'Status'),0) = 'ONLINE'
OPEN looping_cursor
FETCH NEXT FROM looping_cursor INTO @Name
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO #temp
EXECUTE('DBCC PAGE (['+@Name+'], 1, 9, 3)WITH TABLERESULTS');
INSERT INTO #Results
SELECT @Name,MAX(VALUE) FROM #temp
WHERE Field = 'dbi_dbccLastKnownGood';
truncate table #temp
FETCH NEXT FROM looping_cursor INTO @Name
END
CLOSE looping_cursor;
DEALLOCATE looping_cursor;
SELECT DBName
,ISNULL(LastGoodDBCC,'1900-01-01 00:00:00.000') AS 'LastGoodDBCC'
FROM #Results