Server – SQLServer 2008 , 2012 アクセス違反エラーで停止

SQL Server 2008R2 Expressをインストール
導入したばかりのWindows Server 2012 R2にSQL Server 2008R2 Expressをインストールした。インストール後の設定で、ファイアウォールとインスタンス名のトラブルがあったが、この件は別の記事に載せてある。
SQLServerは2000あたりから経験があるので、インスタンス名以外は特に問題もなく、ユーザー等の設定してから、SQLServer2005で使用していたデータベースファイルをアタッチして始動した。関連するWEBアプリも稼働させる。

SQL Serverが停止
翌日アプリの様子を見ると、エラーが表示されたり、未処理になっていたりしていて、何かおかしい。SQLServerを見てみると、停止状態になっている。初期設定が違っていたのだろうと思い、自動、開始で再スタートさせる。
これで問題ないだろうと考えた。それから数時間後、午後になってふとアプリの表示を見ると、またエラーが表示されている。そして、SQLServerは、また停止している。これはおかしいと思い、初めてWindowsログを見てみる。

0×00000005 アクセス違反
そこには、停止した時間に「0x00000005 アクセス違反…」の内容のエラーが出ていた。
その前の停止を見るとやはり同じエラーが出ており、他に「デバイス…21」「リムーバブル…」というのもあった。予想されるのは、やはりアタッチしたデータベースファイルが壊れているのではないか?ということだ。一度データを削除して、圧縮し、同じデータを追加して、ファイルサイズを5分の1位まで圧縮してみる(圧縮方法は別記事に記載)。数100メガのファイルを数個圧縮する。
もう一つ考えられるのは、SQLServerの最大メモリだ。これをデフォルトの無制限から512MBに絞ってみる。そしてスタートする。
しかし、これも数時間で停止してしまう。ファイルは作り直したので、メモリをさらに256MBまで下げてみる。これは、1時間ほどでダウンする。その後は、「0x00000005 アクセス違反…」「デバイス…21」等のキーワードでネットを検索してみるが、ほとんどというか、全く情報がない。

SQL Server 2012をインストール
万策がつきて、SQL Server 2012をインストールすることにする。Windows Server 2012だから、SQL Serverも2012の方が相性がいいかもしれないという、単なる希望からだ。しかしこれもアクセス違反エラーで、あえなくシステムダウン。
いよいよ追い詰められ、Windowsの更新情報に2012 SP2へのアップグレードプログラムがあるのを見つけ、SQL Server 2012 SP2をダウンロード、インストールすることにする。これが最後の手段と思ったのだが、やはりシステムダウン、しかも数分後だった。

トラブルで2週間
ここまで、最初のインストールから約2週間、ここまで長いトラブルのは初めての経験だった。最近はネットの情報で、かなりのトラブルもなんとか解決できていたのだが、今回は全くこれに関するエラー情報がないのだ。検索のキーワードも色々試した結果で、むしろこの「情報の無さ」の方が、不思議なことだといえる。もしかしたら、SQL Serverは有償サポート優先で、エラーは非公開なのかもしれないとも考えられる。
この辺から、このサーバーに関しては、(外れということで)SQL Serverをあきらめ、MSアクセスに変更も考え始めた。同時にもう少し試みをやってみることにする。「アクセス違反」以外は2、3回しか出ていないエラーだが、「デバイス…」に注目して、それまで外付けドライブに置いてあったデータベースファイルを、Cドライブに移動してみる。しかしこれも見事に失敗。

インストール先を変更する
いよいよアクセスへのグレードダウンを考えざるをえず、実際、数本のテーブルをSQLServerから移転することにした。同時に「デバイス…」の考えられる最後の手段として、SQL ServerをCドライブにインストールし直すことにする。
これまで、SQL Serverを外付けドライブ(USB、D:)にインストールしていた。これは、SQL Serverのデフォルトのデータベースファイル(master等)がインストールフォルダにあるため、セキュリティの関係で、権限の設定等が面倒な感じがしたからである。現にApacheなどは、インストール先にProgramFilesは避けるように勧めている。.htaccessなどのファイルをWEBユーザーが参照するため、その権限設定が面倒だからだ。Cドライブのルートに別のフォルダを作成して、そこにインストールするのがよいと勧めている。

ついに解決
SQL ServerをデフォルトのProgramFilesにインストールしてから、各種設定はそれまでと同じようにして、SQL Serverを再始動する。1時間位経っても大丈夫だった。メモリをEXpressの最大である1024MBに設定して、データベースファイルを念のため、余裕をプラスしたサイズに設定し直す。
そしてあくる日、無事に丸一日経過したことを確認した時、これで解決したという自信を覚えた。長年の経験がOKを出しているのだ。
そして現在、4日間停止なしで稼働している。これで、このエラーは解決したことは間違いないと確信した。今後もしエラー停止したとしても、それは別の問題だといえる。

原因はUSBディスク
後日分かったことだが、原因はDドライブのアクセス権が外れてしまうことだったようだ。想像だが、SQL Serverがキャッシュか何かをDドライブに書き込もうとした時にエラーを起こしたと思われる。現在インストール先を変えるつもりはないが。IISが更新できないを参照。

SQLServerは必ず「C:ProgramFiles」にインストールする
SQLServerユーザーには当たり前のことに聞こえるかもしれないが、これが今回のエラー、トラブルの原因と解決方法である。今回インストールをおこなったのは、オラクルの経験者だがSQLServerは初めてという者だった。SQLServerユーザー以外にとっては、「C:ProgramFilesにインストールする」というのは、必ずしも常識ではない。むしろ避けた方がいいという考えも強い。理由は上にも書いたが「C:ProgramFiles」はセキュリティの制限が強く、普通のアプリには都合がいいが、Webアプリが動かなくなる可能性が高いからである。

Windows Serverソフトは別扱いする
結論としては、SQLServerはWindowsの代表的なサーバーであり、Windowsシステムへの依存度が高いので、やはりC:ProgramFilesにインストールしなければいけないということである。どうも、SQLServerや.netは、ProgramFiles内の自分フォルダやモジュールに特別なユーザー権限を与えているようだ。、その特別なユーザーはIISのユーザーでもあり、SQLServerのユーザーでもあるのだろう。C:ProgramFilesにはそれが設定されているか、設定が可能になっているようだ。そうでなければ、今回のエラーやその回復は説明がつかない。つまり、Windows関連のシステムは基本、デフォルトのままでインストールするのが無難だというのが今回の教訓だ。

Comments are closed.