【问题标题】:Virtual Machine SQL Log growing when adding fields添加字段时虚拟机 SQL 日志增长
【发布时间】:2022-12-01 01:21:58
【问题描述】:

我知道每个人都想在这个问题上换个角度看。如果您继续阅读,我将不胜感激。当然,当向大表中添加字段时,日志会增长。让我解释一下我最好的能力: 我们有一个部署给客户的数据库升级实用程序。在该实用程序中,我们使用特定于我们版本的更改来操作数据库。 我们的测试部门在本地与虚拟机和虚拟机与虚拟机之间看到了不同的结果。一些 VM 的日志增长不大,而其他 VM 增长了 30gb。数据库设置为 SIMPLE。 “技术上”不应使用事务日志。我知道日志被用作缓存,直到光盘有足够的空间来接受请求的更改。我知道在 SQL 方面没什么可做的。升级完成后,我们不得不使用某种收缩来处理更改。
我很好奇为什么 Physical 和 VM 会有不同的行为,以及在 VM 环境中寻找什么来查看这是否会出现问题。我看看光盘上的东西,MSINFO32,CPU?我已经查看以确保 VM 上没有压缩。我还做了配置文件并查看了 fn_dblog 以查看在特定表上增长的索引。我只是想不通为什么有些呈指数增长,而另一些则没有增长。此外,如果您知道任何 DB_Owner 权限级别收缩样式命令,我将不胜感激。目前我们正在测试一个检查点,因为 ShrinkDB 由于权限级别而无法使用。

--table has usually has between 10 and 20 million records.  It is a table that has 10 fields strictly typed
IF col_length('[dbo].[foo]','Field1') IS NULL
BEGIN
    ALTER TABLE [dbo].[foo] ADD [Field1] smalldatetime NOT NULL CONSTRAINT [df_Field1] DEFAULT (GETDATE())
END
--This has growth and can get a bit out of control on VM.  Physical machines it does not affect as much.  

--Try 2 hoping Getdate was the issue
IF col_length('[dbo].[foo]','Field1') IS NULL
BEGIN
    ALTER TABLE [dbo].[foo] ADD [Field1] smalldatetime NULL 
END

DECLARE @TheDate smalldatetime = GETDATE()
UPDATE [dbo].[foo] SET [Field1] = @TheDate

--This was even more problematic to the log and took considerably longer

【问题讨论】:

  • 只是个人的烦恼......专栏而不是领域

标签: sql sql-server virtual-machine


【解决方案1】:

老实说,在每次更改列后执行 CHECKPOINT 将是我对 SIMPLE 恢复模型的第一次尝试。除了恢复模式、备份、增长大小和检查点之外,SQL 不允许我们对事务日志的行为方式进行太多控制。

使用 sys.dm_db_log_info 或 DBCC LOGINFO 检查存在多少 VLF 及其大小。

检查恢复模型 - 也许它在某些机器上不是简单的或并不总是简单的?

检查索引和索引碎片;这种差异可能很重要,并且它会在每一列之后发生变化。确保您有聚集索引。

检查总表大小。

【讨论】:

    猜你喜欢
    • 2017-11-15
    • 2014-03-08
    • 2012-04-12
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 2014-11-05
    • 2016-05-12
    • 1970-01-01
    相关资源
    最近更新 更多