web-dev-qa-db-ja.com

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

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

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

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

この質問 ミラーデータベースのトランザクションログのメンテナンスについて、ミラーのログをバックアップすることはできませんが、具体的に コメント で大きくなりすぎた場合の縮小方法について質問された場合ミラーデータベース上のログファイル、 コメント

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

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

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

9
Rachel

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コマンドは、実際にはミラーデータベースにミラーリングされています。

6
Thomas Stringer