ラベル SQLSERVER の投稿を表示しています。 すべての投稿を表示
ラベル SQLSERVER の投稿を表示しています。 すべての投稿を表示

2009年3月17日火曜日

「DBCC LOG」で SQLServer のトランザクションログを見る

SQLServer のアンドキュメンテッドコマンド、「DBCC LOG」を試す。
 

何のツールかと言うと、トランザクションログを閲覧することが出来るというものらしい。
トランザクションログを取っており、かつ切り捨ててなければ、更新状況が順を追ってわかるということになる。
 

使いこなすと便利そうだ。
とりあえず手元にあったSQLServer2000で実験、接続には2005のマネジメントスタジオを利用。
 
 

とりあえず簡単に解析できるよう、単純なサンプルを用意しよう。


  1. DB [sawatest01]作成

  2. テーブル[Table_1]作成、カラムはnchar(10)の[test]1つ

  3. [Table_1]に 'ABABAB' と文字列挿入(INSERT)


 

ではトランザクションがコミットされたところで、ログを出してみよう。

DBCC LOG (sawatest01,4)
4 の部分は出力の詳細度を示す、"-1から4" まであって、レコードの中身は4でしか出てこない。
 
サンプルの INSERT に関する出力はこんな感じ。
 

Current LSN,Operation,Context,Transaction ID,Tag Bits,Log Record Length,Previous LSN,Flag Bits,Data Offset,Record Data,Description
0000001d:00000046:0001,LOP_BEGIN_XACT,LCX_NULL,0000:00000951,0x0000,60,00000000:00000000:0000,0x0200,0,0x00003C000000000000000000000080005109000000000200010000003A000000010000000100BA421498C900CF9B00000100060044004D004C001800,DML
0000001d:00000046:0002,LOP_INSERT_ROWS,LCX_HEAP,0000:00000951,0x0000,84,0000001d:00000046:0001,0x1200,0,0x000054001D000000460000000100020151090000000012000F000000010002001F83D7751D00000045000000020000000000000001001B0010001800410042004100420041004200200020002000200001000000,
0000001d:00000046:0003,LOP_DELTA_SYSIND,LCX_CLUSTERED,0000:00000951,0x0000,80,0000001d:00000046:0002,0x0200,0,0x000050001D000000460000000200090251090000000002001800000001001F00020000001D00000045000000030000000000000000000000000000001F83D77501000000000000000100000000000000,
0000001d:00000046:0004,LOP_COMMIT_XACT,LCX_NULL,0000:00000951,0x0000,52,0000001d:00000046:0001,0x0200,0,0x000034001D000000460000000100810051090000000002001498C900CF9B00001D0000004600000001000000000000000000BA42,



なんのこっちゃ。。。
要は"Record Data" の部分が更新されたデータに当たり、それを解析すればいいみたいだが。
 

かろうじて "LOP_INSERT_ROWS" の行で "0041 0042 0041 0042 0041 0042" という文字列があるのが分かった。
ASCIIコードで 「0x41=A, 0x42=B」 なので、メソッド、更新されたデータともに確かに記述されているようだ。
 
 

さて、いくらトランザクションログから拾えるからといって、これを解析しろといわれるのはちょっと遠慮したいな。いっそ知らなかったことにしようか...
 
 
 

...と思ったところ、どうやら 株式会社ヴィバークさんの sarasa というツール が、DBCCの解析結果をきっちり見せてくれる模様。
 

180秒間使える体験版が あったので使ってみた、だいぶ快適にログを解析してくれるのでナイス。
FAQを見るに自前で解析、完全に独自使用という泣かせるつくりになっている。
 

解析が必要になるケースがあったら買ってもらおう。
 

2008年11月20日木曜日

VBScriptからSQLSERVERに接続する(ADO)

WindowsServer の運用管理で、ちょっと SQLServer から情報もってきたい時に VBScript(やWSH) でDBに接続できたら都合がいい。
 
 

ADO(ActiveX Data Object) とかいうやつを使ってちょっとクエリを流そうという時のメモ。
 
 

サンプル:SQLServer上に設定されている、サーバのホスト名を取ってくる


大体が [Master] の [sysservers] に1行あるレコードがローカルサーバ情報。サンプルでは一応複数あった場合の処理をさせてる。
 

下記を拡張子VBSで保存して実行する。
[sourcecode language='vb']
Private cn ,rs

Set cn = CreateObject("ADODB.Connection")
Set rs = CreateObject("ADODB.Recordset")

'// ADODBでSQLOLEDBに接続、この場合ユーザはログイン中のものを使う
cn.Open "Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=msdb;Integrated Security=SSPI;"
'// SQLのクエリを書いてレコードセットを取得する
rs.Open "SELECT [SrvName] FROM [Master].[dbo].[sysservers] WHERE [srvid] = '1'", cn


'// レコードセットを1行づつ処理する
Do While Not rs.EOF
Wscript.echo rs("SrvName")
rs.MoveNext
Loop
'// レコードが一行ならこれでもOK
'// Wscript.echo rs("SrvName")

rs.Close
cn.Close

Set cn = Nothing : Set rs = Nothing

Wscript.Quit
[/sourcecode]
 

sysdatabaseからデータベースの一覧とかを持ってくるのも簡単。
SELECT以外の文は結果がどうなるのかは試してないけど、多分単純に結果コードが帰って来るんだと思う。
 

まぁ更新系を使う場合はVBScriptとかじゃないよね、と思う。

2008年7月28日月曜日

SQLServer、T-SQLでYYYYMMDD

YYYYMMDD(hhmm)。シリーズ。
ログファイルを出力するなら「これ+プリフィックス」をファイル名にするのが理想ではないでしょうか。
のTransact SQL(T-SQL)編。
 
T-SQLでなぜ?という気もするでしょうが、実際使ったことがあるのでメモ投稿。
私はログ用のテーブルを自動でローテーションするジョブを作るときに使いました、YYYYMMDDのテーブル名をつけて過去ログを放り込む。
なお、これを使用しているのはSQLServer2000なので、SQLServer2005以降では試してません。
 
 
ではサンプルコード。


[sourcecode language='sql']
DECLARE @strDate varchar(128)

SET @strDate =
REPLACE(
CONVERT(varchar(10),getdate(),120)
, '-', '') +
REPLACE(
CONVERT(varchar(5),getdate(),108)
, ':', '')

PRINT @strDate
[/sourcecode]

 
クエリアナライザなどで実行すると、結果は下記。
200807271124

 
 
以降解説