Как найти причину тупика в sql server ro14? - PullRequest
0 голосов
/ 20 сентября 2018

Находится в тупике в базе данных сервера SQL и может видеть запись тупика в журналах SQL.Как можно использовать записи в журнале, чтобы найти причину этого тупика?

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

Информация о взаимоблокировке может быть зафиксирована в журнале ошибок SQL Server или с помощью Profiler / Server Side Trace.

  • 1204 - это предоставляет информацию об узлах, участвующих в взаимоблокировке
  • 1222 - возвращает информацию о взаимоблокировке в формате XML

. Вы можете включить каждый из них по отдельности или включить их вместе.

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

DBCC TRACEON (1204, -1)
DBCC TRACEON (1222, -1)

Пожалуйста, обратитесь к следующим ссылкам для получения более подробной информации

0 голосов
/ 20 сентября 2018

Информация о взаимоблокировке фиксируется трассировкой system_health Extended Events по умолчанию.Не нужно включать дополнительные флаги трассировки.

Информацию о событии xml_deadlock можно просмотреть в обозревателе объектов SSMS (Управление -> Расширенные события -> Сеансы - system_health) или с помощью T-SQL.Ниже приведен пример запроса для получения тупикового xml из целевого файла.Вы также можете сохранить файл взаимоблокировки xml в файл с расширением xdl и открыть файл в SSMS для графического просмотра тупика.

--get xml_deadlock_report from system_health session file target
WITH
      --get full path to current system_health trace file
      CurrentSystemHealthTraceFile AS (
        SELECT CAST(target_data AS xml).value('(/EventFileTarget/File/@name)[1]', 'varchar(255)') AS FileName
        FROM sys.dm_xe_session_targets
        WHERE
            target_name = 'event_file'
            AND CAST(target_data AS xml).value('(/EventFileTarget/File/@name)[1]', 'varchar(255)') LIKE '%\system[_]health%'
    )
      --get trace folder name and add base name of system_health trace file with wildcard
    , BaseSystemHealthFileName AS (
        SELECT 
            REVERSE(SUBSTRING(REVERSE(FileName), CHARINDEX(N'\', REVERSE(FileName)), 255)) + N'system_health*.xel' AS FileNamePattern
        FROM CurrentSystemHealthTraceFile
        )
      --get xml_deadlock_report events from all system_health trace files
    , DeadLockReports AS (
        SELECT CAST(event_data AS xml) AS event_data
        FROM BaseSystemHealthFileName
        CROSS APPLY sys.fn_xe_file_target_read_file ( FileNamePattern, NULL, NULL, NULL) AS xed
        WHERE xed.object_name like 'xml_deadlock_report'
    )
--display 10 most recent deadlocks
SELECT TOP 10
      DATEADD(hour, DATEDIFF(hour, SYSUTCDATETIME(), SYSDATETIME()), event_data.value('(/event/@timestamp)[1]', 'datetime2')) AS LocalTime
    , event_data AS DeadlockReport
FROM DeadLockReports
ORDER BY LocalTime ASC;
0 голосов
/ 20 сентября 2018

Этот код будет отображать журнал ошибок, который содержит запрос, который создает тупик.ЕСЛИ OBJECT_ID ('tempdb.dbo.ErrorLog') не равен NULL НАЧАТЬ ТАБЛИЦУ УДАЛЕНИЯ tempdb.dbo.ErrorLog END

 CREATE TABLE tempdb.dbo.ErrorLog 
 (Id int IDENTITY (1, 1) NOT NULL, 
  logdate DATETIME, procInfo VARCHAR(10), 
  ERRORLOG VARCHAR(MAX))

  -- insert the actual data from the Error log into our newly created table.

 INSERT INTO tempdb.dbo.ErrorLog
 EXEC master.dbo.sp_readerrorlog


declare @sql nvarchar(max)
set @sql='select logdate, procInfo, ERRORLOG from tempdb.dbo.ErrorLog 
where Id >= (select top 1 id  from tempdb.dbo.ErrorLog WHERE ERRORLOG Like 
''%deadlock-list%'' order by id desc)'
select @SQL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...