sql server 2008 で統合ログ管理システムを構築しよう
Post on 01-Jul-2015
3.979 Views
Preview:
DESCRIPTION
TRANSCRIPT
1
SQL Server 2008 で統合ログ管理システムを構築しよう
マイクロソフト株式会社
エバンジェリスト
安納 順一http://blogs.technet.com/junichia/
22
本日のスケジュール
13:30~16:30
SQL Server 2008で統合ログ管理システムを構築しよう
16:45~17:45SQL Serverエキスパートによる特別セッション「Hyper-V による SQL Server の統合」講師: 伊藤忠テクノソリューションズ株式会社 後藤 真人 様
17:45~18:30
ライトニングトーク
18:30~
懇親会
33
本セミナーの目的と内容
目的:SQL Server は単なる「必須ソフト」ではないことを知る「なんか新しいことができそうだな」という夢を見る
内容:インフラ上のログをSQL Serverに集めて一元管理する
44
お願い
• 細かな手順を全てお話しすることができません!すみません!
• SSIS/SSRS の考え方と「難解な部分」の解説を中心に行います
• 本日作成したプロジェクトと、その手順はBLOGに掲載しますhttp://blogs.technet.com/junichia/
• より理解を深めるためにおすすめ(私もこれで勉強しました)■SQL Server 2008 自習書シリーズhttp://technet.microsoft.com/ja-jp/sqlserver/dd610200.aspx
■SQL Server バーチャルラボhttp://technet.microsoft.com/ja-jp/virtuallabs/cc879114.aspx
• 2010年1-3月の間に 本セミナーの発展系を実施予定です(w/ Developer Evangelist 小高)是非とも開発担当の方とともにお越しください
55
使用する環境
Windows Server 2008 R2 x64・Active Directory
Windows Server 2008 R2 x64・Internet Information ServiceSQL Server 2008 Enterprise Edition x64・インスタンス機能-データベースエンジンサービス-フルテキストサーチ
-Analysis Service-Reporting Service
・共有機能-Business Intelligence Development Studio-Integration Service
Windows 7 x64SQL Server Report Builder 2.0(ダウンロードセンターにて提供)
66
ログ管理システムのイメージ
SQLDB
イベントログ
SSIS
SSRS
SSAS
【取り込み】・イベントログをデータベースに蓄積・定期的に取り込みタスクを実行・サーバーが増えても柔軟に対応可能
【統計資料】・期間を指定してレポートを作成・レポートの体裁は事前に定義できる・レポートはブラウザから表示できる
77
ITPROを支える3つの機能
SSIS:SQL Server Integration Service
SSRS:SQL Server Reporting Service
SSAS:SQL Server Analysis Service
・多次元データベースによる分析(OLAP)・データマイニング
データ移入作業の可視化・外部ファイル、データベースからの取り込み・データ変換
資料作成の単純化・レポートテンプレートの作成、表示、印刷・パラメタ化による動的なレポートの生成
必要最小限のSQL文の知識と、若干のコーディング力が求められる
8
取り込みプロセスの部品化と可視化
SQLDB
イベントログ
SSIS
データが無ければはじまらない!
9
テーブル構成
ComputerName
LogFileName
ComputerList
EventLogData_<Logfile> Number(int)(key)
Category(nvarchar(50))
CategoryString(nvarchar(50))
ComputerName(nvarchar(50))
Data(nvarchar(max))
EventCode(nvarchar(50))
EventIdentifier(nvarchar(50))
InsertionStrings(nvarchar(50))
Logfile(nvarchar(50))
Message(ntext)
RecordNumber(int)
SourceName(nvarchar(max))
TimeGenerated(datetime)
TimeWritten(datetime)
Type(nvarchar(50))
User(nvarchar(50))
<logfile> には、Application, System, Security などが入る
SystemApplicatio
nSecurity
Server01 Server02
10
Eventlogを取り込む際の留意点Category
CategoryString
ComputerName
Data
EventCode
EventIdentifier
InsertionStrings
Logfile
Message
RecordNumber
SourceName
TimeGenerated
TimeWritten
Type
User
カテゴリ番号
カテゴリ名
イベントを生成したコンピュータ名
イベントの付帯情報
Uint16 形式のイベントID
Uint32 形式のイベントID
イベントの付帯情報
ログファイルの名前(System,Application,Security など)
イベントの説明文。4000文字(bstr)を超える可能性あり。シングルクオーテーションが含まれることが多い。
イベントレコードの通番 int32(max 9,223,372,036,854,775,807 )
イベントを生成したソースプロセス(MSSQL,MSInstaller など)
イベントが発生した日時。標準時で生成。
イベントが書き込まれた日時。標準時で生成。
イベントのタイプ(情報、エラー、警告、成功の監査、失敗の監査)
イベントを発生させたユーザー
2,147,483,647
11
イベントログを取得するスクリプト例
strComputer = “.”Set objService = GetObject(“winmgmts:\\“ & strComputer & “\root\cimv2”)Set objEvtSet = objService.ExecQuery _
("Select * From Win32_NTLogEvent Where Logfile='System'")
For Each e In objEvtSet
wscript.echo e.ComputerName & "," & e.EventCode
Next
12
Logfile 属性について
使用可能なLogfile属性は、以下のコマンドで調査できる
C:\> wmic nteventlog list brief
FileSize LogfileName Name 6361088 Application C:\Windows\System32\Winevt\Logs\Application.evtx 8022 69632 HardwareEvents C:\Windows\System32\Winevt\Logs\HardwareEvents.evtx 0 69632 Internet Explorer C:\Windows\System32\Winevt\Logs\Internet Explorer.evtx69632 Key Management Service C:\Windows\System32\Winevt\Logs\Key Management Service.evtx69632 Media Center C:\Windows\System32\Winevt\Logs\Media Center.evtx1052672 OAlerts C:\Windows\System32\Winevt\Logs\OAlerts.evtx 254 69632 ODiag C:\Windows\System32\Winevt\Logs\ODiag.evtx 0 69632 Operations Manager C:\Windows\System32\Winevt\Logs\Operations Manager.evtx69632 OSession C:\Windows\System32\Winevt\Logs\OSession.evtx 4 30740480 Security C:\Windows\System32\Winevt\Logs\Security.evtx 40359 8458240 System C:\Windows\System32\Winevt\Logs\System.evtx 20623 1118208 Windows PowerShell C:\Windows\System32\Winevt\Logs\Windows PowerShell.evtx
13
(参考)WINEVT\Channels 配下のイベントHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Channels 配下のイベントは Win32_NTLogEvent では取得できない。
C:\>wevtutil.exe代替策
14
取り込みプロセスをSSISでデザイン
※利用手順は自習書を!
15
作業のはじまり
使用するツール
• SQL Server Business Intelligence Development Studio• SQL Server Management Studio
はじめにやること
• SQL Server Management Studio を起動• SQL Server Business Intelligence Development Studioを起動し、
[ファイル]-[新規作成]-[プロジェクト]から「Integration Service プロジェクト」を選択
16
SSIS
制御フローを考えてみる
Computer List取り込みソースのリスト
ソース取得
開始
ソースごとに処理を繰り返し
テーブル作成
取り込み範囲のチェック
イベントログを一括取得
レコードを1件ずつ取り出し
Insert into …
EventLog Database終了
Insert 文を生成
17
制御フローを作成するには
• 部品(制御フロー項目)をデザイン画面にドラッグ&ドロップ• 各部品のパラメタを設定する• 部品同士を矢印で接続して「フロー」を決める
事前に処理の流れを決めておくことが重要
SSIS
ソース取得
開始
ソースごとに処理を繰り返し
テーブル作成
取り込み範囲のチェック
イベントログを一括取得
レコードごとに Insert 繰り返し
Insert into …
終了
18
使用する部品(制御フロー項目)
• SQL文を発行するための部品• 「接続オブジェクト」の定義が必要
• 処理を繰り返すための部品• ファイルや変数、レコードセットの読み込みに使用• 処理回数が未定の場合に使用する
• VB.NETまたはC#を使用して柔軟な処理を実装したい場合に使用• 文字列の細かな処理などに使用すると便利
• WMIを使用した処理結果を受け取る場合に使用• 今回はイベントログの取得に使用している• ちなみに、EXEコマンドを実行したい場合には
19
20
部品(制御フロー項目)のI/O
部品
各部品は、複数のI/Oから選択することができる
データベース
ファイル
変数
直接入力データベース
ファイル
変数
(例)
変数
ループの中で処理する場合に、SQL文を変えながら処理が可能
SQL文
結果のレコードセットを変数に格納し、次の処理で使用できる
変数
接続マネージャー
Input Output
21
接続マネージャー• 各部品(制御フロー項目)が外部リソースに接続する際に使用• 部品間で共有が可能
部品WMIデータリーダー
ファイル接続
WMI接続
変数
WQL
22
変数
処理フローの中で使用できる、俗にいう「変数」スコープの設定が可能(プロジェクト全体/ループ内/部品内)
Boolean/Byte/Char/DateTime/DBNull/Doube/Int16/Int32/Int64/Object/SByte/Single/String/Uint32/UInt64
選択可能な型
TIPS
• 受け取る値の型がよくわからない場合には、「Object」型を選択しておくとよい
• Expressions属性により、変数が呼び出されたときに、ダイナミックに値を挿入することができる
超便利!
23
Expressions属性• 部品(制御フロー項目)、接続マネージャー、変数などに用意されてい
る属性の1つ• Expression(式)を記載することで、指定した他の属性にダイナミック
に値を代入することができる
(例)SQL実行タスクSqlStatementSource属性にはSQL文を記載するが、処理によって接続先のテーブルを変えたい場合がある。Expressions属性を使用することで、SqlStatementSourceの値を部品が呼ばれる都度変更することができる。
24
Expressions属性の使用例
"IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[EventLogData_"+ @[User::tmpLogfileName] +"]') AND type in (N'U') ) "+ "CREATE TABLE [dbo].[EventLogData_"+ @[User::tmpLogfileName] +"] ([Number] [int] IDENTITY(1,1) NOT NULL,[Category] [nvarchar](50) NULL,[CategoryString] [nvarchar](50) NULL,[ComputerName] [nvarchar](50) NULL,[Data] [nvarchar](max) NULL,[EventCode] [nvarchar](50) NULL,[EventIdentifier] [nvarchar](50) NULL,[EventType] [nvarchar](50) NULL,[InsertionStrings] [nvarchar](50) NULL,[LogFile] [nvarchar](50) NULL,[Message] [ntext] NULL,
テーブル名に、変数@[User::tmpLogfileName] を使用することで、部品が呼ばれるたびに、異なるテーブルに対して処理を行うことができる
25
スクリプトタスク内での変数の使用
スクリプト内で変数取り扱うことで、VB.NETやC#を使用した柔軟な加工が可能
Dim strTimeGenerated As String = “19000101 00:00:00”If Not IsDBNull (Dts.Variables(“User::TimeGenerated”).Value) Then
strTimeGenerated = Dts.Variables(“User::TimeGenerated”).ValuestrTimeGenerated = Mid(strTimeGenerated , 1, 8) & “ “ & _
Mid(strTimeGenerated , 9, 2) & “ “ & _Mid(strTimeGenerated , 11, 2) & “ “ & _Mid(strTimeGenerated , 13, 2)
(例)DateTimeカラムに保存する前にDateTime形式に変換
26
27
処理1:ソース(コンピュータ一覧)の取得
イベントログの取り込み元を取得する
dbo.ComputerList
接続マネージャ
SQL
タスク
Select ComputerName,LogfileNameFrom dbo.ComputerList
User::ComputerList
SQLStatement
28
処理2:ソースごとに処理を繰り返し
Foreach
ループ
User::ComputerList
User::tmpComputerName
User::tmpLogfileName
テーブル作成
取り込み範囲のチェック
イベントログを一括取得
レコードを1件ずつ取り出し
Insert into …
Foreach
ループ
ADO列挙子(データセット)
Insert 文を生成
29
処理3:テーブルを作成<LogfileName>イベントログを格納するテーブルが無い場合には作成する
User::tmpComputerName
User::tmpLogfileName
SQL
文タスク
接続マネージャ
dbo.Eventlog_<LogfileName>
"IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[EventLogData_"+ @[User::tmpLogfileName] +"]') AND type in (N'U') ) "+
"CREATE TABLE [dbo].[EventLogData_"+ @[User::tmpLogfileName] +"] ([Number] [int] IDENTITY(1,1) NOT NULL,[Category] [nvarchar](50) NULL,[CategoryString] [nvarchar](50) NULL,[ComputerName] [nvarchar](50) NULL,[Data] [nvarchar](max) NULL, [EventCode] [nvarchar](50) ・・[User] [nvarchar](50) NULL,CONSTRAINT [PK_EventLogData_"+ @[User::tmpLogfileName] +"]PRIMARY KEY CLUSTERED ( [Number] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]"
Expressions(SQLStatement)
完全なSQL文はAppendixに掲載
30
処理4:取り込み範囲のチェック
SQL
タスク
Select MAX(RecordNumber) as MaxRecordNumberfrom [EventLog].[dbo].[EventLogData” + @[User::tmpLogfileName] + “] Where [ComputerName] Like ‘“ + @[User::tmpComputerName]” + “’%”
Expressions(SQLStatement)
接続マネージャ
dbo.Eventlog_<LogfileName>
User::tmpComputerName
User::tmpLogfileName
変数はスコープ内であればどこででも使える
テーブルには複数のコンピュータのイベントログが格納されていることに
注意
User::MaxRecordNumber
31
処理4:イベントログを一括取得
WMI
データリーダー
WQLQuerySource
接続マネージャ(WMI)
User::tmpComputerName
User::tmpLogfileName
User::WQL
“Select * from Win32_NTLogEvent where logfile=“ + @[User::tmpLogfileName] + “’ and RecordNumber > “ + (DT_WSTR 10) @(User::MaxRecordNumber)
Expression(Value)
User::MaxRecordNumber
Expression(ConnectionString)
User::ConnectionString
“ServerName=\\\\”+@[User::tmpComputerName]+”;Namespace=\\root\\cimv2;UserNtAuth;UserName=;”
Expression(Value)
User::EventData
属性値に変数を使用できる
Expressionsの中では「\」は
制御記号
キャストが可能
32
処理5:レコードを1件ずつ取り出し
Foreach
ループ
User::EventData
Insert into を実行
Insert 文を生成
User::Category
User::CategoryString
User::ComputerName
User::Type
User::User
取り出した値が見えずらい場合には
Object形式にしておくと便利
33
処理6:Insert 文を生成SQL文を生成するにあたり、各値をSQL Serverに取り込み可能な形式に整形する
User::Category
User::User
Script
タスク
Dim strCategory As String = ""If Not IsDBNull(Dts.Variables("User::Category").Value) Then
strCategory = Dts.Variables("User::Category").Value.ToStringEnd If
Dim strMessage As String = ""If Not IsDBNull(Dts.Variables("User::Message").Value) Then
strMessage = Dts.Variables("User::Message").Value.ToStringstrMessage = Replace(strMessage, "'", "-")
End If
変数の値がNullかどうかをチェックしてから
取り出す
Messageにはシングルクオーテーションが含まれているので置き換え
34
Script
タスク
Dim strTimeGenerated As String = "19000101 00:00:00"If Not IsDBNull(Dts.Variables("User::TimeGenerated").Value) Then
strTimeGenerated = Dts.Variables("User::TimeGenerated").Value.ToStringstrTimeGenerated = Mid(strTimeGenerated, 1, 8) & " " & _
Mid(strTimeGenerated, 9, 2) & ":" & _Mid(strTimeGenerated, 11, 2) & ":" & _Mid(strTimeGenerated, 13, 2)
End If
Dim strSQL As String = "INSERT INTO [EventLog].[dbo].[EventLogData_" & strLogfile & "] ([Category]" & _
",[CategoryString]" & _",[ComputerName]" & _
" VALUES('" & strCategory & "'," & _"'" & strCategoryString & "'," & _"'" & strComputerName & "'," & _
Dts.Variables("User::InsertSQL").Value = strSQL
DateTime列に取り込めるように整形
SQL文を生成
User::InsertSQL
35
処理7:Insert Into を実行User::InsertSQL
SQL
タスク
')
SQLStatement
接続マネージャ
dbo.Eventlog_<LogfileName>
User::InsertSQL
INSERT INTO [EventLog].[dbo].[EventLogData_Application] ([Category],[CategoryString],[ComputerName],[Data],[EventCode],[EventIdentifier],[EventType],[InsertionStrings],[LogFile],[Message],[RecordNumber],[SourceName],[TimeGenerated],[TimeWritten],[Type],[User]) VALUES('0','','TF-SQL01-01.t6303.contoso.co.jp','','12290','1073819650','3','System.String[]','Application','Package"Package" has been cancelled.',3205,'SQLISPackage100','20090923 03:23:31','20090923 03:23:31','情報','T6303\administrator')
Value
36
最後に:処理の自動化プロセスを実装し終えたら・[ビルド]する
- binフォルダに .dtsx ファイルが作成される・SQL Server Agent ジョブとして登録
- SQL Server Agent サービスを起動しておく(自動起動にする)- .dtsxファイル(パッケージファイル)を登録
37
報告書のテンプレート化
資料は時間をかけずに作りたい!
SQLDB
SSIS
SSRS
38
Eventlogを分析するには
System Application Securityパフォーマンス
ログ
日時
・・・・・・・・
• それぞれのデータの関連性を機械的に見出すのは難しい• 日時をキーに、それぞれのデータを比較、分析するのがおすすめ
本件は、次回のセミナーにて…
39
作業のはじまり
使用するツール
• Microsoft SQL Server Report Builder 2.0
はじめにやること
• Microsoft SQL Server Report Builder 2.0 を起動する• SSRSに接続
http://ServerName/Repor_Server/
40
作りたいレポート
□全て□エラー□警告□情報
タイプ V YYYYMMDD
YYYYMMDD
開始年月日
終了年月日
コンピュータ名 コンピュータ名
エラー警告
情報
CmputerName SourceName エラー 警告 情報
Computer01
Windows-Search
Security-SPP
Application Error
051
0241
10550
41
グラフフィールドの設定
グラフフィールド
比較したい数字
横軸の指標
横軸が持つ要素
ComputerName
Count(type)
Type
凡例
42
マトリックスの設定
[Type]
[ComputerName] [SourceName] [Count(Type)]
行グループ
コンピュータごとに複数のソース名が表示される
比較したい値
行ごとに比較したい指標
43
パラメータの設定
• データセットのクエリ設定で、以下のようにWhere句を追記する
Where EventLogData_Application.Type IN (@p1) ANDEventLogData_Application.TimeGenerated >= (@p2)EventLogData_Application.TimeGenerated <= (@p3)
• 各パラメータをレポートフィールド上にドラッグドロップする
44
デザインが終わったら• サーバーに保存• 以下のURLでアクセス
http://<ServerName>/Reports/またはhttp://<ServerName>/Report_Server/
注意• 一度サーバーに保存するとReport Builderでのプレビューが行えなくなります※再度 ローカルに保存しなおしてからReport Builderを再起動することで
プレビューができるようになります
45
46
• BI は我々の手の届くところにあります
• SQL Server はもはやツールの一部です
• SSIS/SSRS/SSAS も価格の一部です
• インフラ担当SEのみなさんが体感してください!
47
進呈
本日のセミナーを みなさんの会社で実施してみませんか?
SQL Server 2008 勉強会キット・SQL Server 2008 各種自習書・本日のセミナー資料・本日のデモンストレーションで使用したプロジェクト・デモ環境の構築手順書
TechNet Plus Direct Subscription
詳細は近日公開!
講師はあなたです!
48
「オラクル都市伝説」を読み解くシリーズ(動画)
YouTube上で近日公開!
SQL Server プロダクトマネージャー 北川が、オラクル社の人気コラム「都市伝説シリーズ シーズン2」を正しく読み解きます。
詳しくは、9月30日発行の TechNet Flash をご覧ください!
北川のBLOGもご覧ください http://blogs.technet.com/sqlpm-j/
49
50
SQL文タスク「テーブルが無ければ作成する」で使われているSQL文
"IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[EventLogData_"+ @[User::tmpLogfileName] +"]') AND type in (N'U') ) "+ "CREATE TABLE [dbo].[EventLogData_"+ @[User::tmpLogfileName] +"] ([Number] [int] IDENTITY(1,1) NOT NULL,[Category] [nvarchar](50) NULL,[CategoryString] [nvarchar](50) NULL,[ComputerName] [nvarchar](50) NULL,[Data] [nvarchar](max) NULL,[EventCode] [nvarchar](50) NULL,[EventIdentifier] [nvarchar](50) NULL,[EventType] [nvarchar](50) NULL,[InsertionStrings] [nvarchar](50) NULL,[LogFile] [nvarchar](50) NULL,[Message] [ntext] NULL,[RecordNumber] [int] NULL,[SourceName] [nvarchar](max) NULL,[TimeGenerated] [datetime] NULL,[TimeWritten] [datetime] NULL,[Type] [nvarchar](50) NULL,[User] [nvarchar](50) NULL,CONSTRAINT [PK_EventLogData_"+ @[User::tmpLogfileName] +"] PRIMARY KEY CLUSTERED ( [Number] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]"
51
top related