我客户的 SQL 服务器上有很多数据库。这些数据库正在开发中,因此开发人员可以进行设计、重构、数据修改等。有一些数据库很少更改。我的客户必须确保所有这些都安全(备份)并花一些时间管理环境。(公司没有DB管理员职位。)经过长时间的讨论,客户决定使用每日完整备份策略,因为恢复容易。
所以这里是情况的总结:
主要问题:如何检测数据库已更改。问题的第一部分(DDL 更改)可以通过使用DDL 触发器来解决。但是数据更改(DML 更改)是一个问题。不可能将 DML 触发器应用于所有数据库的所有表以跟踪更改(性能、扩展对象的管理......)。备份引擎必须跟踪所有更改以将每个数据库标记为准备备份。
Change Data Capture是一个解决方案,但它似乎太重了(它还需要 SQL Server 企业版)。
另一种方法是跟踪数据库文件更改(大小或上次更改时间),但它无法正常工作:当数据库超过所有保留的可用空间时,它可以更改其大小,而sp_spaceused不是解决方案。
跟踪是一种解决方案,但它会导致性能问题并需要额外的管理。
是否有任何解决方案可以在不影响其他数据库管理对象(如统计信息..)的情况下计算实际数据库使用大小?当然,对不改变表大小的表数据的更改不会触发(我认为),但总比没有好。我真的在寻找 SQL Server 2008 的直接或间接解决方案。
感谢您的任何评论、解决方案和想法。
添加:
这是解决方案(感谢玛丽安):
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 …Run Code Online (Sandbox Code Playgroud) MySQL 5.6.23,InnoDB
我正在使用LOAD DATA INFILEcommnd从字符分隔的文本文件中加载表格,我希望每个带有 a 的字段(此设置中\N的NULL字符)将 aNULL放在表格中。某些数字类型具有此行为,而其他数字类型将0. 我正在使用FIELDS TERMINATED BY并且某些列确实可以正确获取NULL值,因此它不是固定行格式问题。
这些是我在测试时观察到的类型:
INT插入NULL小号DECIMAL(x,0)插入NULL小号DECIMAL(x,y)插入0.0小号FLOAT插入0小号DOUBLE(x,y)插入0.0小号DOUBLE插入0小号所有有问题的列都用DEFAULT NULL. 我知道各种函数可以将这些0s 转换为NULLs。问题是是否有一种数据类型可以处理十进制精度并且还会NULL在加载时插入s。
此外,我看到了一大堆与对字符串、空字符串和空值之间的区别的误解有关的问题。(示例 示例 示例)这不是问题,因为NULL当我将其重新定义为 DECIMAL(x,0) 时,s 就在那里并且正确加载到同一列中,然后在定义为 DECIMAL(x,3) 时不正确。