我是数据库管理的初学者,所以请耐心等待。我有一个 500MB 的小型 DB 和一个非常大的事务日志 (19GB)。我想把它保持在“完全恢复”模式,所以请不要建议“简单”恢复模式。
我一直在研究如何减少事务日志的大小,我正在尝试实施这些建议,但日志大小没有改变。
首先,我的工作是:我有一个每日备份任务,在维护计划中备份所有数据库。这是一种“完整”备份类型,并且似乎运行良好。我看到每天备份一个文件,类似于数据库本身的大小。
现在我有了完整备份,我继续进行手动“事务日志”类型的备份,其中包含“截断事务日志”选项。
备份在几秒钟内完成,创建一个大小为几兆字节的文件,但事务日志的大小保持不变。
我究竟做错了什么?
您的事务日志备份正在截断日志,因为它在现有日志文件中为更多事务腾出空间。如果要收缩日志文件,需要在 SSMS 中选择“收缩文件”选项。右键单击数据库以找到该选项。 如果你缩小到的文件大小不够大,根据你的数据库有多少事务以及你备份日志的频率,它会再次增长。您可能需要更频繁地运行日志备份以防止这种情况发生。
听起来您根本没有运行事务日志备份(除了您手动运行的一次)。如果是这样,这不仅是您的事务日志增长的原因,而且无论如何您都没有获得完全恢复的好处。请安排定期事务日志备份。(每小时将是一个好的开始。)
好的,首先要了解的是为什么日志文件是它的大小。你说数据是 500MB 你确定吗?与日志文件相比,这是一个非常小的数据文件。如果这是真的,那么日志就是它的大小是有原因的。
所以你必须弄清楚为什么......你一直在将数据运行到数据库中吗?是否有任何 ETL/DTS 进程在其中运行数据、重建索引等以及正在运行的大型事务?你检查过没有未提交的交易吗?(选择@@trancount)
您可以通过检查 log_reuse_wait 和 log_reuse_wait_desc 来检查 Log 的当前状态。
SELECT [log_reuse_wait_desc] FROM [master].[sys].[databases] WHERE [name] = N'Company';
在日志备份中捕获其所有日志记录之前,不能截断日志的非活动部分。这是维护日志链所需要的一系列日志记录,这些记录具有完整的日志序列号 (LSN) 序列。备份事务日志时会截断日志,假设存在以下情况:
1.自上次备份日志以来发生了检查点。检查点对于在完整恢复模式或大容量日志恢复模式下截断日志是必不可少的,但还不够。在一个检查点之后,日志至少在下一次事务日志备份之前保持不变。
2.没有其他因素阻止日志事务。
通常,通过定期备份,日志空间会定期释放以供将来使用。但是,各种因素(例如长时间运行的事务)可能会暂时阻止日志截断。
BACKUP LOG 语句未指定 WITH COPY_ONLY。
来源:https ://technet.microsoft.com/en-us/library/ms189085(v=sql.105).aspx
如果日志文件确实需要那个大小并且你缩小它,它只会再次增长,这本身就是一个代价高昂的过程,因为数据库正在写入日志并且需要文件增长,除非你有即时文件初始化对于 sql server 服务帐户,该进程将等待文件增长然后写入,如果对 GB 块执行此操作,您将有更大的问题需要处理。
因此,现在您需要查看数据库的活动,例如,如果您每天只运行一个日志备份,这对于数据库的活动可能还不够,在我的组织中,我每 15 分钟到每 1 小时进行一次备份在某些情况下,每 5 分钟在特定的 Db 上。这允许日志不会增长太多(日志已在某些服务器中预先调整大小)我们也在运行严格的 RTO/RPO。
现在正如 joeqwerty 所说,除非您在该框上对恢复点有严格的 SLA,否则它可能不值得以 FULL 或 BULK-Logged 运行,如果您所做的只是每天运行 FULL 备份和公司不在乎数据丢失,不要与之抗争,使用它。
如果您只关心日志的大小,而不关心转录点恢复,请备份日志并缩小它,然后切换到 Simple。
你说不建议简单恢复,但我认为你并不完全理解你在用完全恢复做什么。