sql-server - 日志文件随着简单恢复模式而增长

标签 sql-server sql-server-2012

我试图了解为什么下面的代码写入日志文件。我是初学者,已经读到,当数据库处于简单恢复模式时,不会写入日志。但下面的代码是在 FULL 和 SIMPLE 恢复模式下编写的。在什么情况下,日志文件会以简单恢复模式写入?

代码:

Declare @val int =1
set nocount on

BEGIN TRAN
while @val <= 100000
begin
    insert into LoadTable values (REPLICATE('P',1000))
    set @val = @val + 1
end
ROLLBACK TRAN

最佳答案

首先,您认为当数据库处于简单恢复模式时不会向日志文件写入任何内容,这是错误

SQL Server 在所有恢复模式下都会写入日志文件,唯一的区别是在简单恢复模式下,它会自动回收日志空间(如果可以的话),并记录最少的内容以维护事务(以防万一您必须回滚)一)。

而在完全恢复模式下,我们必须进行事务日志备份,以便为 SQL Server 提供可用空间以重复使用以进行进一步的日志记录。

现在回到你的例子:

Declare @val int =1
set nocount on

BEGIN TRAN                --<-- Your Transaction starts here 
while @val <= 100000
begin
    insert into LoadTable values (REPLICATE('P',1000))
    set @val = @val + 1
end
ROLLBACK TRAN             --<-- Your Transaction ends here 

在您的示例中,在事务开始之后和结束(回滚/提交)之前,正在进行大量事件,SQL Server 需要记录此事件,以防万一您决定回滚事务,就像你这样做了,因此越来越多的日志将被写入日志文件,直到事务完成(提交或回滚)。

在这个特定的示例中,sql server 必须保留 100000 个插入语句的日志,以防出现问题。

<小时/>

您的查询的另一个略有不同的版本可能是...

Declare @val int =1
set nocount on


while @val <= 100000
begin

    BEGIN TRAN        --<-- Your Transaction starts here

      insert into LoadTable values (REPLICATE('P',1000))

    ROLLBACK TRAN     --<-- Your Transaction Ends here         

    CHECKPOINT;

        set @val = @val + 1
end

现在,在同一个 t-sql 命令的这个略有不同的版本中,事务开始之后和完成之前发生的事件要少得多,因此 sql server 必须记录非常少的数据,并且事务文件将增长得非常少如果有的话。

在此示例中,sql server 一次只能保留 1 个插入语句的日志,因为它是在该点之后提交或回滚的。

关于sql-server - 日志文件随着简单恢复模式而增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38590066/

相关文章:

mysql - 如何使用 odbc for filemaker 将数据从 filemaker pro 移动到 microsoft sql server studio

mysql - 带限制条件的sql语句groupby

sql - 没有聚集索引的表

sql - 从表值参数中插入或更新或删除数据

sql - 我无法更改 SQL Server 浏览器的启动模式

t-sql - MS SQL Server 2008/2012 获取任意两个值之间的最小差异

sql-server - 为什么 SQL Server 不自动将 DATE 上转换为 DATETIME 以进行比较?

sql - 过滤第一笔交易高于阈值的用户

java - SQL Server : How to get "OUTPUT" from Insert on JAVA?

sql - 如何显示两个日期之间的小时和分钟