ミラーデータベースのトランザクションログファイルを圧縮できますか?


9

これは、プリンシパルデータベースのログファイルを圧縮できなかった理由に関する前の質問のフォローアップ質問です。

簡単に言うと、データベースミラーリングをセットアップしましたが、トランザクションログをバックアップしたジョブが再び実行されていることを忘れて、トランザクションログがほぼ60GBに増えました。

ミラーリングがセットアップされたため、このサイズの増加はミラーリングされたサーバーに複製され、最終的にすべてのディスク領域を占有し、ミラーデータベースを使用できなくなりました。

パーこの質問ミラーデータベースのトランザクションログのメンテナンスについて、あなたは鏡にログをバックアップすることはできませんが、ときに特異的に尋ねたコメントは、ミラーデータベース上の生い茂ったログファイルを縮小する方法について、コメントをすることを残っていました

これを行う1つの方法は、ミラー化されたデータベースにフェールオーバーし、そこで縮小することです。これを非本番環境で徹底的にテストして、期待どおりの動作が期待できることを確認してください。

これは、ミラー上のログファイルを圧縮する他の方法が存在する可能性があることを示唆しているようであり、この方法は、必ずしも運用サーバーで安全に実行できるとは限りません。

データベースミラー上のトランザクションログファイルを安全に縮小する方法はありますか?


2
サポートされている唯一の方法は、プリンシパルのファイルを縮小することです。これにより、ミラーのファイルも縮小されます。ミラーがプリンシパルと同じではなくなった場合、ミラーへのフェイルオーバーを実際に試みたくありません。前の質問で言ったように、ミラーリングを解除して再作成します。
Max Vernon

回答:


6

DBCC SHRINKFILEコマンドは、ミラーリングされたデータベースに校長からミラーリングされます。ここにいくつかの証拠があります。

プリンシパルにサンプルデータベースを作成します。

create database MirroredDb;
go

次のコマンドを使用して、バックアップから同じデータベースを作成しますNORECOVERY

restore database MirroredDb
from disk = '\\backupdir\MirroredDb.bak'
with norecovery;
go

どちらの方法を選択しても、ミラーリングセッションをセットアップします。

上のプリンシパルデータベースのデータベースファイルのサイズを見て:

use MirroredDb;
go

select
    name,
    size
from sys.database_files;

結果セットは次のようになります。

name            size
MirroredDb      392
MirroredDb_log  104

上のミラーデータベース、スナップショットを作成し、同じ情報を見て:

create database MirroredDbss
on
(
    name = 'MirroredDb',
    filename = 'c:\sqlserver\MirroedDb.ss'
)as snapshot of MirroredDb;

use MirroredDbss;
go

select
    name,
    size
from sys.database_files;

結果セットは次のようになります。

name            size
MirroredDb      392
MirroredDb_log  104

次に、プリンシパルデータベースのトランザクションログファイルを大きくします(1 GBにしました)。

alter database MirroredDb
modify file
(
    name = MirroredDb_log,
    size = 1GB
);
go

見てみると、プリンシパルデータベースのトランザクションログのサイズ、我々は今、調整のサイズを参照してください。

use MirroredDb;
go

select
    name,
    size
from sys.database_files;

結果セットは次のようになります。

name            size
MirroredDb      392
MirroredDb_log  131072

ミラーリングされたデータベースに別のスナップショットを作成し、そこでトランザクションログファイルのサイズを確認します。

create database MirroredDbss2
on
(
    name = 'MirroredDb',
    filename = 'c:\sqlserver\MirroedDb2.ss'
)as snapshot of MirroredDb;

use MirroredDbss2;
go

select
    name,
    size
from sys.database_files;

結果セットは次のようになります。

name            size
MirroredDb      392
MirroredDb_log  131072

次にDBCC SHRINKFILEプリンシパルでを実行します。

use MirroredDb;
go

dbcc shrinkfile('MirroredDb_log', 0);
go

select
    name,
    size
from sys.database_files;

私の結果セットは次のとおりです:

name            size
MirroredDb      392
MirroredDb_log  104

ミラーリングされたデータベースに3番目の最後のスナップショットを作成し、サイズを確認します。

create database MirroredDbss3
on
(
    name = 'MirroredDb',
    filename = 'c:\sqlserver\MirroedDb3.ss'
)as snapshot of MirroredDb;

use MirroredDbss3;
go

select
    name,
    size
from sys.database_files;

そして、私は次の結果セットを取得します:

name            size
MirroredDb      392
MirroredDb_log  104

ここでわかるように、DBCC SHRINKFILEコマンドは実際にはミラーデータベースにミラーリングされます。


ログファイルのサイズもプリンシパルサーバーからコピーされたことに気付かなかったので、ありがとうございます。しかし、トランザクションログのサイズが原因でミラーが機能しない場合、ミラーを削除して再作成する唯一の解決策はありますか?ミラーリングプロセスが機能していないときに、ミラーログを安全に圧縮する方法はありませんか?
レイチェル

ミラーリングされたデータベースに接続できないため、データベースDBCC SHRINKFILE上で実行できません。そのデータベースのミラーリングを削除せずにミラーセッションを修正できるかどうかについては、そこで行う必要のあるもう少しの調査があります。ファイルサイズの関係で中断されたようです。パートナーを再開してみましたか?
トーマス・ストリンガー

はい、しかしすぐに一時停止に戻りました。ミラーリングが停止してから時間が経過しすぎたため、「ログファイルの縮小」の部分に到達する前に、まだ大量のデータを転送する必要があるためと考えられます。ミラーデータベースから実行してファイルを圧縮したり、ファイルシステムを操作したりといった、気付かなかった他の方法があることを願っていましたが、そうではありません。あなたの答えはまだとても役に立ちますので、よろしくお願いします:)
Rachel

もう望みません。データベースが一時停止/切断され、ログバックアップがプライマリで実行されると、再初期化せずにミラーを同期状態に戻すことにかなり夢中になります。
Jason Cumberland
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.