SQL Serverトランザクションログをクリアするにはどうすればよいですか?


577

私はSQLの専門家ではないので、基本を超えて何かをする必要があるたびに、その事実を思い出します。サイズが大きくないテストデータベースがありますが、トランザクションログは確かにそうです。トランザクションログをクリアするにはどうすればよいですか?



3
Managment Studioに「Click to Shrink Log」というコマンドがあるはずです。これで完了です。
フレンチ

回答:


749

ログファイルを小さくすることは、実際には予期しない増加が発生し、再び発生することはないと思われるシナリオのために予約する必要があります。ログファイルが再び同じサイズに拡大する場合、一時的に縮小してもあまり効果はありません。これで、データベースのリカバリ目標に応じて、これらのアクションを実行する必要があります。

まず、完全バックアップを取ります

何か問題が発生した場合に復元できることを確認せずに、データベースを変更しないでください。

ポイントインタイムリカバリが気になる場合

(そして、ポイントインタイムリカバリとは、完全バックアップまたは差分バックアップ以外に復元できることを気にかけていることを意味します。)

おそらくデータベースはFULL回復モードです。そうでない場合は、次の点を確認してください。

ALTER DATABASE testdb SET RECOVERY FULL;

定期的にフルバックアップを実行している場合でも、ログバックアップを実行するまでログファイルは大きくなります。これは保護のためであり、ディスクスペースを無駄に消費しないようにするためです。リカバリの目的に応じて、これらのログバックアップを頻繁に実行する必要があります。たとえば、災害発生時に15分以内のデータを失うことを許容できるというビジネスルールがある場合、15分ごとにログをバックアップするジョブが必要です。現在の時刻に基づいてタイムスタンプ付きのファイル名を生成するスクリプトは次のとおりです(ただし、メンテナンスプランなどでもこれを行うことができます。メンテナンスプランで縮小オプションを選択しないでください。ひどいです)。

DECLARE @path NVARCHAR(255) = N'\\backup_share\log\testdb_' 
  + CONVERT(CHAR(8), GETDATE(), 112) + '_'
  + REPLACE(CONVERT(CHAR(8), GETDATE(), 108),':','')
  + '.trn';

BACKUP LOG foo TO DISK = @path WITH INIT, COMPRESSION;

\\backup_share\基礎となる別のストレージデバイスを表す別のマシン上にあることに注意してください。これらを同じマシン(または、同じ基盤のディスクを使用する別のマシン、または同じ物理ホスト上にある別のVM)にバックアップしても、マシンが停止するとデータベースが失われるため、実際には役立ちませんそのバックアップ。ネットワークインフラストラクチャによっては、ローカルでバックアップし、バックグラウンドで別の場所に転送する方が理にかなっている場合があります。どちらの場合も、できるだけ早くプライマリデータベースマシンから削除する必要があります。

さて、定期的なログバックアップを実行したら、ログファイルを今までに爆発したものよりも合理的なものに縮小するのが妥当です。これは、ログファイルが1 MBになるまで繰り返し実行されることを意味しません。SHRINKFILEログを頻繁にバックアップする場合でも、発生する可能性のある同時トランザクションの合計に対応する必要があります。SQL Serverはファイルをゼロ設定する必要があるため(インスタントファイル初期化が有効になっている場合のデータファイルとは異なり)、ログファイルの自動拡張イベントはコストがかかり、ユーザートランザクションはこれが発生するまで待機する必要があります。この拡大縮小縮小拡大ルーチンをできるだけ少なくしたいので、ユーザーに料金を支払わせたくないのは確かです。

縮小が可能になる前に、ログを2回バックアップする必要があることに注意してください(Robertに感謝)。

したがって、ログファイルの実用的なサイズを考え出す必要があります。ここでは、システムについて多くの知識がなければ、それが何であるかを説明することはできませんが、ログファイルを頻繁に圧縮していて、再び増加している場合、適切な透かしは、最大のものよりもおそらく10から50%高くなります。 。それが200 MBになり、その後の自動拡張イベントを50 MBにしたい場合、ログファイルのサイズを次のように調整できます。

USE [master];
GO
ALTER DATABASE Test1 
  MODIFY FILE
  (NAME = yourdb_log, SIZE = 200MB, FILEGROWTH = 50MB);
GO

ログファイルが現在200 MBを超える場合は、最初にこれを実行する必要がある場合があります。

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

ポイントインタイムリカバリを気にしない場合

これがテストデータベースであり、Point-in-Timeリカバリを気にしない場合は、データベースがSIMPLEリカバリモードであることを確認する必要があります。

ALTER DATABASE testdb SET RECOVERY SIMPLE;

データベースをSIMPLE回復モードにすると、SQL Serverは、すべてのトランザクションの記録を保持するために成長するのではなく、ログファイルの一部を再利用します(基本的には非アクティブなトランザクションを段階的に廃止します)(FULL回復はログをバックアップするまで行われます)。CHECKPOINTイベントは、ログを制御するのに役立ち、CHECKPOINTs 間に多くのt-logアクティビティを生成しない限り、ログが大きくなる必要がないことを確認します。

次に、このログの増加が本当に異常なイベント(たとえば、毎年の春の大掃除または最大のインデックスの再構築)によるものであり、通常の日常的な使用によるものではないことを確認する必要があります。ログファイルを途方もなく小さいサイズに圧縮し、SQL Serverが通常のアクティビティに対応するためにログファイルを再度拡張する必要がある場合、何が得られましたか。一時的に解放したディスク領域を利用できましたか?すぐに修正が必要な場合は、以下を実行できます。

USE yourdb;
GO
CHECKPOINT;
GO
CHECKPOINT; -- run twice to ensure file wrap-around
GO
DBCC SHRINKFILE(yourdb_log, 200); -- unit is set in MBs
GO

それ以外の場合は、適切なサイズと成長率を設定します。ポイントインタイムリカバリの例のように、同じコードとロジックを使用して、適切なファイルサイズを決定し、適切な自動拡張パラメーターを設定できます。

したくないこと

  • ログをバックアップしTRUNCATE_ONLY、その後オプションとSHRINKFILE。1 TRUNCATE_ONLYつには、このオプションは廃止されており、SQL Serverの現在のバージョンでは使用できなくなりました。次に、FULL復旧モデルを使用している場合、ログチェーンが破壊され、新しい完全バックアップが必要になります。

  • データベースをデタッチし、ログファイルを削除して、再度アタッチします。これがどれほど危険かを強調することはできません。データベースが復旧しない可能性があります。疑わしいとして復旧する可能性があります。バックアップがある場合は、バックアップに戻す必要がある場合もあります。

  • 「データベースの縮小」オプションを使用しますDBCC SHRINKDATABASE同じことを行う保守計画オプションは、特にログの問題の問題を本当に解決する必要があるだけの場合は、悪い考えです。調整するファイルをターゲットにして、DBCC SHRINKFILEまたはALTER DATABASE ... MODIFY FILE(上記の例)を使用して個別に調整します。

  • ログファイルを1 MBに圧縮します。SQL Serverでは特定のシナリオでそれを実行でき、解放されたすべての領域を確認できるため、これは魅力的に見えます。データベースが読み取り専用でない限り(そして、それを使用してそのようにマークする必要がありますALTER DATABASE)、リカバリモデルに関係なくログが現在のトランザクションに対応する必要があるため、これは多くの不必要な拡張イベントを引き起こすだけです。SQL Serverがゆっくりと苦痛に取り戻すことができるように、そのスペースを一時的に解放する目的は何ですか?

  • 2つ目のログファイルを作成します。これにより、ディスクがいっぱいになったドライブが一時的に軽減されますが、これは、パンクした肺をバンドエイドで固定しようとするようなものです。別の潜在的な問題を追加するのではなく、問題のあるログファイルを直接処理する必要があります。一部のトランザクションログアクティビティを別のドライブにリダイレクトする以外は、2番目のログファイルは(2番目のデータファイルとは異なり)実際には何もしません。Paul Randalは、複数のログファイルが後であなたに噛まれる理由も説明しています

積極的に

ログファイルを少しだけ小さくして、それ自体が常に小さな速度で自動拡張できるようにする代わりに、ある程度大きなサイズ(最大の同時トランザクションセットの合計に対応できるサイズ)に設定し、適切な自動拡張を設定します。フォールバックとして設定することで、単一のトランザクションを満たすために複数回拡張する必要がなくなり、通常のビジネスオペレーション中に拡張が必要になることは比較的まれになります。

ここで考えられる最悪の設定は、1 MBの増加または10%の増加です。おかしなことに、これらはSQL Serverのデフォルトです(私は不満を言って変更を要求しました)-データファイル用に1 MB、ログファイル用に10%。前者はこの日と年齢では非常に小さすぎ、後者は毎回イベントが長くなります(たとえば、ログファイルは500 MB、最初の増加は50 MB、次の増加は55 MB、次の増加は60.5 MBです) 、等々-そして遅いI / Oでは、私を信じて、あなたは本当にこの曲線に気づくでしょう)。

参考文献

ここで止めないでください。ログファイルの圧縮に関するアドバイスの多くは本質的に悪いものであり、破滅的なものになる可能性さえありますが、ディスク領域を解放するよりもデータの整合性を重視する人もいます。

2009年に私が書いたブログの投稿で、「ログファイルを圧縮する方法はここにあります」という投稿がいくつか出てきたのを目にしました

SQL Server Magazineの記事が公開されるべきではなかったため、Brent Ozarが4年前に投稿したブログ記事で、複数のリソースを指摘しています。

t-logのメンテナンスが重要である理由と、データファイルも縮小すべきではない理由を説明するPaul Randalのブログ投稿

マイクウォルシュは、ログファイルをすぐに圧縮できない理由を含む、これらの側面のいくつかをカバーする素晴らしい答えを持っています


5
完全復旧モデルを使用する理由は、ポイントインタイムリカバリだけではありません。主な理由は、データの損失を防ぐためです。データ損失の可能性は、バックアップ間の長さです。毎日バックアップするだけの場合、データ損失の可能性は24時間です。その後30分ごとにログバックアップを追加すると、データ損失の可能性は30分になります。さらに、あらゆる種類の断片的な復元(破損からの回復など)を実行するには、ログバックアップが必要です。
Robert L Davis

9
それはさておき、これはこのページで与えられた最も完全で正しい答えです。
Robert L Davis

11
また、ログのクリアは、ログ(完全または一括ログ復旧の場合)またはチェックポイント(単純復旧の場合)をバックアップすることによって行われることも付け加えておきます。ただし、ログファイルを圧縮する必要がある場合は、それだけでは不十分です。現在アクティブなVLFをログファイルの先頭に循環させる必要があります。SQL 2008以降では、2つのログバックアップまたはチェックポイントを連続して発行することで、これを強制できます。最初のものはそれをクリアし、2番目のものはファイルの先頭にサイクルバックします。
Robert L Davis

2
@Doug_Ivisonは、いつでもログレコードが削除される可能性があるためです。不完全なログをバックアップできるようにするポイントは何ですか?単純なリカバリでは、ログはトランザクションのロールバックを可能にするためにのみ実際に使用されます。トランザクションがコミットまたはロールバックされると、次の1秒はログから削除される可能性があります。
アーロンベルトラン

3
@zinczincわかりました。フィードバックをありがとうございます。私が答えを最初にして、後で説明をすることで私が見る問題は、彼らが重要な部分を決して読まないことです。私が読者を溺れさせている講義は、実際には最後の答えよりもはるかに重要であり、私が提供する背景は私がそれらの選択をするためにかなり重要です。しかし、ちょっと、OPに適していると思うので1行の回答を提出したい場合は、私の回答のその部分を使用して、私たち全員が学ぶことができるより良いものを作成してください。
Aaron Bertrand

200
-- DON'T FORGET TO BACKUP THE DB :D (Check [here][1]) 


USE AdventureWorks2008R2;
GO
-- Truncate the log by changing the database recovery model to SIMPLE.
ALTER DATABASE AdventureWorks2008R2
SET RECOVERY SIMPLE;
GO
-- Shrink the truncated log file to 1 MB.
DBCC SHRINKFILE (AdventureWorks2008R2_Log, 1);
GO
-- Reset the database recovery model.
ALTER DATABASE AdventureWorks2008R2
SET RECOVERY FULL;
GO

From:DBCC SHRINKFILE(Transact-SQL)

最初にバックアップすることをお勧めします。


文書からのマイモニデスのおかげで、私はそれが最高だと思います:Pは特に私が発明しなかったためです:)
Rui Lima

1
それを行った後、ログのサイズは少し変わっていません。私は何か間違ったことをしましたか?
chester89

1
このアプローチセットは回復タイプが前に何か他のものであっても、「FULL」にタイプを回復
第VII

1
魔法のように働いた!ログファイルの名前は実際にはその論理名であることに注意してください(db-> properties-> filesにあります)
Bizhan

2
このスクリプトにはBACKUP DATABASE句を含めるので、この部分を忘れないでください。何年か前に、空き領域が少なすぎるディスクでデータベースを縮小したので、これを言います。圧縮プロセスでは、ファイルが大きくなり、Out of Spaceエラーがスローされました。結果:データベースが失われました。Lucklyは、耐性を失ったログデータベースでした。
Cesar

185

免責事項:以下のコメントを注意深くお読みください。承認された回答はすでに読んだと思います。5年近く前に言ったように:

これが適切または最適な解決策ではない場合に誰かがコメントを追加する場合は、以下にコメントしてください


  • データベース名を右クリックします。

  • タスク→縮小→データベースを選択します

  • 次にOK

私は通常、データベースファイルを含むWindowsエクスプローラーのディレクトリを開いているので、その影響をすぐに確認できます。

これがうまくいったことに本当に驚いた!通常、私は以前にDBCCを使用したことがありますが、それを試しただけで何も縮小しなかったので、GUI(2005)を試してみたところ、10秒で17 GBが解放されました。

完全復旧モードではこれが機能しない可能性があるため、まずログをバックアップするか、単純復旧に変更してからファイルを圧縮する必要があります。[@onupdatecascadeに感謝]

-

PS:これの危険性についてコメントしていただいたことに感謝しますが、私の環境では特にフルバックアップを最初に行っているので、自分でこれを実行しても問題はありませんでした。したがって、続行する前に、ご使用の環境と、これがバックアップ戦略とジョブのセキュリティにどのように影響するかを考慮してください。私がやっていたことは、Microsoftが提供する機能を人々に示すことだけでした。


50
完全復旧モードではこれが機能しない可能性があるため、まずログをバックアップするか、単純復旧に変更してからファイルを圧縮する必要があります。
onupdatecascade 2009

7
@onupdatecascade-完全なリカバリトリックについての良いコール。巨大なログを持つ別のデータベースがありました:シンプルに切り替えてから、データベースを縮小してフルに戻しました。500kbまでのログファイル!
Simon_Weaver 2009

26
ごめんなさい。しかし、この答えは単にもっと間違っていることはありません。データベースを縮小すると、トランザクションログファイルが大きくなります。SQL Serverデータベース内でデータを移動するときはいつでも、ログ記録が必要になります-ログファイルが肥大化します。ログサイズを小さくするには、DBをシンプルリカバリに設定するか、(ログデータを気にする/必要とする場合-ほとんどの場合本番環境で行う)ログをバックアップします。これらのシンプルな無料のビデオの詳細:sqlservervideos.com/video/logging-essentials sqlservervideos.com/video/sql2528-log-files
Michael K. Campbell

30
うわー、この回答に対して1300以上の担当者を獲得できましたが、それは本当にひどいアドバイスです。
アーロンベルトラン

8
何が起こっているのか、なぜ定期的に縮小が絶対的に重要であるのかを示すための誇張です。バックアップが行われる前に、レコードAが100万回変更されています。ログには何がありますか?無関係な999,999個のデータ。ログが決して縮小されない場合、データベースの実際の運用コストが何であるかは決してわかりません。また、おそらくSAN上の貴重なリソースを占有しています。縮小は適切なメンテナンスであり、環境との接続を維持します。あなたが決して縮小してはいけないと思う人を私に見せてください、そして私は彼らの環境を無視している人をあなたに見せます。
Newclique 2015

54

以下はトランザクションログを圧縮するスクリプトですが、圧縮する前にトランザクションログをバックアップすることをお勧めします。

ファイルを圧縮するだけでは、災害発生時に救命者になる可能性のある大量のデータが失われます。トランザクションログには、サードパーティのトランザクションログリーダーを使用して読み取ることができる多くの有用なデータが含まれています(手動で読み取ることもできますが、非常に手間がかかります)。

トランザクションログは、ポイントインタイムリカバリに関しても必須であるため、単に破棄するのではなく、必ず事前にバックアップしてください。

以下は、トランザクションログに格納されたデータを使用してリカバリを実行したいくつかの投稿です。

 

USE DATABASE_NAME;
GO

ALTER DATABASE DATABASE_NAME
SET RECOVERY SIMPLE;
GO
--First parameter is log file name and second is size in MB
DBCC SHRINKFILE (DATABASE_NAME_Log, 1);

ALTER DATABASE DATABASE_NAME
SET RECOVERY FULL;
GO

上記のコマンドを実行すると、次のようなエラーが表示される場合があります

「ファイルの最後にある論理ログファイルが使用中のため、ログファイル(ログファイル名)を圧縮できません」

つまり、TLOGが使用されています。この場合、これを数回続けて実行するか、データベースのアクティビティを減らす方法を見つけてください。


30

ここでは、シンプルであり非常に洗練潜在的に危険な 道。

  1. バックアップDB
  2. DBを切り離す
  3. ログファイルの名前を変更
  4. DBを接続
  5. 新しいログファイルが再作成されます
  6. 名前を変更したログファイルを削除します。

ログのバックアップを行っていないようです。(ログを切り捨てる)。私のアドバイスは、からの復旧モデルを変更することで、フルシンプル。これにより、ログの膨張が防止されます。


15
敬具、ログの削除/名前変更/再作成/置換は非常に悪い考えです。縮小はリスクが少ないはずであり、しかもそれを行うのは非常に簡単です。
onupdatecascade 2009

12
+1-洗練されていないかどうかにかかわらず、この方法では、ディスク全体を埋め尽くしているデータベースログが2、3回熱湯から抜け出し、縮小コマンドでも実行できなくなりました。
Shaul Behr

3
ログにチェックポイントされていないトランザクションが存在するリスクはありませんか?
ポール・

これは小さなDBでも問題ないかもしれませんが、3 TBまたは4 TBのDBがある場合、最適なソリューションではない可能性があります。
ジャック14

これは、システムを長期間開発していて、開発期間中に数千のレコードをロード/削除する場合は問題ありません。次に、このデータベースを使用して実際に展開する場合、ログに記録されたテスト/開発データは冗長であるため、失われたとしても問題ありませんか?
JsonStatham 2016

28

復元にトランザクションログを使用しない場合(つまり、完全バックアップのみを実行する場合)、リカバリモードを「シンプル」に設定できます。トランザクションログはすぐに縮小され、再びいっぱいになることはありません。

SQL 7または2000を使用している場合は、データベースオプションタブで「チェックポイント時のログの切り捨て」を有効にできます。これは同じ効果があります。

これは、特定の時点に復元することができないため、本番環境では明らかに推奨されません。


1
リカバリモードをシンプルに設定しても、それ自体ではトランザクションログが魔法のように縮小されることはありません。
アーロンベルトラン

@Aaronそれだけではありません。OPはテストデータベースを使用するため、「トランザクションログはすぐに縮小する」と想定しましたが、副作用のほうが多いという点で正しいです。単純なリカバリモードでは、おそらく縮んでしまいます。すぐにトランザクションログ
ジョナサン

Simple...そして二度と一杯になることはない」-真実ではない。復旧モデルが「シンプル」に設定されているデータベースで(過去48時間に)発生することを確認しました。ログファイルのファイル拡張は「制限付き」に設定されており、ログファイルに対して非常に大きなアクティビティを行っていました...異常な状況であったことは理解しています。(私たちの状況では、十分なディスク領域があったので、ログファイルのサイズを増やし、ログファイルのファイル拡張を「制限なし」に設定しました...ところで、変更後、「インターフェースのバグ」が「制限付き」と表示されます"2,097,152 MBの
最大サイズ

2
@Doug_Ivisonはい、トランザクションログにはオープントランザクションが含まれますが、チェックポイントが発生すると、トランザクションはシンプルモードで削除されます。この回答は、「開発/テストボックスに大きなトランザクションログがあり、それを削除したいので、あまり頻繁に心配する必要がない」ことを意図していて、本番環境に入るのではなく、環境。繰り返します:本番環境ではこれを行わないでください
ジョナサン

1
それはすべて本当であり、私はそれが開発のみの迅速なアプローチであったことを私は理解しています。私がコメントした理由:実際に起こるまで、単純な復旧モデルがいっぱいになることはないと思っていました...そして、異常に大きなトランザクションがそれを行うことができることを理解するようになりましたが、理解/解決するのにより長い時間がかかったと思います。
Doug_Ivison 2014年

9

Johnが推奨するこの手法は、データベースがログファイルなしで接続される保証がないため、推奨されません。データベースをフルからシンプルに変更し、チェックポイントを強制して数分待ちます。SQL Serverはログをクリアします。ログは、DBCC SHRINKFILEを使用して縮小できます。


...しかし、私は何十回も問題なくそれをやりました。おそらく、dbが再接続しない理由を説明できます。
Johnno Nolan

ログファイルが削除されたときに、SQL Serverがデータベースをデータベースに接続できない場合があることを確認しました(あまり頻繁ではありません)。これにより、役に立たないMDFファイルが残ります。問題を引き起こす可能性のあるいくつかの可能性があります。ロールバックを保留中のトランザクションが思い浮かびます。
mrdenny、2009

4
私はこの戦術に同意しますが、予期しないイベントや異常なイベントが原因でログが爆発した場合のために予約する必要があります。これを毎週行うようにジョブを設定した場合、それは非常に間違っています。
アーロンベルトラン

2
とても、とても本当のアーロン。
mrdenny 2013

はい、これはちょうど私たちに起こりました。データベースを移動する前にデータをバックアップしただけなので、20Gのログファイルを破棄したかったのです。MSSQLでは、膨大なログファイルなしで新しいデータベースを再接続することはできません。
ジョージM復帰

9

これまでのほとんどの回答は、トランザクションログファイルが実際には必要ないことを前提としていますが、データベースがFULL復旧モデルを使用していて、データベースを復元する必要がある場合に備えてバックアップを保持したい場合は、トランケートまたは削除しないでくださいこれらの回答の多くが示唆する方法でログファイル。

ログファイルを削除すると(切り捨て、破棄、消去などにより)、バックアップチェーンが壊れ、最後の完全バックアップ、差分バックアップ、またはトランザクションログバックアップから次の完全バックアップまでの時点に復元できなくなります。または差分バックアップが作成されます。

マイクロソフトの記事からBACKUP

ログチェーンが破損するため、トランザクションログを手動で切り捨てるためにNO_LOGまたはTRUNCATE_ONLYを使用しないことをお勧めします。次の完全または差分データベースバックアップまで、データベースはメディア障害から保護されません。非常に特殊な状況でのみ手動ログ切り捨てを使用し、データのバックアップをすぐに作成します。

これを回避するには、圧縮する前にログファイルをディスクにバックアップします。構文は次のようになります。

BACKUP LOG MyDatabaseName 
TO DISK='C:\DatabaseBackups\MyDatabaseName_backup_2013_01_31_095212_8797154.trn'

DBCC SHRINKFILE (N'MyDatabaseName_Log', 200)

3
, 1)一部を除いて、あなたの答えに同意します。問題は、1 MBに縮小すると、通常のログサイズにつながる成長イベントにかなりのコストがかかり、成長率をデフォルトの10%のままにしておくと、その多くが発生することです。
アーロンベルトラン

9

SQL Serverのトランザクションログは、不要な増加を防ぐために適切に維持する必要があります。これは、トランザクションログのバックアップを頻繁に実行することを意味します。そうしないと、トランザクションログがいっぱいになり、成長し始めるリスクがあります。

この質問に対する回答の他に、トランザクションログの一般的な神話を読んで理解することをお勧めします。これらの読み取り値は、トランザクションログを理解し、それを「クリア」するために使用する手法を決定するのに役立ちます。

以下からの10の最も重要なSQL Serverのトランザクションログの神話

神話:SQLサーバーがビジー状態です。SQL Serverトランザクションログのバックアップを作成したくない

SQL Serverで最大のパフォーマンスを必要とする操作の1つは、オンライントランザクションログファイルの自動拡張イベントです。トランザクションログのバックアップを頻繁に作成しないと、オンライントランザクションログがいっぱいになり、拡張する必要があります。デフォルトの拡張サイズは10%です。データベースがビジーであるほど、トランザクションログバックアップが作成されない場合、オンライントランザクションログの成長が速くなります。SQLServerトランザクションログバックアップを作成しても、オンライントランザクションログはブロックされませんが、自動拡張イベントはブロックされます。オンライントランザクションログのすべてのアクティビティをブロックできます

トランザクションログの神話から:

神話:定期的なログの縮小はメンテナンスの良い習慣です

偽。新しいチャンクをゼロにする必要があるため、ログの増加は非常にコストがかかります。ゼロ化が完了するまで、すべての書き込みアクティビティがそのデータベースで停止します。ディスクの書き込みが遅いか、自動拡張のサイズが大きい場合、その一時停止は非常に大きくなる可能性があり、ユーザーはそれに気づくでしょう。これが、成長を避けたい理由の1つです。ログを縮小すると、ログは再び大きくなり、不要な縮小と再成長のゲームでディスク操作を浪費しているだけです。


5

まず、データベースの復旧モデルを確認します。デフォルトでは、SQL Server Express Editionは単純な復旧モデル用のデータベースを作成します(私が間違っていない場合)。

Truncate_Onlyを使用したバックアップログDatabaseName:

DBCC ShrinkFile(yourLogical_LogFileName, 50)

SP_helpfileは、論理ログファイル名を提供します。

参照する:

SQL Serverデータベースの完全なトランザクションログから回復する

データベースが完全復旧モデルであり、TLバックアップを行わない場合は、SIMPLEに変更します。


これは、開発ボックスのログファイルをクリアする方法です。DBAの:-)に関連したバックアップ戦略など、私の休暇のすべてとのprod環境
ジュン

TRUNCATE_ONLYはSQL Serverの現在のバージョンではオプションではなくなり、サポートしているバージョンでは推奨されません(レイチェルの回答を参照)。
アーロンベルトラン

5

DBCC ShrinkFile ({logicalLogName}, TRUNCATEONLY)コマンドを使用します。これがテストデータベースであり、スペースを節約または再利用しようとしている場合、これが役立ちます。

ただし、TXログには、成長するまでの一定の最小/定常状態サイズがあることに注意してください。復旧モデルによっては、ログを縮小できない場合があります。FULLでTXログバックアップを発行していない場合、ログは縮小できません。ログは永久に大きくなります。TXログのバックアップが不要な場合は、復旧モデルをシンプルに切り替えます。

また、いかなる状況でもログ(LDF)ファイルを削除しないでください。データベースがすぐに壊れてしまいます。調理済み!できた!データを失った!「未修復」のままにすると、メインのMDFファイルが完全に破損する可能性があります。

トランザクションログを削除しないでください。データが失われます。データの一部はTXログにあります(復旧モデルに関係なく)... データベースの一部を効果的に削除するTXログファイルを切り離して「名前を変更」した場合。

TXログを削除した場合は、いくつかのcheckdbコマンドを実行して、データを失う前に破損を修正することができます。

この非常にトピックの悪いアドバイスに関するPaul Randalのブログ投稿をチェックしてください。

また、データが著しく断片化する可能性があるため、一般的にMDFファイルでshrinkfileを使用しないでください。詳細については彼の悪いアドバイスのセクションをチェックしてください(「なぜデータファイルを縮小すべきでないのか」)

ポールのウェブサイトをチェックしてください-彼はこれらの非常に質問をカバーしています。先月、彼はMyth A Dayシリーズでこれらの問題の多くを紹介しました。


+1これは良い考えではないかもしれないと言及する最初の答えであるため!OPはテストデータベースを指定しますが、これは、より一般的なケースで作成する価値のあるポイントです。
Martin Smith

追加したはずです-TXログを削除した場合-履歴書を更新してください!
ripvlan 2016年

4

ログファイルを切り捨てるには:

  • データベースをバックアップする
  • Enterprise Managerを使用するか、次のコマンドを実行して、データベースを切断します。Sp_DetachDB [DBName]
  • トランザクションログファイルを削除します。(または念のためファイルの名前を変更してください)
  • Sp_AttachDB [DBName]を使用して、データベースを再接続します
  • データベースが接続されると、新しいトランザクションログファイルが作成されます。

ログファイルを圧縮するには:

  • ログなしのバックアップログ[DBName]
  • 次のいずれかの方法でデータベースを縮小します。

    Enterprise Managerの使用:-データベースを右クリックし、[すべてのタスク]、[データベースの縮小]、[ファイル]、[ログファイルの選択]、[OK]の順にクリックします。

    T-SQLの使用: -Dbcc Shrinkfile([Log_Logical_Name])

ログファイルの論理名を見つけるには、sp_helpdbを実行するか、Enterprise Managerでデータベースのプロパティを調べます。


トランザクションログを削除しないでください。データの一部はログにあります。それを削除すると、データベースが破損します。反対票を投じる担当者はいません。
ripvlan 2015

4

ほとんどのSQLサーバーでの私の経験では、トランザクションログのバックアップはありません。フルバックアップまたは差分バックアップは一般的な方法ですが、トランザクションログのバックアップはほとんどありません。したがって、トランザクションログファイルは永久に大きくなります(ディスクがいっぱいになるまで)。この場合、復旧モデルは「シンプル」に設定する必要があります。システムデータベース「model」と「tempdb」も変更することを忘れないでください。

データベース「tempdb」のバックアップは意味をなさないため、このデータベースの復旧モデルは常に「単純」である必要があります。


データベースを単純に設定するだけでは、現在の状態ではログファイルが縮小されません。データベースがさらに大きくなるのを防ぐのに役立つ場合があります(ただし、可能性はあります)。
アーロンベルトラン

4
  1. MDBファイルのバックアップを取ります。
  2. SQLサービスを停止する
  3. ログファイルの名前を変更する
  4. サービスを開始する

(システムは新しいログファイルを作成します。)

名前を変更したログファイルを削除または移動します。


3

データベースログファイルのサイズが28 GBである場合、私はそれを経験しました。

これを減らすために何ができますか?実際には、ログファイルは、トランザクションが発生したときにSQLサーバーが保持するファイルデータです。トランザクションがSQLサーバーを処理するために、同じページを割り当てます。しかし、トランザクションの完了後、同じようなトランザクションが発生する可能性があることを期待して、これらは突然解放されません。これはスペースを保持します。

手順1:最初に、データベースクエリのチェックポイントでこのコマンドを実行します

手順2:データベースを右クリックしますタスク>バックアップバックアップタイプとしてトランザクションログを選択しますバックアップデータ(.bak)を保持するために宛先アドレスとファイル名を追加します

このステップをもう一度繰り返し、この時点で別のファイル名を指定します

ここに画像の説明を入力してください

ステップ3:データベースに移動するデータベースを右クリックします

[タスク]> [縮小]> [ファイル] [ファイルの種類]として[ログの縮小]アクションを選択し、未使用の領域を解放します。

ここに画像の説明を入力してください

ステップ4:

SQL 2014でログファイルを通常確認します。これは次の場所にあります。

C:\ Program Files \ Microsoft SQL Server \ MSSQL12.MSSQL2014EXPRESS \ MSSQL \ DATA

私の場合、28 GBから1 MBに減少しました


2

これを試して:

USE DatabaseName

GO

DBCC SHRINKFILE( TransactionLogName, 1)

BACKUP LOG DatabaseName WITH TRUNCATE_ONLY

DBCC SHRINKFILE( TransactionLogName, 1)

GO 

TRUNCATE_ONLYはSQL Serverの現在のバージョンではオプションではなくなり、サポートしているバージョンでは推奨されません(レイチェルの回答を参照)。
アーロンベルトラン

MSSQL Server 2005 Standard Editionを使用して動作します
bksi '21 / 01/14

2

データベース→ プロパティを右クリック→ファイル→別の名前の別のログファイルを追加し、パスを別のファイル名の古いログファイルと同じに設定します。

データベースは、新しく作成されたログファイルを自動的に取得します。


1
  1. バックアップDB
  2. DBを切り離す
  3. ログファイルの名前を変更
  4. DBを接続します(名前を変更した.ldf(ログファイル)を削除しながら添付します)。DBを選択し、[削除]ボタンを押して削除します)
  5. 新しいログファイルが再作成されます
  6. 名前を変更したログファイルを削除します。

これは機能しますが、最初にデータベースのバックアップを取ることをお勧めします。


1

他のいくつかの回答は私にとってうまくいきませんでした:トランザクションログがいっぱいだったため(皮肉なことに)、データベースがオンラインのときにチェックポイントを作成できませんでした。ただし、データベースを緊急モードに設定した後、ログファイルを圧縮できました。

alter database <database_name> set emergency;
use <database_name>;
checkpoint;
checkpoint;
alter database <database_name> set online;
dbcc shrinkfile(<database_name>_log, 200);

0

例:

DBCC SQLPERF(LOGSPACE)

BACKUP LOG Comapny WITH TRUNCATE_ONLY

DBCC SHRINKFILE (Company_log, 500)

DBCC SQLPERF(LOGSPACE)

TRUNCATE_ONLYはSQL Serverの現在のバージョンではオプションではなくなり、サポートしているバージョンでは推奨されません(レイチェルの回答を参照)。
アーロンベルトラン

この質問は、ヘルプセンターで定義されているStack Overflowのトピックではありません。そのような質問には答えないでください。代わりに、注意のためにそれらにフラグを立てる必要があり、それらは閉じられるか適切に移行されます。
Toby Speight

0

MSSQL 2017、SQLサーバー管理スタジオを使用するための、わずかに更新された回答。私は主にこれらの指示から行きましたhttps://www.sqlshack.com/sql-server-transaction-log-backup-truncate-and-shrink-operations/

最近のdbバックアップがあったので、トランザクションログをバックアップしました。それから、私はそれを十分にバックアップしました。最後に、ログファイルを縮小して、20Gから7MBに変更しました。これは、データのサイズにはるかに一致しています。2年前にインストールされてからトランザクションログがバックアップされたことはないと思います。そのため、そのタスクをハウスキーピングカレンダーに配置します。


-1

DBトランザクションログの最小サイズへの縮小

  1. バックアップ:トランザクションログ
  2. ファイルの縮小:トランザクションログ
  3. バックアップ:トランザクションログ
  4. ファイルの縮小:トランザクションログ

私はいくつかのDBでテストを行いました。このシーケンスは機能します。

通常は2MBに縮小されます。

またはスクリプトで:

DECLARE @DB_Name nvarchar(255);
DECLARE @DB_LogFileName nvarchar(255);
SET @DB_Name = '<Database Name>';               --Input Variable
SET @DB_LogFileName = '<LogFileEntryName>';         --Input Variable
EXEC 
(
'USE ['+@DB_Name+']; '+
'BACKUP LOG ['+@DB_Name+'] WITH TRUNCATE_ONLY ' +
'DBCC SHRINKFILE( '''+@DB_LogFileName+''', 2) ' +
'BACKUP LOG ['+@DB_Name+'] WITH TRUNCATE_ONLY ' +
'DBCC SHRINKFILE( '''+@DB_LogFileName+''', 2)'
)
GO

1
TRUNCATE_ONLYはSQL Serverの現在のバージョンではオプションではなくなり、サポートしているバージョンでは推奨されません(レイチェルの回答を参照)。
アーロンベルトラン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.