将列添加到表时,事务日志已满

时间:2012-12-18 17:10:30

标签: sql-server sql-server-2008

我有一个SQL Server 2008表,大约有150万条记录,我想添加另一个字段并编辑另一个字段。当我保存更改时,它会出错:

'Member' table
- Unable to modify table.  
The transaction log for database 'storeboard' is full. To find out why space in the log cannot be reused, see the log_reuse_wait_desc column in sys.databases

即使我清空了事务日志,它仍然会执行相同的错误。如何避免此问题并对我的表格进行必要的更改?

3 个答案:

答案 0 :(得分:1)

试试这个:

USE master ;
ALTER DATABASE YourDBName SET RECOVERY SIMPLE ;

答案 1 :(得分:0)

像“Nikita”建议的那样,您可以将恢复模式更改为简单,这样就不会在事务日志中跟踪更改...但是,如果这是一个生产数据库,则可能是您在play,或???,它要求使用事务日志将更改复制到另一台服务器......如果是这种情况,那么您需要了解导致事务日志填满的原因,以及如何在不禁用的情况下对其进行补救反式日志。

听起来您正在使用SSMS进行更改,而更改的性质要求SSMS:

  1. 从更改的表中删除所有外键,索引等
  2. 将表中的所有数据复制到#temp表
  3. 使用建议的更改创建新表
  4. 将#temp表中的所有数据复制到新创建的表
  5. 放下旧桌子
  6. 将新表重命名为旧表的名称
  7. 重新创建所有索引,外键等
  8. SSMS脚本在整个脚本中插入BEGIN TRANSACTIONCOMMIT TRANSACTION,这样如果出现问题,希望您的表和数据不会被破坏。但由于它还会在整个脚本中插入GO,因此错误可能会导致问题,尤其是因为它最后一件事情放弃原始表,然后将新创建的表重命名为原始表名。

    听起来好像在脚本运行之前事务日志已填满。如果您无法将生产数据库更改为简单的恢复模型(例如,因为它会破坏日志传送等),那么您需要以不会填满事务日志的方式运行脚本。< / p>

    我建议:

    1. 首先在dev / test服务器上构建并测试脚本,该脚本没有150万行,以确保脚本完全符合您的要求。
    2. 修改脚本并在关键位置添加COMMIT,以便在脚本继续运行时回收事务日志中的空间。
    3. 一次将100,000条记录从#temp表复制回新创建的表,每个块之间有COMMIT
    4. 在开发/测试服务器上再次测试修改过的脚本,然后再在生产中运行。
    5. 在运行脚本之前备份生产数据库...

答案 2 :(得分:0)

即使您为数据库使用SIMPLE恢复模型,SQL Server也会继续将每个事务写入事务日志。

假设您要添加一个datetime列,需要8个字节的存储空间。假设您的表有1.5 Mio记录,SQL Server将需要字面上8 * 1.5字节(+开销)来完成事务。所有的比特都被写入日志,没有办法阻止它。

如果您的方案(和/或策略)不需要任何时间点恢复,则可能是您的SIMPLE恢复模式。只需启用自动增长,为最大日志大小设置公平限制,并将auto-shrink切换为true

否则(即生产数据库,高度商业关键型应用程序等),您可能希望根据具有日志备份的FULL恢复模型制定适当的维护计划。有很多白皮书和文章。