【发布时间】:2019-06-08 18:14:45
【问题描述】:
为准确而编辑的术语:
我们的数据集市内每天都有大量数据流。一些最大的,由 SSIS 管理的存储过程完成,需要几个小时。这些长时间运行的存储过程正在阻止清除事务日志(这使问题更加复杂,因为我们同时运行了许多 SP,然后它们都写入 T 日志而没有截断)。最终这会破坏我们的数据库,我们不得不从早上的快照中恢复。
我们已经探索过在 SP 中执行“sub”-commits,但据我了解,您无法在活动存储过程中完全释放事务日志,因为它本身就是一个事务。
如果不重构我们的大型 SP 以分批运行或类似的效果,是否可以在活动 SP 中定期提交事务日志,以便我们释放事务日志上的锁定?
编辑/扩展:
也许我上面错了: 在 SP 中间歇性提交是否会导致事务日志被截断?
【问题讨论】:
-
不确定您在哪里听到的,但存储过程不是事务。您绝对可以将程序分解为多个单元以减轻事务日志的压力。
-
听起来你的调用代码一定是在开启交易
-
你们俩可能都是对的。但是我们肯定会被告知,我们长期运行的 SP 正在执行大型插入或表创建(这肯定是与 SP 的事务)正在锁定事务日志。我们尝试分批插入每个由
commit子句终止的子句,但这会引发破坏我们的 SSIS 作业的警告,而且我们不相信它正在释放事务日志。 -
日志备份开始时可能存在长时间运行的事务。在这种情况下,释放空间可能需要另一个日志备份。请注意,长时间运行的事务会在所有恢复模式下防止日志截断,包括简单恢复模式,在这种模式下,事务日志通常在每个自动检查点被截断。 docs.microsoft.com/en-us/sql/relational-databases/logs/…
-
默认情况下,SQL Server 使用自动提交事务,并且每个事务在每个语句之后提交。如果您发现情况并非如此,那么大概是 SSIS 将其包装在事务中。检查 SSIS 包中的
TransactionOption属性
标签: sql sql-server stored-procedures commit sql-server-2016