web-dev-qa-db-ja.com

DBCC SHRINKDATABASE TRUNCATEONLY-2008R2と2012

少し混乱しています。 SQL 2012でTRUNCATEONLYパラメータが変更されましたか、それともSQL 2008 R2のドキュメントが間違っていますか?

2008 R2

ファイルの末尾にあるすべての空き領域をオペレーティングシステムに解放しますが、ファイル内のページ移動は実行しません。データファイルは、最後に割り当てられたエクステントにのみ縮小されます。 target_percentは、TRUNCATEONLYとともに指定された場合は無視されます。

TRUNCATEONLYはデータファイルにのみ適用されます。ログファイルは影響を受けません。

最後のステートメントは、これがログファイルにまったく影響しないことを私に教えますか?

2012

ファイルの末尾にあるすべての空き領域をオペレーティングシステムに解放しますが、ファイル内のページ移動は実行しません。データファイルは、最後に割り当てられたエクステントにのみ縮小されます。 target_percentは、TRUNCATEONLYとともに指定された場合は無視されます。

TRUNCATEONLYはログファイルに影響します。データファイルのみを切​​り捨てるには、DBCC SHRINKFILEを使用します。

最後のステートメントは、ログファイルにのみ影響することを教えてくれますか?

機能が変更されたか、ドキュメントにエラーがあるか、または私の解釈が間違っているか?

6
Peter

TRUNCATEONLYは、2008年のLOGファイルとDATAファイルの両方に影響します。SQLServer 2012のBOLでは、メッセージは、データベースファイルを圧縮するだけの場合は、データまたはログのいずれかを圧縮できるDBCC SHRINKFILEを使用する必要があることを示します。ファイル。

2008の場合、TRUNCATEONLYはDATAファイルにのみ影響することが明確に示されています。

テストしてみましょう。 TRUNCATEONLYSHRINKDATABASEとともに使用して何が起こるかを視覚化するために、ローカルにインストールした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_はデータとトランザクションログファイルの両方を圧縮します。

5
Craig Efrein

スクラッチデータベースを使用してテストしたところ、TRUNCATEONLYオプションを使用すると、データファイルとログファイルの両方が縮小されました。

彼らが明確にしようとしていることは、TRUNCATEONLYオプションがデータファイルを圧縮するときの動作を変更することです(つまり、データページを再配置せず、最後に未使用のスペースを切り捨てる)が、ログファイルは普通に縮む。

オプションの私の理解が正しい場合、これはおそらくそれを説明するより良い方法です:

TRUNCATEONLYオプションを使用すると、ログファイルは通常どおり縮小されます。このオプションは、データファイルを圧縮するときの動作にのみ影響します。データファイルのみを切​​り捨てるには、DBCC SHRINKFILEを使用します。

2
db2