【问题标题】:The transaction log for database is full due to 'LOG_BACKUP'由于“LOG_BACKUP”,数据库的事务日志已满
【发布时间】:2021-01-27 21:01:19
【问题描述】:

我们正在删除一个数据库(例如 FirstDB)中的几个表,并将大约 93,357 行(一次一行)插入到另一个数据库(例如 SecondDB)的一个日志表中。

数据库恢复模型已满。

每行包含 6 列数据

[DeleteTime] [datetime] NULL,
[FilePath] [varchar](255) NOT NULL,
[DocumentID] [int] NULL,
[AnotherCol] [varchar](50) NULL,
[AnotherCol2] [varchar](50) NULL,
[AnotherCol3] [varchar](50) NULL,

在之前的插入中,当我们插入 153,000 行时,我们收到错误“数据库 'SecondDB' 的事务日志由于 'LOG_BACKUP' 而已满

避免在事务日志中占用大量空间的最佳方法是什么?

我应该为数据库 SecondDB 的每 1000 次插入提交事务吗?

这是从 FirstDb 中删除并插入 SecondDB 的代码

using (SqlConnection con = new SqlConnection(connectionString))
        {
            try
            {
                con.Open();
                SqlDataAdapter da = new SqlDataAdapter("spGetDocuments", con);
                DataSet ds = new DataSet();
                da.Fill(ds);
                foreach (DataRow aRow in ds.Tables[0].Rows)
                {
                    try
                    {
                        //Code to insert into FirstDB

                        //Code to insert into SecondDB
                        cmdSecondDB = new SqlCommand("spUpdateDeleteDocsLog", con);
                        cmdSecondDB.CommandType = CommandType.StoredProcedure;
                        cmdSecondDB.Parameters.Add(new SqlParameter("FilePath", sDocumentPath));
                        cmdSecondDB.Parameters.Add(new SqlParameter("DocumentID", aRow["DocumentID"]));
                        :
                        iRow = cmdSecondDB.ExecuteNonQuery();
                        cmdSecondDB.Dispose();
                        cmdSecondDB = null;
                    }
                }
                ds.Dispose();
                ds = null;
                da.Dispose();
                da = null;
                con.Close();
            }               
        }

另外,有没有办法计算出上述6行数据中的93357行会占用多少事务日志?

谢谢

【问题讨论】:

  • 您将交易保持打开的时间过长,所以是的,您需要对其进行批处理。但是使用SqlBulkCopy 和SqlBulkCopyOptions.TableLock 会快得多。并设置您的参数类型和大小Parameters.Add("FilePath", SqlDbType.VarChar, 255).Value = sDocumentPath 或为批量复制设置列类型和大小。

标签: c# sql-server sql-server-2012 sql-insert bulkupdate


【解决方案1】:

数据库恢复模式已满。

那么唯一重要的是日志文件的大小和日志备份的频率。批处理不会导致写入更少的日志或允许在Full Recovery Model 下的下一次事务日志备份之前重用日志空间。

【讨论】:

  • 感谢您的回复,大卫。事务日志备份是在整点每 30 分钟和整点后每 30 分钟备份一次,例如在上午 7 点、上午 7:30、上午 8 点、上午 8:30 等。事务日志的大小已增加至 500 MB,自动增长 256 MB,限制为 2,097,152 MB。你认为我们会通过插入上述 6 列的 93,357 条记录来达到 Transaction Full 吗?
  • 在我们开始进程之前收缩事务日志文件是个好主意吗?而且,您是否建议我们在接近备份事务日志的时间开始该过程,例如关闭到早上 7 点,以便在该过程进行时备份(并截断)事务日志。
  • 你永远不应该缩小事务日志,只要让它大到足以容纳在你最忙的时间生成的所有日志记录。
猜你喜欢
  • 2014-02-09
  • 2020-05-09
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2013-07-14
  • 1970-01-01
  • 2017-11-20
相关资源
最近更新 更多