powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Отправка xml deadlock на почту
7 сообщений из 7, страница 1 из 1
Отправка xml deadlock на почту
    #40036379
Dorirad.Dolabar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Пытаюсь решить проблему мониторинга deadlock, но при этом чтобы на почту отправлялся сам xml. Нашел код который выводит актуальную последнюю информацию и пытаюсь отправить вывод по почте:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
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
...
Рейтинг: 0 / 0
Отправка xml deadlock на почту
    #40036382
Dorirad.Dolabar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот такой вывод
...
Рейтинг: 0 / 0
Отправка xml deadlock на почту
    #40036419
Dorirad.Dolabar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос стал более конкретный, наколхозил тут. и вроде уже должно работать, но вместо полноценного текста опять он шлет обрывок, я не понимаю в чем прикол:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
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
...
Рейтинг: 0 / 0
Отправка xml deadlock на почту
    #40036433
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorirad.Dolabar,

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

Что насчет @query_no_truncate = 1?
...
Рейтинг: 0 / 0
Отправка xml deadlock на почту
    #40036455
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorirad.Dolabar
Код: sql
1.
@body_format = 'HTML',



поменяй на TEXT
если результат будет, и, таки, очень хочется HTML, - то нужно будет немного с HTML-тегами ознакомиться, в частности plaintext :)
...
Рейтинг: 0 / 0
Отправка xml deadlock на почту
    #40036461
Dorirad.Dolabar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court
Dorirad.Dolabar
Код: sql
1.
@body_format = 'HTML',



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

благодарствую, помогло, не знаю чего сам не догадался.
...
Рейтинг: 0 / 0
Отправка xml deadlock на почту
    #40036462
Dorirad.Dolabar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов
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 что ли?
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Отправка xml deadlock на почту
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]