とまと あんらいぷ…

エンジニアの活動記録とかつぶやきとか

GitHub

【SQL Server 2008】DBCC SHRINKFILEコマンドで重大なエラーが発生する

.NETから、SQL Serverに圧縮コマンド「DBCC SHRINKFILE(DATABASE_NAME1)」を投げる時の注意点



.NETアプリケーションから、SQL Serverにコマンドを投げてるのだけれど、
SQL Server内で、エラー番号が付与されていないエラーが発生した場合、

クライアント側
つまり.NET側や、SQL Server Management Studioのクエリウィンドウでは、次のようなエラーメッセージが渡されます。
「現在のコマンドで重大なエラーが発生しました。結果は破棄しなければなりません。」

このメッセージ、重大だとかいう割には
意外としょぼい理由だったりします。

今回はDBファイルを圧縮するDBCC SHRINKFILEコマンドのお話です。

まずはSQLのログを見る


SQL Server のインストールフォルダに「Log」っていうフォルダがあり
その中に「ERRORLOG」っていうファイルが存在するので、まずはこのログを見るだけでも
かなり情報を収集できます。

それでも、最初に書いたようにエラー番号がない場合、恐らくエラーログには表示されません。
当エントリであるDBCC SHRINKFILEコマンドがまさにそうでした。

とりあえず、SQL Server Profilerでトレースファイル作成

取り方参照
http://technet.microsoft.com/ja-jp/library/ms175520.aspx

できあがったトレースログを確認します。
重大なエラーが出るパターン

SQL:BatchStarting 54 2013-01-01 14:15:20.000 DBCC
-------- ここからDBCC SHRINKFILE コマンド実行開始
SHRINKFILE(DATABASE_NAME1);  
SQL:StmtStarting 54 2013-01-01 14:15:20.000 DBCC
SHRINKFILE(DATABASE_NAME1);
-------- データベースのデータファイル自動拡張
Data File Auto Grow 54 2013-01-01 16:34:48.383
SQL:BatchCompleted 54 2013-01-01 14:15:20.000 DBCC
-------- DBCC SHRINKFILE コマンド完了がここで終了
SHRINKFILE(DATABASE_NAME1);


重大なエラーが出ないパターン

SQL:BatchStarting 54 2013-01-01 14:15:20.000 DBCC
-------- ここからDBCC SHRINKFILE コマンド実行開始
SHRINKFILE(DATABASE_NAME1);
SQL:BatchCompleted 54 2013-01-01 14:15:20.000 DBCC


ふむ。というわけで
Data File Auto Grow コマンドが投げられているかの違いがあります。

Data File Auto Grow って?


自動拡張ですね。うん。
なんで自動拡張?

SQL ServerのDBCC SHRINKFILEコマンドは、データベース「ファイル内部」で並べ替えを行なう仕様です。

つまり、メモリにデータベースファイルをロードしないんですね。
まぁ、ギガデータとかもあるから当たり前か・・・
で、ファイルが既にとっても小さくて圧縮されてた場合、
その並べ替えのための作業用の領域が必要になることがあって、
その時にファイルにサイズが小さい時に、いちいち拡張するんですね。

結果として、圧縮してるのにでっかくなる。
という状態になり、エラー番号のないエラーが返される。

結果、クライアント側には
「現在のコマンドで重大なエラーが発生しました。結果は破棄しなければなりません。」
っていうエラーメッセージのみが返されるってことでした。

対策は?


とりあえず、Try~Catchで無視しましょう(笑)
ログにもエラーコードも出ないんだから無視するしかないです。

どうしても不安なら、「重大な~」っていうメッセージを見て
無視するとか、それ以外ならthrowするとかすればいいよ。

テーマ:プログラミング - ジャンル:コンピュータ

FC2Ad