Published on

August 30, 2015

Стратегии управления предприятием в SQL Server

Добро пожаловать на наш блог о стратегиях управления предприятием в SQL Server. В этой статье мы рассмотрим сессию system_health и как ее можно настроить для улучшения ее полезности в предприятий среде.

Сессия system_health – это сессия расширенных событий по умолчанию, которая запускается по умолчанию на каждом экземпляре SQL Server с SQL Server 2008. Однако, по умолчанию поведение сессии system_health в SQL Server 2008 и 2008 R2 заключается в записи событий в кольцевой буфер, который является целью памяти. Это может быть менее полезно в предприятий среде, где важно сохранять данные сессии событий в файле.

Чтобы сделать сессию system_health более подходящей для предприятий, вы можете добавить к ней файловую цель, аналогично тому, что было сделано в версиях SQL Server 2012 и новее. Добавление файловой цели позволит записывать данные сессии в файл, что делает их более надежными и легкими в управлении.

Вот пример того, как можно настроить сессию system_health с файловой целью:

-- Расширенная сессия событий по умолчанию
IF EXISTS (SELECT *
           FROM sys.server_event_sessions
           WHERE name = 'system_health')
    DROP EVENT SESSION system_health ON SERVER;
GO

-- Предикаты в этой сессии были тщательно разработаны для минимизации влияния сбора событий
-- Изменение определения предиката может повлиять на производительность системы
--
CREATE EVENT SESSION system_health ON SERVER
ADD EVENT sqlserver.error_reported (
    ACTION (package0.callstack, sqlserver.session_id, sqlserver.sql_text, sqlserver.tsql_stack)
    WHERE severity >= 20
    OR (error = 17803
        OR error = 701
        OR error = 802
        OR error = 8645
        OR error = 8651
        OR error = 8657
        OR error = 8902)),
ADD EVENT sqlos.scheduler_monitor_non_yielding_ring_buffer_recorded,
ADD EVENT sqlserver.xml_deadlock_report,
ADD EVENT sqlos.wait_info (
    ACTION (package0.callstack, sqlserver.session_id, sqlserver.sql_text)
    WHERE (duration > 15000
           AND ((wait_type > 31
                 AND (wait_type > 47
                      AND wait_type < 54)
                 OR wait_type < 38
                 OR (wait_type > 63
                     AND wait_type < 70)
                 OR (wait_type > 96
                     AND wait_type < 100)
                 OR (wait_type = 107)
                 OR (wait_type = 113)
                 OR (wait_type > 174
                     AND wait_type < 179)
                 OR (wait_type = 186)
                 OR (wait_type = 207)
                 OR (wait_type = 269)
                 OR (wait_type = 283)
                 OR (wait_type = 284))))
           OR (duration > 30000
               AND wait_type < 22))),
ADD EVENT sqlos.wait_info_external (
    ACTION (package0.callstack, sqlserver.session_id, sqlserver.sql_text)
    WHERE (duration > 5000
           AND ((wait_type > 365
                 AND wait_type < 372)
                OR (wait_type > 372
                    AND wait_type < 377)
                OR (wait_type > 377
                    AND wait_type < 383)
                OR (wait_type > 420
                    AND wait_type < 424)
                OR (wait_type > 426
                    AND wait_type < 432)
                OR (wait_type > 432
                    AND wait_type < 435)))
           OR (duration > 45000
               AND ((wait_type > 382
                     AND wait_type < 386)
                    OR (wait_type > 423
                        AND wait_type < 427)
                    OR (wait_type > 434
                        AND wait_type < 437)
                    OR (wait_type > 442
                        AND wait_type < 451)
                    OR (wait_type > 451
                        AND wait_type < 473)
                    OR (wait_type > 484
                        AND wait_type < 499)
                    OR wait_type = 365
                    OR wait_type = 372
                    OR wait_type = 377
                    OR wait_type = 387
                    OR wait_type = 432
                    OR wait_type = 502))))
ADD TARGET package0.asynchronous_file_target (SET filename = N'C:\Database\XE\system_health.xel'),
ADD TARGET package0.ring_buffer (SET max_memory = 4096)
WITH (STARTUP_STATE = ON);
GO

Теперь, когда данные сессии записываются в файл, вы также можете запланировать скрейпер для копирования файлов в центральную папку журнала в сети. Однако, обратите внимание, что прямое размещение файлов на UNC-шаре (через сопоставленный диск или UNC-именование) не работает в SQL Server 2008 или 2008 R2.

Настроив сессию system_health с файловой целью, вы делаете шаг в сторону более подходящего для предприятий решения. Просто не забудьте снова запустить сессию после внесения любых изменений.

Мы надеемся, что вы найдете эту статью полезной для понимания стратегий управления предприятием в SQL Server. Следите за нашим блогом для получения более информативных статей о темах SQL Server.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.