Tim*_*der 10 sql-server-2008 transaction-log
我现在正在成为一名在工作中有点不自觉的 DBA,真的需要一些帮助。
我们在完全恢复模式下有一个 40GB 的数据库,没有配置日志备份和一个 84GB 的巨大日志文件。到目前为止,我挽救这种情况的计划是在数据库上运行完整日志备份,缩小日志文件并制定维护计划,每晚使用数据库备份运行日志备份,以帮助控制它。
我的问题是我不希望日志文件缩小到零并在星期一的第一个早上不断增长。我对文件应该是什么(大约数据库的 20%)有一个粗略的估计,并希望从一开始就设置它以确保尽可能多的连续空间。这只是在数据库属性-> 文件下更改“初始大小”的情况吗?我也猜想数据库需要离线才能发生这种情况?
提前致谢
Mik*_*Fal 12
您的文件管理可以是完全在线的操作。您有两条路径,具体取决于您出于恢复目的而保留日志信息的需要:
不需要时间点恢复
SIMPLE
恢复。执行检查点以将事务写入磁盘。我还建议设置固定增长量和无限增长(以帮助更好地管理您的日志)。请注意,固定增长量在很大程度上取决于数量,我建议最初使用 1-2 GB,具体取决于日志预期会看到多少增长。理想情况下,您的日志不会增长太多,因此这不会产生太大影响。如果您的日志定期增长,您可能需要重新审视您的大小。
使用完成:
ALTER DATABASE [foo]
SET RECOVERY SIMPLE;
CHECKPOINT;
DBCC SHRINKFILE (foo_log,0);
ALTER DATABASE [foo]
MODIFY FILE (NAME=foo_log,SIZE=8000MB,MAXSIZE=UNLIMITED,FILEGROWTH=1000MB);
--Optional if you want the database in full recovery mode
--for point in time recovery going forward
ALTER DATABASE [foo]
SET RECOVERY FULL;
Run Code Online (Sandbox Code Playgroud)
需要时间点恢复
最大的问题是您无法将日志文件缩小到当前活动的 VLF 段之后。要查看这一点,您可以DBCC LOGINFO
在数据库上下文中使用。Status=2 的任何段都处于活动状态。要清除活动段,您需要在该段中当前没有活动事务时运行事务日志备份。你的步骤是:
使用完成:
BACKUP LOG [foo] TO DISK='<Location of t-log backup>';
DBCC SHRINKFILE (foo_log,0);
--Repeat the above until your log file is small "enough"
ALTER DATABASE [foo]
MODIFY FILE (NAME=foo_log,SIZE=8000MB,MAXSIZE=UNLIMITED,FILEGROWTH=1000MB);
Run Code Online (Sandbox Code Playgroud)
一些额外的资源来了解这里发生了什么:
只需缩小到您认为的最佳尺寸即可。不要使用 UI,只需执行此操作 - 假设 200 MB 是您的最佳大小:
USE yourdb;
GO
DBCC SHRINKFILE(yourdb_log, 200);
Run Code Online (Sandbox Code Playgroud)
如果您只对每天进行一次日志备份感兴趣,而对时间点恢复不感兴趣,那么您应该切换到简单恢复模式。这意味着日志备份是不必要的(实际上是不可能的),但日志的内容将自我管理。
如果您希望日志备份有意义,请不要计划在晚上进行完整备份,然后立即进行单个日志备份。这让您处于完全恢复模式,使日志工作非常努力,并且不会给您带来任何好处。因此,如果您想要时间点恢复,请以满足您的数据丢失容忍度的速率更频繁地运行日志备份。如果您不想丢失超过 15 分钟的数据,请每 15 分钟运行一次日志备份。
归档时间: |
|
查看次数: |
40431 次 |
最近记录: |