我试图了解为什么下面的代码写入日志文件。我是初学者,已经读到,当数据库处于简单恢复模式时,不会写入日志。但下面的代码是在 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/