Sql server 为什么我的日志文件需要sql server中物理表的3倍大小

Sql server 为什么我的日志文件需要sql server中物理表的3倍大小,sql-server,database,database-administration,Sql Server,Database,Database Administration,我有一个大约6亿条记录的表,表大小约为45 GB。我刚刚启动了一个查询,向其中添加另一个bigint列,即存储大约需要4GB,即 4GB = 600 Million * 8bytes 此表上没有索引。那么为什么这个操作会占用日志文件上150GB的空间呢 这是我的垃圾数据,我正在对其进行处理,以了解不同操作的影响 我正在寻找此问题的原因和解决方案。当您添加一列时,必须更改包含该表数据的每个页面,并且必须记录每个更改,以便在需要时回滚 看 同时阅读莱克斯的答案 添加列时,必须更改包含该表数据的每个

我有一个大约
6亿条记录的表
,表大小约为
45 GB
。我刚刚启动了一个查询,向其中添加另一个
bigint
列,即存储大约需要4GB,即

4GB = 600 Million * 8bytes
此表上没有索引。那么为什么这个操作会占用日志文件上150GB的空间呢

这是我的垃圾数据,我正在对其进行处理,以了解不同操作的影响


我正在寻找此问题的原因和解决方案。

当您添加一列时,必须更改包含该表数据的每个页面,并且必须记录每个更改,以便在需要时回滚


同时阅读莱克斯的答案

添加列时,必须更改包含该表数据的每个页面,并且必须记录每个更改,以便在需要时回滚

同时阅读莱克斯的答案 此外,如果您处于完全恢复模式(与简单恢复模式相反),则事务日志仅在事务日志备份后清理。完整备份将允许清理事务日志,在这种情况下显式收缩或截断日志将有帮助。您希望将事务日志备份设置为在I/O性能允许的情况下尽可能频繁地进行,这可能是错误的。简单的恢复模式避免了这个问题(完全备份确实会做任何事情),但是你失去了做点及时恢复的能力。

< P>你可以考虑使用这种改变…在更改之前打开它,然后在更改之后返回常规日志记录。在低使用时间或(首选)计划停机时间内进行更改


此外,如果您处于完全恢复模式(与简单恢复模式相反),则事务日志仅在事务日志备份后清理。完整备份将允许清理事务日志,在这种情况下显式收缩或截断日志将有帮助。您希望将事务日志备份设置为在I/O性能允许的情况下尽可能频繁地进行,这可能是错误的。简单的恢复模式可以避免此问题(完全备份真的可以解决所有问题),但您将失去执行时间点恢复的能力。

在执行此操作之前,日志有多大。我的猜测是,您没有运行简单恢复,而且从未备份/截断日志。在这种情况下,它们将无限制地增长。是的,我从未备份过数据库。在触发这个
alter语句之前
我使用了
DBCC SHRINKFILE
将空间缩小到100MB。我应该截断日志而不是收缩日志吗?我的数据库正在
完全恢复模式下运行
。在执行此操作之前,日志有多大。我的猜测是,您没有运行简单恢复,而且从未备份/截断日志。在这种情况下,它们将无限制地增长。是的,我从未备份过数据库。在触发这个
alter语句之前
我使用了
DBCC SHRINKFILE
将空间缩小到100MB。我应该截断日志而不是收缩日志吗?我的数据库在
完全恢复模式下运行
。OP说数据库从未备份过。在这种特殊情况下,恢复模型并不重要,它的行为总是像在简单模型中一样。否则就不可能收缩日志文件。尽管如此,由于添加列在事务中运行,整个操作都会被完全记录,因此即使在简单的模型中,您也可以得到一个相当大的日志文件。OP说,数据库从未备份过。在这种特殊情况下,恢复模型并不重要,它的行为总是像在简单模型中一样。否则就不可能收缩日志文件。尽管如此,由于添加列在事务中运行,所以整个操作都会被完全记录,所以即使在简单的模型中,您也可以获得相当大的日志文件。