Есть ли способ запустить sys.dm_db_log_space_usage для всех баз данных? - PullRequest
0 голосов
/ 04 марта 2020

Я хочу создать инструмент мониторинга для отслеживания изменений в использовании журнала транзакций на поддерживаемом нами производственном сервере.

Ранее я использовал DBCC SQLPERF(LOGSPACE);, который предоставлял список всех баз данных и их текущий состояние памяти журнала транзакций. Тем не менее, Microsoft, похоже, предлагает с 2012 года просмотреть подробности журнала с sys.dm_db_log_space_usage, который предоставляет аналогичные подробности, но, похоже, указывает базу данных c, а не дает представление о сервере в целом (т.е. вы должны быть подключены к базе данных, которую вы будете использовать sh).

https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-sqlperf-transact-sql?view=sql-server-ver15

Я думаю, мой вопрос в два раза:

  1. Есть ли способ использовать sys.dm_db_log_space_usage для всех баз данных?
  2. Есть ли причина, по которой DBCC SQLPERF(LOGSPACE); не следует использовать?

Ответы [ 2 ]

0 голосов
/ 04 марта 2020

Есть ли какая-либо причина DB CC SQLPERF (LOGSPACE); не следует использовать?

Начиная с SQL Server 2012 (11.x), использовать DMV sys.dm_db_log_space_usage вместо DB CC SQLPERF (LOGSPACE), чтобы вернуть пробел информация об использовании для журнала транзакций для каждой базы данных

Есть ли способ использовать sys.dm_db_log_space_usage для всех баз данных?

Вы можете использовать следующий курсор. Может быть, это потребовало доработки;

CREATE TABLE [dbo].[Tbl_DbSizes](
    [database_id] [int] NULL,
    [total_log_size_in_bytes] [bigint] NULL,
    [used_log_space_in_bytes] [bigint] NULL,
    [used_log_space_in_percent] [real] NULL,
    [log_space_in_bytes_since_last_backup] [bigint] NULL
) ON [PRIMARY]

GO
DECLARE 
    @queryAsList VARCHAR(MAX) ,@DbName AS VARCHAR(100)

DECLARE Db_List CURSOR
FOR
SELECT name  FROM sys.databases 

OPEN Db_List;

FETCH NEXT FROM Db_List INTO 
   @DbName 

WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @queryAsList = 'INSERT INTO Tbl_DbSizes select * from '+ @DbName + '.' + 'sys.dm_db_log_space_usage'
        EXEC(@queryAsList)

        FETCH NEXT FROM Db_List INTO 
           @DbName
    END;

CLOSE Db_List;

DEALLOCATE Db_List;
SELECT name as databasename , total_log_size_in_bytes  ,
used_log_space_in_bytes,used_log_space_in_percent,log_space_in_bytes_since_last_backup 
FROM Tbl_DbSizes INNER JOIN sys.databases databaseinfo 
ON databaseinfo.database_id= Tbl_DbSizes.database_id

TRUNCATE TABLE [Tbl_DbSizes]


+--------------------+-------------------------+-------------------------+---------------------------+--------------------------------------+
|    databasename    | total_log_size_in_bytes | used_log_space_in_bytes | used_log_space_in_percent | log_space_in_bytes_since_last_backup |
+--------------------+-------------------------+-------------------------+---------------------------+--------------------------------------+
| master             |                 2088960 |                  729088 |                  34.90196 |                               270336 |
| tempdb             |                 8380416 |                  675840 |                  8.064516 |                               299008 |
| model              |                 8380416 |                 1617920 |                  19.30596 |                                73728 |
| msdb               |                 9428992 |                 1208320 |                  12.81494 |                                86016 |
| DWDiagnostics      |                75489280 |                 6467584 |                  8.567553 |                               253952 |
| DWConfiguration    |                 8380416 |                  626688 |                  7.478006 |                               253952 |
| DWQueue            |                 8380416 |                 1404928 |                  16.76442 |                               253952 |
| DemoDb             |                 8380416 |                 1732608 |                  20.67449 |                               266240 |
| ReportServer       |                75489280 |                13873152 |                  18.37765 |                               274432 |
| ReportServerTempDB |                75489280 |                 1925120 |                   2.55019 |                               245760 |
+--------------------+-------------------------+-------------------------+---------------------------+--------------------------------------+
0 голосов
/ 04 марта 2020

Я не мог заставить его работать на моей машине, но я нашел много о sp_MSForEachDB. Вы можете попробовать:

declare @findKeySQL varchar(1000)
SET @findKeySQL = 'IF ''[?]'' NOT IN (''[master]'', ''[model]'',''[msdb]'', ''[tempdb]'')
        USE [?] select * from sys.dm_db_log_space_usage'
EXEC sp_MSForEachDB @findKeySQL

Надеюсь, это сработает для вас!

...