web-dev-qa-db-ja.com

SQLサーバー-ACTIVE_TRANSACTIONが原因でログがいっぱいです

非常に大きなデータベース(50 GB以上)があります。ハードドライブの空き容量を増やすために、テーブルの1つから古いレコードを削除してみました。私はコマンドを実行しました:

delete from Table1 where TheDate<'2004-01-01';

ただし、SQL Server 2012は次のように述べています。

Msg 9002, Level 17, State 4, Line 1 
The transaction log for database 'MyDb' is full due to 'ACTIVE_TRANSACTION'.

そして、それは物を削除しませんでした。そのメッセージはどういう意味ですか?レコードを削除するにはどうすればよいですか?

20
oabarca

エラーを回避するために私がやったことは次のとおりです。

最初に、データベース復旧モデルをSIMPLEとして設定します。詳細情報 こちら

次に、いくつかの古いファイルを削除することで、5GBの空き領域を作成し、ログファイルの容量を増やしました。

警告なしでDELETEステートメントを再実行しました。

DELETEステートメントを実行すると、データベースがすぐに小さくなり、ハードドライブの領域が解放されると考えました。しかし、それは真実ではありませんでした。 DELETEステートメントの後に解放されたスペースは、次のコマンドを実行しない限り、オペレーティングシステムに仲介されません。

DBCC SHRINKDATABASE (MyDb, 0);
GO

そのコマンドの詳細 here

16
oabarca

SQL Serverを再起動すると、データベースで使用されているログ領域がクリアされます。これがオプションではない場合、次を試すことができます:

* Issue a CHECKPOINT command to free up log space in the log file.

* Check the available log space with DBCC SQLPERF('logspace'). If only a small 
  percentage of your log file is actually been used, you can try a DBCC SHRINKFILE 
  command. This can however possibly introduce corruption in your database. 

* If you have another drive with space available you can try to add a file there in 
  order to get enough space to attempt to resolve the issue.

これが解決策を見つけるのに役立つことを願っています。

11
Ankit Bajpai