暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL面试问题│事务日志已满时如何解决错误?

原创 Pinal Dave 2020-04-21
1729

问题:事务日志已满时如何解决错误?

:这是我的客户在最近的《综合数据库性能运行状况检查》中询问的一个问题。答案很简单,但是我们将通过实际演示来理解这一点。

image.png

为了模拟这种情况,首先我创建了一个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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论