gtag

2010年9月28日 星期二

簡化管理:寄送(sp_send_dbmail)SQL SERVER的Error Log(xp_readerrorlog)至信箱

如果您像我的工作一樣,管理十幾個資料庫(ORACLE與MS-SQL),簡化管理工作是一定要花時間想清楚的。若您是系統維運人員,必須以主動取代被動,不看LOG的話呢?您就變成被動,常常被突然出現的系統問題打敗,而事實上這種事是可以預防的。

資料庫管理最基本的就是每天看系統的LOG,跟任何系統維運一樣,看LOG可以讓您瞭解大約5成有關系統的狀況,如果身為系統維運人員懶惰到連基本的LOG都不看,千萬別怪系統有一天反撲。看LOG這件事絕對不能省,但是如果每天都要登入十幾台機器的資料庫裡一個一個看LOG內容,那可是件很累人的事!

這裡介紹一小段程式(適用於2005/2008,SQL2000的版本無法使用),可以讓你直接使用T-SQL讀取SQL資料庫的系統記錄檔,然後寄出記錄檔內容至您指定的信箱。到這裡應該還會想到要把其他系統資訊一併寄出,例如備份資訊、磁碟空間,資料庫檔案使用大小,系統運作時間(這可以用來判斷資料庫是否已經重新啟動過)等等資訊,都是可以用來簡化管理工作的方法與資訊。

範例程式主要功能是截取四天前至程式執行時的系統記錄檔內容,利用Database Mail寄出HTML格式的表格內容,您也可以做成Procedure加入Agent的JOB每天定時寄送。

  DECLARE @tableHTML  NVARCHAR(MAX) ;
  DECLARE @S varchar(50);
  CREATE TABLE #ErrLog (LogDate datetime, ProcessInfo varchar(12), [Text] varchar(1000));
  INSERT INTO #ErrLog EXEC sys.xp_readerrorlog 0;
  INSERT INTO #ErrLog EXEC sys.xp_readerrorlog 1;
  INSERT INTO #ErrLog EXEC sys.xp_readerrorlog 2;
  SET @HTML =
      N'<H2>'+ @@servername +' ErrorLog</H2>' +
      N'<table border="1" cellpadding="0" cellspacing="0" style="font-size:11pt;">' +
      N'<tr><th width="20">Log Date</th><th>Process Info</th><th>Message Text</th></tr>' +
      CAST ( ( SELECT td = CONVERT(VarChar(30), logdate, 120),       '',
                      td = processInfo, '',
                      td = text, ''
               from #ErrLog where logdate > getdate()-4 order by logdate desc
               FOR XML PATH('tr'), TYPE
      ) AS NVARCHAR(MAX) ) +
      N'</table>' ;
  SELECT @S = (SELECT CONVERT(VarChar(12), GETDATE(), 102) + ' - ' + @@servername + ' Daily Report');
  EXEC msdb.dbo.sp_send_dbmail
  @profile_name = 'YourProfileName',
  @recipients = 'YourEmail@here.box',
  @body = @HTML,
  @body_format = 'HTML',
  @subject = @S;

執行後,可以收到類似下圖的內容,您也可以在HTML變數中加作CSS控制,美化您的報表內容。這裡使用的是FOR XML PATH的方法產生HTML的格式,若是是用RAW ELEMENTS的方式,則連表頭(th)的部份都需要使用FOR XML RAW的方式查詢產生HTML TABLE的文字內容。

沒有留言:

張貼留言