问题:事务日志已满时如何解决错误?
答:这是我的客户在最近的《综合数据库性能运行状况检查》中询问的一个问题。答案很简单,但是我们将通过实际演示来理解这一点。

为了模拟这种情况,首先我创建了一个TestDB并限制了文件的增长。
CREATE DATABASE [TestDB]
ON PRIMARY
( NAME = N'TestDB', FILENAME = N'D:\TestDB.mdf' ,
SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB )
LOG ON
( NAME = N'TestDB_log', FILENAME = N'D:\TestDB.ldf' ,
SIZE = 8192KB , MAXSIZE = 8192KB , FILEGROWTH = 8192KB )
GO
您可以看到,在上面的脚本中,我已经提到了日志文件的最大大小不会超过8 MB。
现在,让我们在该数据库中创建并填充虚拟数据,并查看数据库填充日志文件时的反应。
[SQL]创建表FirstIndex(ID INT,
名字VARCHAR(100),
姓氏VARCHAR(100),
城市VARCHAR(100))
GO [/ sql]
接下来,我们将使用大于8 MB的数据填充该表。
[SQL] INSERT INTO FirstIndex(ID,FirstName,LastName,City)
SELECT TOP 1000000 1,
“ Bob”,
“ Brown”,
“ Houston”
来自sys.all_objects a
交叉联接sys.all_objects b
GO [/ sql]
当您运行上面的语句时,它将给您以下错误:
消息9002,级别17,状态4,第1行
由于“ ACTIVE_TRANSACTION”,数据库“ TestDB”的事务日志已满。
这是因为我们的日志文件仅限于8 MB,而我们要插入的数据大于8 MB。原因是,由于我们想模拟类似的情况(当日志文件无限制增长且磁盘空间有限时),因此我将日志文件限制为8 MB。当磁盘空间不足时,通常可能会出现此错误。
解决方案:T-Log获得完整
解决方法非常简单。
选项1:如果可能,可以通过删除增长限制来增加磁盘上的日志文件。
选项2:如果日志文件已满,则最好进行日志备份并清理日志文件。但是,如果您的事务仍然大于日志文件上的可用空间,则此方法将无效。
选项3:您可以尝试将恢复模式更改为简单模式,然后重试事务,但是,此解决方案的成功率很低,并且有可能冒着整个备份策略的风险。在所有选项用尽之前,请不要执行此操作。
选项4:在另一个磁盘上添加另一个日志文件,然后再次运行事务。事务完成后,您可以按照选项1或选项2清理事务日志。您可以按照指示在此处添加新文件:SQL SERVER –多个日志文件到数据库–不需要。
USE [master]
GO
ALTER DATABASE [TestDb] ADD LOG FILE ( NAME = N'NewLog', FILENAME = N'C:\NewLog.ldf')
GO
一旦添加了另一个日志文件并尝试再次运行该事务,您将看到它运行正常。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




