收缩事务日志文件时偶尔会出错

Dav*_*cia 3 sql-server-2008 sql-server maintenance

我有一个每小时运行一次的事务备份作业。

首先它将数据库日志备份到另一个驱动器,然后缩小日志并删除旧.trn文件。

维修工作

中间任务使用以下代码缩小日志文件:

USE myDB
DBCC SHRINKFILE('myDB_LOG', 0, TRUNCATEONLY)
Run Code Online (Sandbox Code Playgroud)

但是,有时我会收到以下错误。

说明:执行查询“USE myDB DBCC SHRINKFILE('myDB_LOG'...”失败并出现以下错误:“备份、文件操作操作(例如 ALTER DATABASE ADD FILE)和数据库上的加密更改必须序列化。重新发出当前备份或文件操作操作完成后的语句。将数据库上下文更改为“myDB”。”。可能的失败原因:查询问题、“ResultSet”属性设置不正确、参数设置不正确或连接未正确建立。 End Error DTExec: The package execution returns DTSER_FAILURE (1). Started: 22:00:19 Finished: 22:04:17 Elapsed: 238.26 seconds. The package execution failed. The step failed.

为什么会这样?

有没有更好的方法来备份和收缩数据库日志?

Sha*_*nky 7

进行事务日志备份后无需运行shrinkfile 命令。缩小最终会再次增长的日志文件有什么需要?考虑到您每天都在这样做,我认为这是一个错误。

每当日志文件增长时,事务都必须等待此事件完成,因此 SQL Server 在此增长发生之前变得静止,并且考虑到日志文件没有即时文件初始化的事实,这些增长事件需要时间才能完成,反过来妨碍性能。

关于错误信息

必须对数据库上的备份、文件操作操作(例如 ALTER DATABASE ADD FILE)和加密更改进行序列化。当前备份或文件操作完成后重新发出语句

这意味着您试图在数据库上运行某些备份操作时运行 dbcc shrinfile 命令。它可以是任何备份完整、差异和事务日志。所有这些消息都是说请在备份操作完成后尝试运行 shrikfile 命令。现在您必须找到当时正在运行的备份。查看 errrlog 或 msdb 作业历史记录,您可以找到更多详细信息。

如果您参考BOL

在数据库或事务日志备份期间无法运行的操作包括:

• 文件管理操作,例如带有 ADD FILE 或 REMOVE FILE 选项的 ALTER DATABASE 语句。

• 收缩数据库或收缩文件操作。这包括自动收缩操作。