SQL Serverで列をintに更新するときにトランザクションログがいっぱいになるのを回避する方法


18

というSQL Server 2005テーブルBRITTNEY_SPEARS_MARRIAGESがあり、次の列があります。

MarrigeId tinyint, 
HusbandName varchar(500),
MarrigeLength int

今、私は別のテーブルを持っています BRITTNEY_SPEARS_MARRIAGE_STORIES

StoryId int, 
MarriageId tinyint, 
StoryText nvarchar(max)

問題は、私たちが更新したいですMarrigeIdに列をintからtinyint。私たちは、ブリトニーがすべてのことを言って成し遂げる前にたくさんの結婚をするだろうと感じています。

現在、BRITTNEY_SPEARS_MARRIAGE_STORIESテーブルには1800万行があり(女の子に問題があるので)、更新を行うとトランザクションログがいっぱいになり、SQL Serverボックスが停止します。

どうすればこれを回避できますか?

とにかく「SQL Serverをこの列を更新して大きくします。このSQL Serverで信頼してください。すべての検証を試みている間、トランザクションログをいっぱいにしないでください」と言うことはできますか?

回答:


7

SQL Serverにトランザクションログを使用しないように指示する方法はありません。

何ができるやっていることはスペースが必要になったとして、古いログエントリが上書きされますSIMPLEにデータベースの復旧モデルを、設定されています。ただし、特定の種類の復元(ポイントインタイム復元など)を実行できないため、運用サーバーでこれを実行しないでください。

または、トランザクションログファイルを大きく設定することもできます-非科学的な経験則として、A)トランザクションログには、テーブルのサイズの少なくとも約1.5倍の空き領域があるか、またはB)少なくともこの程度の空きディスク容量があるドライブにトランザクションログが自動成長できること。

ログをバックアップすることにより、トランザクションログ領域を解放できます。ログの内容を気にしない場合は、ファイルを捨ててください。これのショートカットはBACKUP LOG <Your Database Name> TO DISK = 'NUL:'です。繰り返しますが、その意味を確実に理解していない限り、実稼働サーバーでこれを実行しないでください。

もう1つ注意することは(質問と完全に密接な関係はありませんが)、展開するテーブルにクラスター化インデックスが定義されていることを確認することです。そうでない場合、テーブルは非常に大量のヒープの断片化を招き、このような変更で不必要に大きくなる可能性があります。


5
  • 外部キーをドロップします
  • int代わりに新しいテーブルを作成しますtinyint
  • 1000のバッチごとに行を移動します(新しいテーブルに挿入し、古いテーブルから削除します)
  • 古いテーブルを削除する
  • を使用して新しいテーブルの名前を古い名前に変更します sp_rename
  • 外部キーを再作成します

PSトランザクションログが大きい場合...復旧モデルを確認してください。復旧モデルがでない場合、simple最後にログをバックアップしてからどのくらいでしたか?


ログをバックアップしたので、データベースをバックアップしてもログは小さくなりません。
HLGEM

@HLGEM:そのとおりです。ポール・ランダルのそのトピックに関する記事を読みました。ただし、完全なバックアップのみを行うと、ログは増え続けます。
アンドマー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.