xp_readerrorlog

by Alexey Knyazev 18. апреля 2013 23:12
Сегодня я расскажу про недокументированные расширенные хранимые процедуры (Extended Stored Procedures) для работы с журналом ошибок SQL Server и SQL Server Agent.
На самом деле при просмотре журнала SQL Server Logs через SSMS (SQL Server Management Studio) идёт обращение именно к этим двум основным процедурам (xp_readerrorlog и xp_enumerrorlogs), хоть и не на прямую, а через системные интерфейсные процедуры.
Особое внимание я уделю описанию входных параметрам этих недокументированных процедур.

И так, что же происходит, когда мы просматриваем журнал ошибок через SSMS?



Во первых мы определяем путь к нашей папке с журналами
select ServerProperty('ErrorLogFileName')



Затем выводим информацию о текущем журнале и о шести предыдущих
exec master.dbo.sp_enumerrorlogs



в качестве входного параметра можно указать
  • 1 - Список журналов SQL Server (значение по умолчанию)
  • 2 - Список журналов SQL Server Agent

Если обратиться к тексту этой процедуры, то можно увидеть, что это не более, чем "обёртка" для вызова другой процедуры
create proc sys.sp_enumerrorlogs(
	@p1		int = 1)
as
begin

	IF (not is_srvrolemember(N'securityadmin') = 1)
	begin
	   raiserror(15003,-1,-1, N'securityadmin')
	   return (1)
	end
	exec sys.xp_enumerrorlogs @p1
end
По коду процедуры видно, прежде чем обратиться к расширенной хранимой процедуре xp_enumerrorlogs, идёт проверка, что пользователь входит в серверную роль securityadmin.

Теперь если мы нажмём View SQL Server Log



то мы сможем просмотреть все события выбранного журнала:



В этот момент идёт обращение к ещё одной процедуре-обёртке master..sp_readerrorlog.
Ниже текст этой процедуры:
create proc sys.sp_readerrorlog(
	@p1		int = 0,
	@p2		int = NULL,
	@p3		nvarchar(4000) = NULL,
	@p4		nvarchar(4000) = NULL)
as
begin

	if (not is_srvrolemember(N'securityadmin') = 1)
	begin
	   raiserror(15003,-1,-1, N'securityadmin')
	   return (1)
	end
	
	if (@p2 is NULL)
		exec sys.xp_readerrorlog @p1
	else
		exec sys.xp_readerrorlog @p1,@p2,@p3,@p4
end
Как вы видите у неё четыре входных параметра:
  • @p1 - номер журнала (0-6); 0 - текущий
  • @p2 - чей журнал; 1 - SQL Server, 2 - SQL Server Agent
  • @p3 - фильтр для поиска
  • @p4 - второе условие для поиска
Пример:
exec master.dbo.sp_readerrorlog 0, 1, N'error'


exec master.dbo.sp_readerrorlog 0, 1, N'error', N'34050'


Но это ещё не всё. Если обратиться к самой расширенной процедуре xp_readerrorlog, то у неё есть ещё несколько параметров:
  • @p5 - условие с какой даты выводить результат
  • @p6 - условие до какой даты выводить результат из журнала
  • @p7 - тип сортировки (asc/desc)
  • @p8 - экземпляр SQL Server (@InstanceName), параметр появился в SQL Server 2012
Пример:
exec master.dbo.xp_readerrorlog 0, 1, null, null, '20130418', '20130419'
exec master.dbo.xp_readerrorlog 0, 1, null, null, '20130418', '20130419', N'desc'


Если необходимо работать с журналом пользователю с минимальными привилегиями, то достаточно дать явные права на эти расширенные процедуры, но обращаться к ним придётся через запросы, т.к. SSMS использует интерфейсные процедуры, которые проверяют входимость пользователя в группу securityadmin.
use master
go
grant execute on xp_readerrorlog to [Ваш юзер]
go
Ещё, как вариант, я могу предложить воспользоваться ещё одной самописной утилитой для работы с журналом, о которой я писал раньше - http://t-sql.ru/post/LogsViewer.aspx

Добавить комментарий

  Country flag

biuquote
  • Комментарий
  • Предпросмотр
Loading