我的客户端的SQL服务器上有很多数据库。这些数据库正在开发中,因此开发人员可以设计,重构,进行数据修改等。有些数据库很少更改。我的客户必须确保所有人(备份)的安全,并花一些时间来管理环境。(该公司没有数据库管理员的职位。)经过长时间的讨论,由于易于还原,客户决定使用每日完全备份策略。
因此,这是情况的摘要:
- 数据库的数量每天都会变化。
- 更改的数据库(意味着数据和/或结构已更改)应备份。
- 未更改的数据库不得备份。
- 解决方案不得影响数据库结构(这不是限制性要求)
- 该“备份引擎”将自动工作。
主要问题:如何检测数据库已更改。问题的第一部分(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%')
)