少し混乱しています。 SQL 2012でTRUNCATEONLY
パラメータが変更されましたか、それともSQL 2008 R2のドキュメントが間違っていますか?
2008 R2
ファイルの末尾にあるすべての空き領域をオペレーティングシステムに解放しますが、ファイル内のページ移動は実行しません。データファイルは、最後に割り当てられたエクステントにのみ縮小されます。 target_percentは、TRUNCATEONLYとともに指定された場合は無視されます。
TRUNCATEONLYはデータファイルにのみ適用されます。ログファイルは影響を受けません。
最後のステートメントは、これがログファイルにまったく影響しないことを私に教えますか?
2012
ファイルの末尾にあるすべての空き領域をオペレーティングシステムに解放しますが、ファイル内のページ移動は実行しません。データファイルは、最後に割り当てられたエクステントにのみ縮小されます。 target_percentは、TRUNCATEONLYとともに指定された場合は無視されます。
TRUNCATEONLYはログファイルに影響します。データファイルのみを切り捨てるには、DBCC SHRINKFILEを使用します。
最後のステートメントは、ログファイルにのみ影響することを教えてくれますか?
機能が変更されたか、ドキュメントにエラーがあるか、または私の解釈が間違っているか?
TRUNCATEONLYは、2008年のLOGファイルとDATAファイルの両方に影響します。SQLServer 2012のBOLでは、メッセージは、データベースファイルを圧縮するだけの場合は、データまたはログのいずれかを圧縮できるDBCC SHRINKFILEを使用する必要があることを示します。ファイル。
2008の場合、TRUNCATEONLYはDATAファイルにのみ影響することが明確に示されています。
テストしてみましょう。 TRUNCATEONLY
をSHRINKDATABASE
とともに使用して何が起こるかを視覚化するために、ローカルにインストールしたperformance
と呼ばれるデータベースに何が起こったかの概要を示します。
_SELECT @@VERSION;
Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64)
Jun 28 2012 08:36:30
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
USE performance;
_
トランザクションログ内でピークを取得するためだけに_DBCC LOGINFO
_を実行したところ、約200が経過した後、すべての仮想ログファイルが非アクティブ、ステータス= 0であることがわかりました。パフォーマンスデータベースでは、非アクティブVLFはすべて切り捨てられ、領域OSに戻すことができます。
以下は、LOGINFOからの出力例です。
_FileId FileSize StartOffset FSeqNo Status Parity CreateLSN
------ -------- ----------- ------ ------ ------ -----------------
2 253952 8192 23 2 64 0
2 253952 262144 24 2 64 0
2 270336 516096 25 2 64 24000000013400005
_
次にDBCC SQLPERF(LOGSPACE)
を実行し、次の出力を取得しました
_DBCC SQLPERF(LOGSPACE)
/*
Database Name Log Size (MB) Log Space Used (%) Status
Performance 9870,867 3,395626 0
*/
_
次に走った
_DBCC SHRINKDATABASE(PERFORMANCE, truncateonly)
_
次の結果を得た
_/*
DbId FileId CurrentSize MinimumSize UsedPages EstimatedPages
8 1 66464 288 44944 44944
8 2 116584 72 116584 72
*/
_
次に、再実行しました
_DBCC SQLPERF(LOGSPACE)
_
そして得た
_/*
Database Name Log Size (MB) Log Space Used (%) Status
Performance 910,8047 37,08699 0
*/
_
SHRINKDATABASE
with TRUNCATEONLY
は、トランザクションログファイルからOSに戻せる9 GBの使用可能なスペースを返しました。
_performance2
_という別のデータベースで同じ実験を試みました
_sp_spaceused
/*
Performance2 52.19 MB 22.81 MB
*/
DBCC SHRINKDATABASE(Performance2, truncateonly)
sp_spaceused
/*
database_name database_size unallocated space
Performance2 31.13 MB 21.13 MB
*/
_
これはOSに20 MBを返しました。 SQL Server 2008を使用すると、_SHRINKDATABASE TRUNCATEONLY
_はデータとトランザクションログファイルの両方を圧縮します。
スクラッチデータベースを使用してテストしたところ、TRUNCATEONLYオプションを使用すると、データファイルとログファイルの両方が縮小されました。
彼らが明確にしようとしていることは、TRUNCATEONLYオプションがデータファイルを圧縮するときの動作を変更することです(つまり、データページを再配置せず、最後に未使用のスペースを切り捨てる)が、ログファイルは普通に縮む。
オプションの私の理解が正しい場合、これはおそらくそれを説明するより良い方法です:
TRUNCATEONLYオプションを使用すると、ログファイルは通常どおり縮小されます。このオプションは、データファイルを圧縮するときの動作にのみ影響します。データファイルのみを切り捨てるには、DBCC SHRINKFILEを使用します。