データベーステーブルの1つが誤って40GB増加するという問題がありました。データベースは、1つのプライマリと2つのレプリカを持つ可用性グループの一部です。余分なレコードを削除しようとしたときに、ログファイルのサイズを70 GBまで拡張しました(サイドノート:常に小さなバッチで削除してください)。これにより、プライマリとレプリカでスペースの問題が発生し始めました。 VMのドライブをライブで拡張し、レプリケーションが完了するのを待つことで、それを乗り切ることができましたが、レコードが削除されたので、他のユーザーが使用できるように、データとログファイルの未使用の領域を再利用したいと思います。データベース。
可用性グループの一部であるデータベースにDBCC SHRINKFILEをどのように使用しますか?
Denis P.は基本的な AGのログファイルのサイズを変更するSQLスクリプト を作成したので、全体的なプロセスは次のとおりです。
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を超える未使用のデータとログファイルの領域を再利用するのに役立ちました。