Web サーバーで開発およびテストの目的で使用されるデータベースがあります。私がやりたいことは、約 50,000 レコードを含むテーブルに 1 つの列を追加することです (私はデータベース管理者ではないことに注意してください)。プロバイダーから提供された資格情報を使用して SSMS 経由で接続し、次のクエリを実行しています
ALTER TABLE MyTable
ADD MyCol BIT
CONSTRAINT MyConstraint DEFAULT 1 NOT NULL
私が得るエラーは次のとおりです。
メッセージ 9002、レベル 17、状態 4、行 2
データベース 'my_db' のトランザクション ログがいっぱいです。ログ内のスペースを再利用できない理由を調べるには、sys.databases の log_reuse_wait_desc 列を参照してください。
私が実行すると
SELECT log_reuse_wait_desc, *
FROM sys.databases WHERE name ='my_db'
GO
Add MyCol と一緒のバッチでは、log_reuse_wait_desc は ACTIVE_TRANSACTION になります。別のコマンドとして実行すると、CHECKPOINTになります
データベースの復旧モードはシンプルに設定されています。私はインターネットで解決策を探しましたが、回復モードをシンプルに設定するか (すでにそうです)、ログ ファイルをバックアップしてから圧縮することを提案している人もいますが、これは非常に悪い習慣だと考える専門家もいます。
では、データを含むテーブルに単純な NOT NULL 列を追加するにはどうすればよいでしょうか?
編集:誰かがすべての回答を読みたくない場合の解決策は次のとおりです。
トランザクション ログのサイズを取得するには、次のようにしました。
sp_helpdb 'YouDatabaseName'
結果ウィンドウにログ ファイルのサイズが表示されます (私の場合は 8MB でした)。値を大きくするには、次のクエリを使用します。
ALTER DATABASE YourDatabaseName
MODIFY FILE(NAME = YourDatabaseLogName, SIZE=128MB);
GO
そして、エラーはなくなります。