首页
学习
活动
专区
圈层
工具
发布

DBCC
EN

Database Administration用户
提问于 2016-03-29 14:57:13
回答 2查看 846关注 0票数 4

我创建了以下查询,以列出服务器上所有数据库的DBCC时间戳。有更好的方法吗?

代码语言:javascript
复制
IF OBJECT_ID(N'tempdb..#Results') IS NOT NULL
BEGIN
    DROP TABLE #Results
END

CREATE TABLE #Results (ParentObject varchar(100), Object varchar(100), Field varchar(100), Value varchar(100))
GO

INSERT INTO #Results
EXEC sp_msForEachdb @command1 = 'DBCC DBINFO (''?'') WITH TABLERESULTS'

ALTER TABLE #Results ADD ID INT IDENTITY(1, 1)
GO -- required here

SELECT r.Value as [Database], r2.Value as CheckDB_LastKnownGood
FROM #Results r
INNER JOIN #Results r2
ON r2.ID = (SELECT MIN(ID) FROM #Results WHERE Field = 'dbi_dbccLastKnownGood' AND ID > r.ID)
WHERE r.Field = 'dbi_dbname'
ORDER BY r.Value
EN

回答 2

Database Administration用户

发布于 2017-03-23 13:34:56

我将使用来自dbatools模块的PowerShell命令,这将使您能够一次性检查所有服务器。

下面是命令的示例输出

你可以得到这样的详细信息

检查一堆像这样的服务器

它也很快。在我拥有125个数据库的10台服务器的实验室中,它在5.3秒内完成

您可以在https://dbatools.io上阅读更多关于dbatools的内容。

票数 8
EN

Database Administration用户

发布于 2016-03-29 16:28:45

您可以使用游标,而不是使用sp_msForEachdb (正如亚伦描述的那样有问题)。

代码语言:javascript
复制
IF OBJECT_ID(N'tempdb..#Results') IS NOT NULL
BEGIN
    DROP TABLE #Results;
END

CREATE TABLE #Results
(
    DatabaseName SYSNAME NULL
    , IsOnline BIT NULL
    , ParentObject varchar(100) NULL
    , [Object] varchar(100) NULL
    , [Field] varchar(100) NULL
    , [Value] varchar(100) NULL
);

DECLARE @cmd NVARCHAR(MAX);
DECLARE @dbName SYSNAME;
DECLARE @IsOnline BIT;

DECLARE cur CURSOR LOCAL FORWARD_ONLY STATIC
FOR
SELECT DBCCCommand = 'DBCC DBINFO(''' + d.name + ''') WITH TABLERESULTS;'
    , DatabaseName = d.name
    , IsOnline = CONVERT(BIT, 
        CASE WHEN d.state_desc = 'ONLINE' THEN 1 ELSE 0 END
      )
FROM sys.databases d
ORDER BY d.name;

OPEN cur;
FETCH NEXT FROM cur INTO @cmd, @dbName, @IsOnline;

WHILE @@FETCH_STATUS = 0
BEGIN
    RAISERROR (@dbName, 0, 1) WITH NOWAIT;
    IF @IsOnline = 1
    BEGIN
        INSERT INTO #Results (ParentObject, [Object], [Field], [Value])
        EXEC sp_executesql @cmd;
        UPDATE #Results 
        SET DatabaseName = @dbName
            , IsOnline = @IsOnline
        WHERE DatabaseName IS NULL;
    END
    ELSE
    BEGIN
        INSERT INTO #Results (DatabaseName, IsOnline)
        VALUES (@dbName, @IsOnline)
    END

    FETCH NEXT FROM cur INTO @cmd, @dbName, @IsOnline;
END

CLOSE cur;
DEALLOCATE cur;

SELECT r.DatabaseName
    , LastKnownGoodDate = CONVERT(DATETIME, r.value, 120)
    , r.IsOnline
FROM #Results r
WHERE r.field = 'dbi_dbccLastKnownGood'
    OR r.field IS NULL;

此输出具有数据库名和DBINFO输出中的LastKnownGood列作为DATETIME变量。未“联机”的数据库包括在输出中,LastKnownGoodDBCC列设置为NULL

在我上面的例子中创建的游标是一个本地的、仅向前的、静态的游标,它非常高效。本地表示游标的范围仅限于我们的会话,这显然不是一个问题( sp_msForEachdb使用的是一个全局游标,设置起来非常昂贵)。前进选项表示我们不打算通过游标向后滚动,并允许Server使用前向只读游标语义。静态选项迫使Server将游标结果具体化到tempdb中的临时表中,并从那里读取每一行。声明游标上的MSDN页面拥有关于游标选项的优秀细节,非常值得阅读和理解。

票数 7
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/133687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档