SQL Server(SQL Server 2014 Express)と通信する独自の設計のプログラムがかなりあります。時々彼らはあちこちで爆破を始めます。 SQL Server Management Studioを開いてデータベースが実行されていないことを確認するためだけに、何が問題なのかを理解しようとしました。
具体的には、SSMSを開き、[データベース]ノードを展開すると、次のように表示されます。
[データベース名](リカバリ保留中)
SQL Server構成マネージャーを開き、停止しているデータベースのサービスを再起動すると問題が解決し、しばらくするとすべてが再び機能し始めます。
この問題に何度か遭遇した後、毎回ではなくてもサーバーを再起動した後にのみ発生することに気づきました。つまり、サーバーの起動時にSQLが同じことを実行できないことがあります。興味深い事実は、SQLサーバー上で実行されている複数のデータベースがあり、それらが一緒にダウンしないことです。データベースの1つは「(回復保留中)」と表示し、もう1つのデータベースは正常に機能します。
この問題の解決策、または原因を見つけることができませんでした。何か案は?
編集:
サーバーのイベントログを確認した後、次のことがわかりました。
ログ名:アプリケーションソース:MSSQL $ SQLEXPRESSイベントID:17204タスクのカテゴリ:サーバーレベル:エラーキーワード:クラシック説明:FCB :: Openが失敗しました:ファイルC:\ Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQLを開けませんでしたファイル番号1の\ DATA \DuraDB.mdf。OSエラー:32(別のプロセスで使用されているため、プロセスはファイルにアクセスできません。).
特に再起動後、ファイルがロックされる原因は何ですか?
オンアクセスアンチウイルススキャナーを実行していますか?除外設定が正しく設定されていることを確認してください。 Microsoftはこれを KB309422 で文書化しています。 McAfeeおよびSophos による一部の製品には既知の問題があることにも注意してください。
リカバリは、通常、データベースが完全にシャットダウンされていないときに、起動時にSQL Serverによって実行されます。 SQLサーバーがクラッシュしたか、サーバーで停電が発生したため。そうでない場合は、ファイルシステムの問題、ディスクの問題、またはストレージコントローラーのドライバーの問題が原因である可能性があります。予期しないシャットダウンやディスクの問題がないか、システムログを確認する必要があります。
また、Windowsシステムが最新のアップデートで最新になっており、SQL Serverが最新のサービスパック(SQL Server 2014のSP1)にアップデートされていることを確認してください。
The Express versions automatically shutdown after a period of inactivity.
There is a special sp_configure value you can set to increase the timeout.
Express Editions only have the 'user instance timeout' config item available.
The default is 60 minutes.
exec sp_configure 'show advanced options', 1
reconfigure
go
exec sp_configure 'user instance timeout' -- show current value
go
/*
exec sp_configure 'user instance timeout', 65535 -- set to max timeout
reconfigure
go
*/
または、アプリケーションで単純な「ハートビート」クエリを10分ごとに実行して、SQL Server Expressを存続させることもできます。 SQL Server ExpressではSQLエージェントを使用できないため、スケジュールされたジョブは機能しません。 Windowsタスクスケジューラを使用してsqlcmd.exeジョブをスケジュールすることもできます。
SQL構成マネージャー> SQLサーバーサービス>サービスの種類(SQLサーバー)を選択し、右クリックしてプロパティに移動します。ログオンとして選択このアカウントにログオンを選択し、アカウント名が "NT SERVICE\MSSQL $ SQLEXPRESS"であることを確認してから、開始を押します。
内部的にSQL Serverは、保留中の操作またはトランザクションをデータベースに復元していました。数分待つと、自動的にSQL Serverがデータベースを復元します。
これは、SQL Serverが大きなトランザクション操作を実行しているときに開発者がサービスを再起動したために発生しました。トランザクションログファイルが非常に大きいなど、別の理由も考えられます。
SQL Serverデータベースが保留モードの場合、手動の方法で取得できます。データベースを復元するときは、最後の復元文にWITH RECOVERYを追加してください。データベースdbnameを復元して復元します。ここからソリューションを取得することもできます- https://community.spiceworks.com/how_to/157233-how-to-fix-recovery-pending-state-in-sql-server-database