MSSQLのAUTOGROWTH 2011年12月22日

cai dat SQL Server 2000 - step 2

2011-12-14 20:38:44.55 spid91 Autogrow of file ‘XXXX_Data’ in database ‘XXXX’ cancelled or timed out after 30578 ms. Use ALTER DATABASE to set a smaller FILEGROWTH or to set a new size.

ちょっと仕事での話。

先週はMSのSQL Serverでこのエラーに悩まされた。お客さんからアプリケーションの特定の機能でDB接続のタイムアウトエラーが出ると連絡があって、DBサーバのイベントログとSQLのエラーログファイルを確認したところこのエラーがバコバコ吐き出されてた。あ、ちなみにMSSQL2000(v.8)です。

そしてこの解決法に関して日本語で説明しているサイトがほとんどなかったから一応ここに書いておく事にします。もしかしたらちゃんとしたDB使いの人には常識なんかもしれないけども。。

まず、AUTOGROWTHというのが何かというと、データベースやトランザクションログのデータが格納されている実ファイルがありますが、それの容量一杯まで実際にデータが書き込まれてもう書き込む場所がありません、というような状態にまでなったとき、このAUTOGROWTHという機能でMSSQLは自動的にデータベースファイルのサイズを拡張します。これは、Enterprise Managerの左のメニューの”Microsoft SQL Servers” – “SQL Server Group” – – Databases – <使用しているDB名>まで辿り、そのDB名のところで右クリック、プロパティを選択。このプロパティのData Files、Transaction Logのそれぞれのタブで設定できるようになっている。

標準ではAutomatically grow fileにチェックが入り、File growthはBy percentで10%になっているはず。Maximum file sizeはUnrestricted file growth。このMaximum〜はデータベースファイルがサイズ拡張する上限を決める値で、HDDの空き容量が少ない際にDBで使用されるディスク容量を明確に指定したい場合はRestrictで具体的にサイズ指定すればよい模様。

んでもって、最初のうち、エラーメッセージの意味がいまいちわからず、海外のサイトなどでは、このFile growthの設定がパーセント指定だとうまく動作しないときがあるとか、会社の人に聞いたら、標準の10%ではうまく動かないときがあるので15%とか20%とかにしてあげる必要があるなどの話が出てきた。それで%を15%に上げたり、%から何MBのサイズ固定の拡張に切り替えてみたりしてみた。ややこしいのは切り替えた最初のうちはエラーが消えること。それでも30分ぐらいするとまたエラーがぼつぼつ出始めてアプリ側でもタイムアウトが発生してた模様。

結局、うちの会社のタイ人のDB使いに助けを求めたところ、このエラーメッセージの意味を教えてくれた。ちょっと補足しながら書くと「DBのサイズの拡張の際には、DBシステムがDBファイルをロックします。この際に拡張サイズが大きいとサイズ拡張の処理が終わるまで時間がかかり、その間にアプリなどから飛んでくるクエリには応答できません。それでアプリ側にはタイムアウトなどのエラーが表示される、さらにこのエラーメッセージはAutogrowth自体がタイムアウトか失敗をしている。なので拡張サイズを小さく設定してくださいという意味」とのことらしい。最初のうち、DBのサイズ3GBの10%を固定にして300MBで設定してどうか?などとやってみてたが、そもそもそれでは意味がなかったということらしい。で、そのDB使いとともに適切な拡張サイズを考えたところ、3GBのデータベースファイルに対して50MBの固定拡張サイズとした。これで今んところ問題は出てない模様。これを設定したところ、すぐに最初に書いたエラーログの出力が止まり、アプリの問題も解決。

ということで上記のエラーが出た場合の対処法は以上のような感じらしいです。また、ここの記載で僕の認識間違いがあればぜひコメント欄でご指摘願います。