2

チームのASP.NETアプリケーションのデータアクセス層で、.NET SQLClientを使用して、データベースに対してストアドプロシージャを実行します。データベースでの挿入操作を可能にする新しいコードを追加した後、コードをテストしたところ、次の例外が発生しました。

The transaction log for database 'DBName' is full. To find out why space in the log cannot be reused, see the log_reuse_wait_desc column in sys.databases

MS SQL Server Management Studio内から挿入操作を試行したときに、同じメッセージが表示されることを確認しました。最近、データベースに3つの2つのトリガー2つを追加して、特定のテーブルへの挿入と更新に基づいてデータの挿入を実行し、無限ループまたはそのような性質が発生した可能性があると考えたため、心配しました。

ただし、オンラインでのこの問題の他のインスタンスに基づくと、トリガーまたは回転するクエリによって一般的に引き起こされる問題のようには見えません。log_reuse_waitと列に対してクエリを実行しlog_reuse_wait_desc、次を返しました。

2 | LOG_BACKUP

また、クエリは次を返します。SELECT [name], recovery_model_desc, log_reuse_wait_desc
FROM sys.databases

name | recovery_model_desc| log_reuse_wait_desc

DBName|   FULL            | LOG_BACKUP

最初の列はlog_reuse_waitで、2番目の列はですlog_reuse_wait_descmsdnのコードの定義に基づいて、ログのバックアップを実行する必要があります。そうすると、ログが自動的に切り捨てられ、データベースでさらに操作できるようになります。それは正しい仮定ですか?これは、トリガーが正しくコーディングされていないことが原因である可能性がありますか、それともデータベース上の多数のトランザクションによって発生する日常的なメンテナンスタスクである可能性がありますか?

編集:

クエリは次をselect type_desc, size, max_size from sys.database_files返します。

   type_desc | size | max_size
1| ROWS      |  512 | -1
2| LOG       |  64  |  -1
4

1 に答える 1

10

データベースが完全復旧モードの場合、ログのバックアップが実行されるまで、ログは切り捨てられません(切り捨ては不適切な言葉です。他の何かを選択したいのですが)。基本的に、データベースを完全復旧モードにすると、SQLServerにポイントインタイム復旧が必要であることを通知します。これを行うには、SQL Serverは最後の完全(または差分)バックアップからの完全なログチェーンを必要とします。これを行うには、ログをバックアップするまでログスペースを再利用(「切り捨て」)しません。 。

これは、完全復旧モードにあるデータベースの日常的な運用上の問題です。ポイントインタイムリカバリが必要ない場合は、データベースをSIMPLEリカバリモードに設定します。これにより、ログスペースが自動的に再利用されますが、リカバリできるのは最後の完全/差分バックアップのみです。

ポイントインタイムリカバリが必要な場合は、定期的にログバックアップを実行するメンテナンスプランを設定する必要があります(DBAチームが必要です)。

于 2012-12-20T16:24:57.727 に答える