web-dev-qa-db-ja.com

可用性グループを使用する場合のログとデータのDBCC SHRINKFILE

データベーステーブルの1つが誤って40GB増加するという問題がありました。データベースは、1つのプライマリと2つのレプリカを持つ可用性グループの一部です。余分なレコードを削除しようとしたときに、ログファイルのサイズを70 GBまで拡張しました(サイドノート:常に小さなバッチで削除してください)。これにより、プライマリとレプリカでスペースの問題が発生し始めました。 VMのドライブをライブで拡張し、レプリケーションが完了するのを待つことで、それを乗り切ることができましたが、レコードが削除されたので、他のユーザーが使用できるように、データとログファイルの未使用の領域を再利用したいと思います。データベース。

可用性グループの一部であるデータベースにDBCC SHRINKFILEをどのように使用しますか?

3
Greg Bray

Denis P.は基本的な AGのログファイルのサイズを変更するSQLスクリプト を作成したので、全体的なプロセスは次のとおりです。

  1. ログがセカンダリレプリカに送信されている間はファイルを圧縮できないため、レプリケーションが完了していることを確認してください
  2. データファイルとログファイルの新しいサイズを把握します。この情報を見つけるためのSQLスクリプトはたくさんありますが、データベースのプロパティまたはSSMSのファイル圧縮タスクウィザードを使用して、まだ使用されているスペースの量を把握できます。
  3. プライマリでは、以下のスクリプトを使用してファイルのサイズを変更します。有効になるには、複数の実行が必要になる場合があります。
  4. プライマリファイルのサイズが正しくなり、レプリケーションキューが安定したら、セカンダリでSQL Serverサービスを再起動して、それらのシステムで新しいファイルサイズを有効にする必要があります。

TSQLスクリプト:

--Run on primary to shrink db file to 10000 MB. May need to run multiple times.
DBCC SHRINKFILE (N'MyDatabaseName', 10000, NOTRUNCATE)
DBCC SHRINKFILE (N'MyDatabaseName', 10000)

--Check data file size
USE Master
SELECT DB_NAME(database_id) AS DatabaseName,
Name AS Logical_Name,
Physical_Name, (size*8)/1024 SizeMB
FROM sys.master_files
WHERE DB_NAME(database_id) = 'MyDatabaseName'
ORDER BY SizeMB DESC

--Once data file is resized and replication has finished, start resizing log file

--Sorted view of log file sizes and percent used
USE MyDatabaseName
Drop table IF EXISTS #tmplogs
CREATE TABLE #tmplogs (
  DatabaseName varchar(100)
  , LOGSIZE_MB decimal(18, 2)
  , LOGSPACE_USED decimal(18, 2)
  , LOGSTATUS decimal(18, 0)
)
INSERT INTO #tmplogs EXEC('DBCC SQLPERF(LOGSPACE);')
SELECT * from #tmplogs ORDER BY LOGSIZE_MB DESC, LOGSPACE_USED DESC


--Run on primary to shrink log file. You must take a backup of the log file before it can be truncated
BACKUP LOG MyDatabaseName TO DISK = '\\Backups\SQL\_Trans\My_AG\MyDatabaseName\MyDatabaseName_LOG_20170721_200008.trn' WITH NOFORMAT, INIT, NAME = N' Trn Backup', SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10
DBCC SHRINKFILE (N'MyDatabaseName_log' , 2000, NOTRUNCATE)
DBCC SHRINKFILE (N'MyDatabaseName_log' , 2000)

--Again this may require multiple executions to remove unused space
--Also the file size on the replicas may not decrease until the SQL Server service is restarted on those systems

そしてもちろん、完了したら、DBCC SHRINKFILEを使用するときに発生する可能性があるインデックスの断片化やその他のパフォーマンスの問題が発生する可能性があります。私たちの場合、これはパフォーマンスをあまり気にしない小さなデータベースであり、インデックスのメンテナンスを処理するジョブが毎週あるので、未使用のスペースを再利用します。

このスクリプトは、合計で250 GBを超える未使用のデータとログファイルの領域を再利用するのに役立ちました。

enter image description here

2
Greg Bray