SQL Server 2008 R2の圧縮後にログファイルサイズを手動で設定する


10

その瞬間、やや不本意なDBAになり、何かの助けが本当に必要です。

フルリカバリモードで40GBのデータベースがあり、ログバックアップが構成されておらず、84GBの巨大なログファイルがあります。これまでのところ、この状況を回避するための私の計画は、データベースで完全なログバックアップを実行し、ログファイルを圧縮し、データベースバックアップを使用してログバックアップを毎晩実行し、制御を維持できるように保守計画を推進することです。

私の問題は、ログファイルを何も縮小しないで、月曜日の最初の朝を絶えず成長させておくことです。ファイルがどうあるべきか(データベースの約20%)については大まかな見積もりがあり、できる限り多くの連続したスペースを確保するために、最初から設定します。これは、データベースのプロパティ->ファイルで「初期サイズ」を変更した場合に過ぎませんか?これを実行するには、データベースをオフラインにする必要があると思いますか?

前もって感謝します


2
データベースを夜に1回バックアップし、ログのバックアップを夜に1回実行する予定ですか。おそらく、ログがそれ自体を管理するように、単純な復旧モデルを検討する必要があります。
アーロンバートランド

アーロン、私はDRリカバリーの観点であなたに同意しますが、運用リカバリーのために、それをまだいっぱいにしたいと思うかもしれません。ログバックアップは1日に1回しか実行されませんが、ポイントインタイムリカバリが可能であることを忘れないでください。
ケネスフィッシャー

1
@Kennethなので、真夜中に完全バックアップを実行し、12:05にログバックアップを実行した場合、それは非常に不自然です。YMMV。
アーロンバートランド

@Aaronは再び、すべての操作が可能ですが、私が間違っていない限り、前の夜の完全バックアップと、12:05に取得されたログを使用して、前日の任意の時点に復旧できます。また、問題が発生した場合は、ログバックを実行し、前の夜から復元し、特定の時点で数分前の状態に戻すことも重要ではありません。私は、彼らがそれを完全に保つべきだと言っているのではなく、DRの観点よりももっと関与していると言っているだけです。満杯を維持している場合、1日1回よりも頻繁にログバックアップを実行する必要があると言われています。
ケネスフィッシャー

2
@Kennethですが、ログを1日に1回しかバックアップしない場合、これがそもそも巨大な理由です。昨日の午前12時7分に回復する必要がある場合、2分間回復するには、丸一日にわたってログ全体をロードする必要があります。あまり役に立たない。
アーロンバートランド

回答:


6

最適なサイズだと思うものに縮小するだけです。UIを使用せず、ただ実行してください。たとえば、200 MBが最適なサイズだとします。

USE yourdb;
GO
DBCC SHRINKFILE(yourdb_log, 200);

ログバックアップを1日に1回だけ取得することに関心があり、ポイントインタイムリカバリに関心がない場合は、単純なリカバリモデルに切り替える必要があります。つまり、ログのバックアップは不要です(実際には不可能です)が、ログの内容は自己管理されます。

ログバックアップを意味のあるものにしたい場合は、夜間に完全バックアップを実行し、その直後に単一のログバックアップを実行することを計画しないでください。これにより、完全な復旧モデルが維持され、ログが非常に困難になり、何も購入されなくなります。そのため、ポイントインタイムリカバリが必要な場合は、データ損失の許容範囲を満たすレートでログバックアップをより頻繁に実行してください。15分を超えるデータを失いたくない場合は、15分ごとにログバックアップを実行してください。


これをありがとう。単純復旧モデルへの移行に関するすべてのコメントを完全に理解しています。残念ながら、これは私が決定できない決定であり、いくつかのレベルの官僚機構を通過する必要があります。それは確かに私が提案するものです。
Tim Alexander

12

ファイル管理は完全にオンラインで行うことができます。回復目的でログ情報を保持する必要性に応じて、2つのパスがあります。

ポイントインタイムリカバリは不要

  1. データベースをSIMPLEリカバリに変換します。チェックポイントを実行して、トランザクションをディスクに書き込みます。
  2. ログを平坦化します。
  3. ログのサイズを適切なサイズに変更します。

また、ログの管理を改善するために、固定の増加量と無制限の増加を設定することをお勧めします。固定の増加量はそれが依存する量であることに注意してください。ログがどれほどの増加を期待できるかに応じて、最初は1〜2 GBを使用することをお勧めします。理想的には、ログはあまり大きくならないので、これによる影響はそれほど大きくないはずです。ログが定期的に増加している場合は、サイズを再確認する必要がある場合があります。

使用して達成:

ALTER DATABASE [foo] 
SET RECOVERY SIMPLE;

CHECKPOINT;

DBCC SHRINKFILE (foo_log,0);

ALTER DATABASE [foo]
MODIFY FILE (NAME=foo_log,SIZE=8000MB,MAXSIZE=UNLIMITED,FILEGROWTH=1000MB);

--Optional if you want the database in full recovery mode 
--for point in time recovery going forward
ALTER DATABASE [foo] 
SET RECOVERY FULL;

ポイントインタイムリカバリが必要

最大の問題は、現在アクティブなVLFセグメントを超えてログファイルを圧縮できないことです。これを確認するにDBCC LOGINFOは、データベースコンテキストで使用できます。Status = 2のセグメントはすべてアクティブです。アクティブなセグメントをクリアするには、そのセグメントで現在アクティブなトランザクションがないときにトランザクションログのバックアップを実行する必要があります。あなたのステップは:

  1. トランザクションログのバックアップを実行します。
  2. ファイルを縮小します。(理想的にはフラット化しますが、データベースがアクティブな場合、これは困難です)。
  3. ログが適切なサイズ、理想的には可能な限り小さくなるまで、手順1と2を繰り返します。
  4. ログのサイズを適切なサイズに変更します。

使用して達成:

BACKUP LOG [foo] TO DISK='<Location of t-log backup>';

DBCC SHRINKFILE (foo_log,0);

--Repeat the above until your log file is small "enough"

ALTER DATABASE [foo]
MODIFY FILE (NAME=foo_log,SIZE=8000MB,MAXSIZE=UNLIMITED,FILEGROWTH=1000MB);

ここで何が起こっているのかを理解するための追加のリソース:


2

実際には、ログを圧縮するためにデータベースをオフラインにする必要はありません。そして、これはおそらくログを縮小することが良い考えである数少ないケースの1つであると言います。初期サイズを設定することもできますが、縮小を実行して特定のサイズに縮小するように指示する方が簡単です。

USE [DBName]
GO
DBCC SHRINKFILE (N'LogName' , SizeInMg)
GO

また、GUIを使用し、2番目のラジオボタンと、ログの最終的な大きさを示すチェックボックスを使用して、これを行うこともできます。SSMSのオブジェクトエクスプローラーでデータベースを右クリックし、タスク、圧縮、ファイルを選択すると、GUIにアクセスできます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.