我有一个包含 23 亿行和 76GB 大小的大型数据库。
我的问题是我想将列类型转换为smalldatetime
但在此操作期间 .ldf 文件变得如此之大以至于占用了我的整个磁盘空间(它达到了 350gb)然后查询退出并出现错误。
有什么办法可以让 .ldf 变小吗?
我从选项中缩小了我的 .ldf。
数据库恢复模式设置为简单。
我有一个包含 23 亿行和 76GB 大小的大型数据库。
我的问题是我想将列类型转换为smalldatetime
但在此操作期间 .ldf 文件变得如此之大以至于占用了我的整个磁盘空间(它达到了 350gb)然后查询退出并出现错误。
有什么办法可以让 .ldf 变小吗?
我从选项中缩小了我的 .ldf。
数据库恢复模式设置为简单。
添加一个新的 smalldatetime 类型的可为空列。然后慢慢地(例如,10-100k 行的批次)通过根据旧列值设置其值来填充该列。一旦所有行在新列中都有值,删除旧行并将新行重命名为旧行名称。
这将确保没有事务变得大到足以严重影响您的日志文件。
这是最终代码:我现在运行它,所以明天我会知道它是否 100% 好,但它似乎可以工作
WHILE (2 > 1)
BEGIN
BEGIN TRANSACTION
UPDATE TOP ( 10000 ) [ais].[dbo].[imis position report]
SET [time2] = convert(smalldatetime, left(date, 19))
IF @@ROWCOUNT = 0
BEGIN
COMMIT TRANSACTION
BREAK
END
COMMIT TRANSACTION
-- 1 second delay
WAITFOR DELAY '00:00:01'
END -- WHILE
GO