Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 限制SQL Server日志文件的增长率_Sql Server_Sql Server 2008_Sql Server 2008 R2_Sql Server 2012 - Fatal编程技术网

Sql server 限制SQL Server日志文件的增长率

Sql server 限制SQL Server日志文件的增长率,sql-server,sql-server-2008,sql-server-2008-r2,sql-server-2012,Sql Server,Sql Server 2008,Sql Server 2008 R2,Sql Server 2012,我有一个23亿行、76gb大小的大型数据库 我的问题是,我想将列类型转换为smalldatetime,但在此操作过程中,.ldf文件变得太大,占用了我的整个磁盘空间(高达350gb),然后查询错误退出 有没有办法使.ldf保持较小 我从选项中缩减了.ldf 数据库恢复模型设置为简单。添加类型为smalldatetime的新的可空列。然后慢慢地(例如,10-100k行的批处理)通过基于旧列值设置其值来填充该列。一旦所有行在新列中都有一个值,就删除旧列并将新列重命名为旧列名称 这将确保没有任何事务变

我有一个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

@里卡多:不,请不要打开自动收缩!不启用自动收缩功能;这将对您的数据库造成严重破坏。此外,在这方面,它不会影响LDF文件,因为它是一个单独的事务,使其不断增长。@Ricardo在发生异常事件(如此)时,您会收缩日志文件。这是你曾经做过的事。绝对没有理由打开自动收缩功能,或者关闭自动增长功能(这只是意味着查询将更快地消失)。是的,但在这种情况下,Agis不需要收缩日志,他需要首先阻止日志增长。对,这并不意味着关闭自动增长,这意味着执行操作时不会产生大量日志活动。上面的代码不起作用:(它仍然会填充日志文件并删除错误脚本运行时sys.databases中的
log\u reuse\u wait\u desc
值是多少?(请几分钟后检查)。请尝试在每次提交后插入检查点。通过搜索我提到的标识符,您可以自己找到检查点。另外请注意,您需要一个
WHERE[time2]update语句中的谓词为NULL,否则它只会一次又一次地更新相同的行,永远不会完成作业。即使如此,它也不应该填充日志,因为您正在正确批处理它。