クライアントのSQLサーバーには多くのデータベースがあります。これらのデータベースは開発中であるため、開発者は設計、リファクタリング、データ変更などを行うことができます。ほとんど変更されないデータベースがいくつかあります。私のクライアントは、それらすべてを安全に(バックアップして)保持し、環境の管理に時間を費やさなければなりません。(会社にはDB管理者の立場はありません。)長い議論の末、クライアントは復元が容易なため、毎日の完全バックアップ戦略を使用することにしました。
状況の概要は次のとおりです。
- データベースの数は毎日異なります。
- 変更されたデータベース(データや構造が変更されたことを意味します)はバックアップされます。
- 変更されていないデータベースはバックアップされません。
- ソリューションはデータベース構造に影響を与えません(要件に制限はありません)
- この「バックアップエンジン」は自動的に機能します。
主な問題:データベースが変更されたことを検出する方法。問題の最初の部分(DDLの変更)は、DDLトリガーを使用して解決できます。ただし、データの変更(DMLの変更)は問題です。DMLトリガーをすべてのデータベースのすべてのテーブルに適用して、変更(パフォーマンス、拡張オブジェクトの管理など)を追跡することはできません。バックアップエンジンは、すべての変更を追跡して、各データベースをバックアップ準備完了としてマークする必要があります。
変更データキャプチャはソリューションですが、重すぎるようです(SQL Server Enterprise Editionも必要です)。
別の方法は、データベースファイルの変更(サイズまたは最終変更時刻)を追跡することですが、正しく機能しません。データベースは、予約されたすべての空き領域を超えたときにサイズを変更でき、sp_spaceusedは解決策ではありません。
トレースは解決策ですが、パフォーマンスの問題を引き起こし、追加の管理が必要です。
他のデータベース管理オブジェクト(統計など)に影響を与えずに、実際のデータベース使用量を計算するソリューションはありますか?テーブルのサイズを変更しないテーブルのデータへの変更はトリガーされないことを認めました(私は思う)が、それは何もないよりはましです。本当にSQL Server 2008の直接または間接的なソリューションを探しています。
コメント、解決策、考えをお寄せいただきありがとうございます。
追加:
ソリューションは次のとおりです(Marianに感謝)。
Select
NextLSN = MAX(fn.[Current LSN])
,Databasename = DB_NAME()
from fn_dblog(NULL, NULL) fn
LEFT JOIN sys.allocation_units au
ON fn.AllocUnitId = au.allocation_unit_id
LEFT JOIN sys.partitions p
ON p.partition_id = au.container_id
LEFT JOIN sys.objects so
ON so.object_id = p.object_id
WHERE
(
(Operation IN
('LOP_INSERT_ROWS','LOP_MODIFY_ROW',
'LOP_DELETE_ROWS','LOP_BEGIN_XACT','LOP_COMMIT_XACT')
AND so.is_ms_shipped = 0)
OR
([Lock Information] like '%ACQUIRE_LOCK_SCH_M OBJECT%')
)