我有一个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
即使我清空了事务日志,它仍然会执行相同的错误。如何避免此问题并对我的表格进行必要的更改?
答案 0 :(得分:1)
试试这个:
USE master ;
ALTER DATABASE YourDBName SET RECOVERY SIMPLE ;
答案 1 :(得分:0)
像“Nikita”建议的那样,您可以将恢复模式更改为简单,这样就不会在事务日志中跟踪更改...但是,如果这是一个生产数据库,则可能是您在play,或???,它要求使用事务日志将更改复制到另一台服务器......如果是这种情况,那么您需要了解导致事务日志填满的原因,以及如何在不禁用的情况下对其进行补救反式日志。
听起来您正在使用SSMS进行更改,而更改的性质要求SSMS:
SSMS脚本在整个脚本中插入BEGIN TRANSACTION
和COMMIT TRANSACTION
,这样如果出现问题,希望您的表和数据不会被破坏。但由于它还会在整个脚本中插入GO
,因此错误可能会导致问题,尤其是因为它最后一件事情放弃原始表,然后将新创建的表重命名为原始表名。
听起来好像在脚本运行之前事务日志已填满。如果您无法将生产数据库更改为简单的恢复模型(例如,因为它会破坏日志传送等),那么您需要以不会填满事务日志的方式运行脚本。< / p>
我建议:
COMMIT
,以便在脚本继续运行时回收事务日志中的空间。COMMIT
。答案 2 :(得分:0)
即使您为数据库使用SIMPLE恢复模型,SQL Server也会继续将每个事务写入事务日志。
假设您要添加一个datetime
列,需要8个字节的存储空间。假设您的表有1.5 Mio记录,SQL Server将需要字面上8 * 1.5字节(+开销)来完成事务。所有的比特都被写入日志,没有办法阻止它。
如果您的方案(和/或策略)不需要任何时间点恢复,则可能是您的SIMPLE恢复模式。只需启用自动增长,为最大日志大小设置公平限制,并将auto-shrink
切换为true
。
否则(即生产数据库,高度商业关键型应用程序等),您可能希望根据具有日志备份的FULL恢复模型制定适当的维护计划。有很多白皮书和文章。