Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Отправка xml deadlock на почту  [new]
Dorirad.Dolabar
Member

Откуда:
Сообщений: 5
Здравствуйте.
Пытаюсь решить проблему мониторинга deadlock, но при этом чтобы на почту отправлялся сам xml. Нашел код который выводит актуальную последнюю информацию и пытаюсь отправить вывод по почте:

declare @subject varchar(250)
select @subject = 'Deadlock reported on ' + @@servername

EXEC msdb.dbo.sp_send_dbmail
      
       @profile_name = 'Mail_Profile_Prod',
       @recipients='*********',
       @subject = @subject,
       @body_format = 'HTML',
       @body = 'A deadlock has been recorded.  Further information can be found in the attached file.',
       @query = 'set QUOTED_IDENTIFIER on;
       CREATE TABLE #errorlog (
            LogDate DATETIME 
            , ProcessInfo VARCHAR(100)
            , [Text] VARCHAR(MAX)
            );
DECLARE @tag VARCHAR (MAX) , @path VARCHAR(MAX);
INSERT INTO #errorlog EXEC sp_readerrorlog;
SELECT @tag = text
FROM #errorlog 
WHERE [Text] LIKE ''Logging%MSSQL\Log%'';
DROP TABLE #errorlog;
SET @path = SUBSTRING(@tag, 38, CHARINDEX(''MSSQL\Log'', @tag) - 29);
SELECT TOP 1 
  CONVERT(xml, event_data).query(''/event/data/value/child::*'') AS DeadlockReport,
  CONVERT(xml, event_data).value(''(event[@name="xml_deadlock_report"]/@timestamp)[1]'', ''datetime'') 
  AS Execution_Time
FROM sys.fn_xe_file_target_read_file(@path + ''\system_health*.xel'', NULL, NULL, NULL)
WHERE OBJECT_NAME like ''xml_deadlock_report''
ORDER BY Execution_Time DESC',
      @query_result_width = 32767
      @attach_query_result_as_file = 1


Сообщение приходит, но текст вложения в крайне обрезанном виде, подозреваю что надо как-то из вывода получить отдельно xml и посылать уже его. Но не могу разобраться как это можно сделать, или может есть альтернативы, в sql очень слаб. Пожалуйста помогите.

Как симулировать deadlock, чтобы появилась хоть одна запись, написано тут https://stackoverflow.com/questions/22825147/how-to-simulate-deadlock-on-sql-server

Сообщение было отредактировано: 16 янв 21, 16:14
16 янв 21, 16:20    [22264402]     Ответить | Цитировать Сообщить модератору
 Re: Отправка xml deadlock на почту  [new]
Dorirad.Dolabar
Member

Откуда:
Сообщений: 5
Вот такой вывод

К сообщению приложен файл. Размер - 7Kb


Сообщение было отредактировано: 16 янв 21, 16:20
16 янв 21, 16:24    [22264405]     Ответить | Цитировать Сообщить модератору
 Re: Отправка xml deadlock на почту  [new]
Dorirad.Dolabar
Member

Откуда:
Сообщений: 5
Вопрос стал более конкретный, наколхозил тут. и вроде уже должно работать, но вместо полноценного текста опять он шлет обрывок, я не понимаю в чем прикол:
CREATE TABLE #errorlog (
            LogDate DATETIME 
            , ProcessInfo VARCHAR(100)
            , [Text] VARCHAR(MAX)
            );
DECLARE @tag VARCHAR (MAX) , @path VARCHAR(MAX), @deadlock xml, @body1 VARCHAR(MAX);
INSERT INTO #errorlog EXEC sp_readerrorlog;
SELECT @tag = text
FROM #errorlog 
WHERE [Text] LIKE 'Logging%MSSQL\Log%';
DROP TABLE #errorlog;

----------------

CREATE TABLE #res (
            DeadlockReport xml, 
            LogDate DATETIME
                   ); 
-------------------
SET @path = SUBSTRING(@tag, 38, CHARINDEX('MSSQL\Log', @tag) - 29);

insert into #res
SELECT top 1
  CONVERT(xml, event_data).query('/event/data/value/child::*') AS DeadlockReport,
  CONVERT(xml, event_data).value('(event[@name="xml_deadlock_report"]/@timestamp)[1]', 'datetime') 
  AS Execution_Time
FROM sys.fn_xe_file_target_read_file(@path + '\system_health*.xel', NULL, NULL, NULL)
WHERE OBJECT_NAME like 'xml_deadlock_report'
ORDER BY Execution_Time DESC;

set @deadlock = (select [DeadlockReport] from #res)
--PRINT 'Deadlock: ' + CONVERT(VARCHAR(MAX), @deadlock);
set @body1 = CONVERT(VARCHAR(MAX), @deadlock)
print @body1
-------------------

declare @subject varchar(250)
select @subject = 'Deadlock reported on ' + @@servername

EXEC msdb.dbo.sp_send_dbmail
	  
       @profile_name = 'Mail_Profile_Prod',
       @recipients='***************',
       @subject = @subject,
	   @body_format = 'HTML',
       @body = @body1
	   
   --    @query = 'set QUOTED_IDENTIFIER on; 	   print @deadlock;',
     -- @query_result_width = 32767,
     -- @attach_query_result_as_file = 1 
-------------------
DROP TABLE #res;


Вот что выводит print:
автор
(3354 rows affected)

(1 row affected)
<deadlock><victim-list><victimProcess id="process1fd2e0e48c8"/></victim-list><process-list><process id="process1fd2e0e48c8" taskpriority="0" logused="292" waitresource="RID: 45:1:164440:0" waittime="250" ownerId="4640151169" transactionname="user_transaction" lasttranstarted="2021-01-15T18:04:39.067" XDES="0x1ffb4014420" lockMode="U" schedulerid="3" kpid="16200" status="suspended" spid="257" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2021-01-15T18:06:21.077" lastbatchcompleted="2021-01-15T18:06:21.073" lastattention="1900-01-01T00:00:00.073" clientapp="Microsoft SQL Server Management Studio - Query" hostname="SQL" hostpid="12632" loginname="*******" isolationlevel="read committed (2)" xactid="4640151169" currentdb="45" currentdbname="DBADB" lockTimeout="4294967295" clientoption1="671090784" clientoption2="390200"><executionStack><frame procname="adhoc" line="1" stmtstart="60" stmtend="164" sqlhandle="0x02000000696fc60d07e5ac70ad4c651c06a4ec011548aecb0000000000000000000000000000000000000000">
unknown </frame><frame procname="adhoc" line="1" stmtend="114" sqlhandle="0x020000008d4eba005eafe19de696f6e313b5cfd7b8c53e6c0000000000000000000000000000000000000000">
unknown </frame></executionStack><inputbuf>
UPDATE Employees
SET Phone = N'555-9999'
WHERE EmpId = 1 </inputbuf></process><process id="process1faca6dfc28" taskpriority="0" logused="304" waitresource="RID: 45:1:164448:0" waittime="15884" ownerId="4640152981" transactionname="user_transaction" lasttranstarted="2021-01-15T18:04:40.990" XDES="0x1fbcbcec420" lockMode="U" schedulerid="1" kpid="9768" status="suspended" spid="318" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2021-01-15T18:06:05.443" lastbatchcompleted="2021-01-15T18:06:05.443" lastattention="1900-01-01T00:00:00.443" clientapp="Microsoft SQL Server Management Studio - Query" hostname="SQL" hostpid="12632" loginname="**********" isolationlevel="read committed (2)" xactid="4640152981" currentdb="45" currentdbname="DBADB" lockTimeout="4294967295" clientoption1="671090784" clientoption2="390200"><executionStack><frame procname="adhoc" line="1" stmtstart="60" stmtend="170" sqlhandle="0x02000000523f2b16e8151c86efb7cbf2c4b97d43c97666f80000000000000000000000000000000000000000">
unknown </frame><frame procname="adhoc" line="1" stmtend="120" sqlhandle="0x02000000736d5a1a34a90001467ee8941cc8b0edf596cb540000000000000000000000000000000000000000">
unknown </frame></executionStack><inputbuf>
UPDATE Suppliers
SET Fax = N'555-1212'
WHERE SupplierId = 1 </inputbuf></process></process-list><resource-list><ridlock fileid="1" pageid="164440" dbid="45" objectname="DBADB.dbo.Employees" id="lock1ffb3858900" mode="X" associatedObjectId="72057594043367424"><owner-list><owner id="process1faca6dfc28" mode="X"/></owner-list><waiter-list><waiter id="process1fd2e0e48c8" mode="U" requestType="wait"/></waiter-list></ridlock><ridlock fileid="1" pageid="164448" dbid="45" objectname="DBADB.dbo.Suppliers" id="lock2000c321780" mode="X" associatedObjectId="72057594043432960"><owner-list><owner id="process1fd2e0e48c8" mode="X"/></owner-list><waiter-list><waiter id="process1faca6dfc28" mode="U" requestType="wait"/></waiter-list></ridlock></resource-list></deadlock>
Mail (Id: 703) queued.

Completion time: 2021-01-16T17:20:01.9303778+03:00


А вот что приходит в письме:

автор
unknown unknown UPDATE Employees SET Phone = N'555-9999' WHERE EmpId = 1 unknown unknown UPDATE Suppliers SET Fax = N'555-1212' WHERE SupplierId = 1
16 янв 21, 17:29    [22264450]     Ответить | Цитировать Сообщить модератору
 Re: Отправка xml deadlock на почту  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8346
Dorirad.Dolabar,

@attach_query_result_as_file = 1 не помогает, выходит? Подсчитывали количество символов, которое приходит?

Что насчет @query_no_truncate = 1?

Сообщение было отредактировано: 16 янв 21, 18:31
16 янв 21, 18:32    [22264469]     Ответить | Цитировать Сообщить модератору
 Re: Отправка xml deadlock на почту  [new]
court
Member

Откуда:
Сообщений: 2250
Dorirad.Dolabar
@body_format = 'HTML',
Картинка с другого сайта.

поменяй на TEXT
если результат будет, и, таки, очень хочется HTML, - то нужно будет немного с HTML-тегами ознакомиться, в частности plaintext :)

Сообщение было отредактировано: 16 янв 21, 20:30
16 янв 21, 20:36    [22264501]     Ответить | Цитировать Сообщить модератору
 Re: Отправка xml deadlock на почту  [new]
Dorirad.Dolabar
Member

Откуда:
Сообщений: 5
court
Dorirad.Dolabar
@body_format = 'HTML',
Картинка с другого сайта.

поменяй на TEXT
если результат будет, и, таки, очень хочется HTML, - то нужно будет немного с HTML-тегами ознакомиться, в частности plaintext :)

благодарствую, помогло, не знаю чего сам не догадался.
16 янв 21, 21:50    [22264517]     Ответить | Цитировать Сообщить модератору
 Re: Отправка xml deadlock на почту  [new]
Dorirad.Dolabar
Member

Откуда:
Сообщений: 5
Владислав Колосов
Dorirad.Dolabar,

@attach_query_result_as_file = 1 не помогает, выходит? Подсчитывали количество символов, которое приходит?

Что насчет @query_no_truncate = 1?

не пробовал, я так понимаю должно помочь, меня тут запарил косяк вида
автор
Failed to initialize sqlcmd library with error number -2147467259.


причем если в первом варианте скрипта, когда весь запрос выполнялся в @query удалось победить с помощью
set QUOTED_IDENTIFIER on

то @query = 'set QUOTED_IDENTIFIER on; print @deadlock;'
такое не прокатывает, это из за print что ли?
16 янв 21, 21:57    [22264518]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить