BarTender システムデータベースのトランザクションログファイル(.LDF)のトラブルシューティング
症状
システムデータベースが異常に大きくなり、メンテナンス時に以下のエラーメッセージが表示されて失敗することに気付きました:
ストアドプロシージャ: [dbo].[SpDeleteOlderRecords] 失敗; 内部メッセージ: データベース 'SystemDB' のトランザクションログが 'ACTIVE_TRANSACTION' のためいっぱいです
環境
BarTender システムデータベース
診断
管理コンソールの「管理タスク > データベースサイズの表示...」で、トランザクションログファイルのサイズが小さいことを確認してください。
通常、BarTender システムデータベースの SQL Server トランザクションログファイル(.LDF)は、データベースメンテナンス中に一時的に大きくなりますが、メンテナンス終了後には元のサイズに戻るはずです。しかし、必ずしもそうなるとは限らず、LDFファイルがどんどん大きくなってしまうことがあります。
解決方法
以下のシステムデータベースへの変更を行う前に、必ずデータベース管理者に相談してください。
以下のシステムデータベースへの変更を行う前に、必ずシステムデータベースのバックアップを取ってください。
お客様のトランザクションログが、メンテナンス作業に必要なすべてのトランザクション情報を処理するには十分な大きさではありません。メンテナンス作業は以下の3つのステップで構成されています:
- バックアップ
- 古いレコードの削除
- インデックスの再編成または再構築(多くのトランザクションログ領域が必要な場合があります)
トランザクションログの領域を増やすことをおすすめします。また、リカバリモデルは「シンプル」に設定することで、トランザクションログの使用量を大幅に減らすことができます。
手順:
- SQL Server Management Studio で、システムデータベースを右クリックし、プロパティ > ファイル からトランザクションログファイルの最大サイズを確認します。
- システムデータベースのプロパティで、リカバリモデルが「シンプル」になっていることを確認します。システムデータベースを右クリック > プロパティ > オプション > リカバリモデル
- 必要に応じて、メンテナンスのロックを解除する「手動アンロック」手順を実行します(下記参照)。
- 管理コンソールを起動してメンテナンスを実行します。
- メンテナンス完了後、トランザクションログファイルがどれだけ増えたか確認します。
- 再度データベースのプロパティに入り、ファイルのサイズ制限をディスク上のファイルサイズ程度に設定し、無制限にはしないようにします。
注意:SQL Server Express のサイズ制限のため、システムデータベースを毎週クリーンアップする必要がある場合、10GBのサイズ制限では不十分な場合があります。データベースシステムには、SQL Server のフルバージョンと専用ディスク(場合によっては別のVMwareイメージやサーバーブレード)が必要になることがあります。これらの変更を行っても、定期的なバックアップやアーカイブ作業が不要になるわけではありませんのでご注意ください。
「手動アンロック」手順
- 「BarTender System Service」Windowsサービスを停止します。
- SQL Server Management Studio のオブジェクトエクスプローラー(通常は左側のペイン)でデータベースを展開し、「Programmability」フォルダ内の「Stored Procedures」フォルダを開きます。
- 以下の手順を実行します(0行が影響を受けた場合は、もう一度実行してください):
exec SpDsUnlockMaintenance 0
- 「SpDeleteRecords」プロシージャを探します。
- 「SpDeleteRecords」を右クリックし、「Script stored procedure as」 > 「ALTER to」 > 「New query editor window」を選択します。
- 新しいエディタで、「ALTER PROC」行から「WITH EXECUTE AS 'dbo'」を削除し、以下のようにします:
ALTER PROC [dbo].[SpDeleteRecords](@pastUtcTicks bigint, @categories nvarchar(1024))
- このクエリを実行します(通常はF5キー)。
- 「BarTender System Service」Windowsサービスを再起動します。
ログサイズの縮小
大量の未使用領域が発生する操作(例:テーブルの切り捨てや削除)を行った後、現在のデータベースのログファイルサイズを縮小するには、以下のクエリを実行してください。(下記スクリプトの [Database name] はご自身のデータベース名に置き換えてください)
-- システムデータベースのリカバリモデルをSIMPLEに設定し、その後トランザクションログに対してDBCC SHRINKFILE操作を実行します。
ALTER DATABASE "[Database name]" SET RECOVERY SIMPLE
DBCC SHRINKFILE ([Database name]_Log, 1);
GO
追加リソース