缩小SQL Server 2008 R2后手动设置日志文件大小


10

目前正在成为某种非自愿的DBA,确实需要一些帮助。

我们在完全恢复模式下拥有40GB的数据库,未配置日志备份,并且拥有84GB的巨大日志文件。到目前为止,我要挽救这种情况的计划是在数据库上运行完整的日志备份,缩小日志文件,并发起维护计划,以每晚在数据库备份的情况下运行日志备份,以帮助使其处于受控状态。

我的问题是我不希望日志文件缩小到什么都不会花在星期一的第一个早晨不断增长。我对文件应该是什么(大约是数据库的20%)进行了粗略估计,并希望从一开始就进行设置,以确保尽可能多的连续空间。这仅仅是在数据库属性->文件下更改“初始大小”的一种情况吗?我猜想数据库是否需要脱机才能发生这种情况?

提前致谢


2
您打算每晚备份一次数据库,并每晚备份一次日志?也许您应该考虑使用简单的恢复模型,以便日志自行管理。
亚伦·伯特兰

Aaron,就灾难恢复恢复的观点,我同意您的看法,但是对于操作恢复,他们可能仍希望其恢复完整。不要忘记,即使他们每天仅执行一次日志备份,它仍然可以进行时间点恢复。
肯尼斯·费舍尔

1
@Kenneth,因此,如果您在午夜进行完整备份,然后在12:05进行日志备份,则我发现这很虚假。YMMV。
亚伦·伯特兰

@Aaron再次运行,所有操作正常,但除非我误会,否则可以使用前一晚的完整备份,并在12:05记录日志,并恢复到前一天的任何时间。同样,如果他们遇到问题,那么重新登录,从前一天晚上恢复并及时恢复到几分钟前也没什么大不了的。我并不是说他们应该保持完整,而只是说涉及的内容比灾难恢复的观点还多。话虽这么说,如果他们保持足够的状态,应该比每天一次更频繁地进行日志备份。
肯尼斯·费舍尔

2
@Kenneth,但是如果您每天只备份一次日志,那么这就是为什么它很大的原因!如果您需要恢复到昨天的12:07,则需要整天加载整个日志以恢复2分钟。不是很有用。
亚伦·伯特兰

Answers:


6

只需缩小到您认为的最佳大小即可。不要使用UI,只需执行此操作-假设200 MB是您的最佳大小:

USE yourdb;
GO
DBCC SHRINKFILE(yourdb_log, 200);

如果您只对每天进行一次日志备份感兴趣,而对时间点恢复不感兴趣,那么应该切换到简单的恢复模型。这意味着日志备份是不必要的(实际上是不可能的),但是日志的内容将自行管理。

如果您希望日志备份有意义,请不要计划在晚上进行完整备份,然后再进行一次日志备份。这样可以使您处于完整的恢复模式,使日志工作非常困难,并且不会给您带来任何好处。因此,如果要进行时间点恢复,请以满足数据丢失容忍度的速率更频繁地运行日志备份。如果您不想丢失超过15分钟的数据,请每15分钟运行一次日志备份。


谢谢你 我完全理解有关转向简单恢复模型的所有评论。不幸的是,这是我无法做出的决定,需要在多个官僚机构中进行。当然,这是我会建议的。
蒂姆·亚历山大

12

您的文件管理可以是完全在线的操作。您有两条路径,具体取决于您出于恢复目的保留日志信息的需要:

不需要时间点恢复

  1. 将数据库转换为SIMPLE恢复。执行检查点以将事务写入磁盘。
  2. 展平日志。
  3. 将日志大小调整为适当的大小。

我还建议设置固定的增长量和无限制的增长(以帮助更好地管理日志)。请注意,固定增长量很大程度上取决于它的数量,我建议最初使用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;

需要时间点恢复

最大的困扰是您无法将日志文件缩小到当前活动的VLF段之外。要看到这一点,可以DBCC LOGINFO在数据库上下文中使用。状态= 2的任何段均处于活动状态。要清除活动段,当该段中当前没有活动的事务时,您将需要运行事务日志备份。您的步骤是:

  1. 运行事务日志备份。
  2. 缩小文件。(理想情况下是扁平化的,但是如果您的数据库处于活动状态,这将很难做到)。
  3. 重复步骤1和2,直到您的日志大小合适为止,最好是尽可能地小。
  4. 将日志大小调整为适当的大小。

完成使用:

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);

一些其他资源可以了解此处的情况:


2

实际上,数据库不需要脱机即可收缩日志。我会说这可能是收缩日志是个好主意的少数情况之一。您可以设置初始大小,但是执行缩小并将缩小到特定大小会更容易。

USE [DBName]
GO
DBCC SHRINKFILE (N'LogName' , SizeInMg)
GO

您也可以通过使用GUI并使用第二个单选按钮和表明您希望日志的大小的复选框来完成此操作。您可以通过右键单击SSMS中的对象资源管理器中的数据库,选择任务,收缩文件来进入GUI。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.