web-dev-qa-db-ja.com

SQL Serverデータベースで実行されている履歴クエリを確認できますか?

誰かがSQL Serverデータベースでリモートでクエリを実行していて、システムがクラッシュしました。

彼らはそのクエリのバックアップがなく、サーバーで何が実行されたかを確認したいと考えています。

このクエリをログまたは履歴のどこかに見つけることはできますか?

40
user87094

同様のGrant Fritcheyは、SSMSを閉じて、彼が取り組んでいたクエリを失ったという問題を抱えていました...これについてブログに書いています: Oh **********!

[〜#〜]編集[〜#〜]

これを回答のもう少し詳細にするために、参照された上記のリンクされたGrantは、インスタンスのキャッシュに移動して、実行した(または少なくとも試行した)クエリを取得するクエリを提供します。

SELECT  dest.text
FROM    sys.dm_exec_query_stats AS deqs
        CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) AS dest
WHERE   deqs.last_execution_time > '5/19/2011 11:00'
        AND dest.text LIKE 'WITH%';

Grantのブログのコメントに記載されていたいくつかのオプション:

44
user507

2005+、 デフォルトトレース が救助に。

デフォルトのトレースは20MBでロールオーバーしますが、SQLは5つのトレースの履歴を保持します。サーバーにアクセスすると、MSSQL\Logディレクトリから* .trcファイルを取得できます。サーバーにアクセスできない場合は、現在のデフォルトのトレースファイルの名前が次のように表示されます。

SELECT * FROM ::fn_trace_getinfo(default) 

現在のファイルがたとえばE:\ MSSQL.1\MSSQL\LOG\log_200.trcである場合、以前のファイルはlog_199.trc、log_198.trcなどである必要があります。トレースの内容を取得するには、次のようにします。

SELECT * FROM fn_trace_gettable('E:\MSSQL.1\MSSQL\LOG\log_199.trc', default)
18

可能性があるキャッシュされたクエリプランから情報を取得したり、sys.dm_exec_query_statsでBOLの情報を確認したり、同じデータベースに接続されているManagement Studioからこれを実行したりできます。

SELECT  d.plan_handle ,
        d.sql_handle ,
        e.text

FROM    sys.dm_exec_query_stats d
        CROSS APPLY sys.dm_exec_sql_text(d.plan_handle) AS e

で出力をフィルタリングする

WHERE text like '%something%'

結果を絞り込むため。

14
SqlACID

データベースが完全復旧モードであった場合、一部のデータを復旧し、トランザクションログを読み取ることによって何が行われたかについて洞察を得る可能性があります。

残念ながら、これはデフォルトではサポートされていませんが、これを行う方法があります。

ApexSQL Log または SQL Log Rescue (無料ですがSQL 2000のみ)などのサードパーティツールを使用してみてください。

別のオプションは、文書化されていない関数DBCC LOGまたはfn_dblogを使用することです。これはより複雑ですが、無料です。

9
Stanley Norman

ApexSQL には、日付で検索およびフィルタリングできる「実行済みクエリ」機能があります。

SSMSキャッシュから履歴を取得するのか、実際に履歴を追跡するのかはわかりません。あなたはそれをインストールしてみて、最高のものを期待することができます。

0
bvh9000

データベースが完全復旧モデルに設定されている場合は、トランザクションログのバックアップを調査できます。見る fn_dump_dblog詳細については。

0