AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 144889
Accepted
Sir Swears-a-lot
Sir Swears-a-lot
Asked: 2016-07-26 15:47:36 +0800 CST2016-07-26 15:47:36 +0800 CST 2016-07-26 15:47:36 +0800 CST

SQL 2016 SQL Server 断言:文件:<pageref.cpp>,行=951 断言失败

  • 772

我目前正在将我们的数据仓库从 SQL 2012 升级到 SQL 2016。我的旧 DW 和新 DW 并行运行。

我的 ETL 流程(由第三方在 SSIS 中开发的框架)在 2012 年成功运行了 2 年多,但在 2016 年失败了。到目前为止,数据库和 ETL 流程是相同的。

两台服务器都是在 VMWare 上运行的虚拟机。旧服务器是 Win 2008,具有 24Gb 的 RAM。SQL 2012 标准。最大内存设置为 16Gb。新服务器是 Win 2012,具有 64Gb 的 RAM。SQL 2016 开发。最大内存设置为 50Gb。新 DW 正在运行 v13.0.1601.5 RTM 开发人员版(64 位)。

在运行我的 ETL 过程时,使用 SQL 合并到维度或事实表的加载步骤失败并出现以下错误。

全文:

描述: SQL Server 断言: 文件: , line=951 断言失败 = 'IS_OFF (BUF_MINLOGGED, m_buf->bstat) || pageModifyType != PageModifyType_Contents || GetPagePtr ()->IsTextPage ()'。此错误可能与时间有关。如果重新运行语句后错误仍然存​​在,请使用 DBCC CHECKDB 检查数据库的结构完整性,或重新启动服务器以确保内存中的数据结构没有损坏。

按照建议,我运行了 DBCC,没有发现任何错误。我也重新启动了 SQL。然后我重新启动了 ETL 过程并得到了同样的错误。

我对这个错误的搜索表明这是SQL 2008、2012 和 2014 中的已知错误,并在后续的修补程序和累积更新中修复。所以我有点惊讶地看到它在 2016 年重新出现。

我发现的链接说,如果数据库处于简单或批量日志恢复模式,它会在尝试插入时影响 SSIS。(我在简单恢复模式下运行)

建议的解决方法是将 Db 恢复模式更改为 FULL。我已经尝试过了,它可以工作,但它不是数据仓库的解决方案。

2016年有没有人遇到过这种情况?

任何人都可以建议替代解决方法吗?

更新:

26/7/2016:我应用了关键更新 KB3164398 (v13.0.1708.0),但问题仍然存在。

27/7/2016:我已应用累积更新 CU1 KB3164674 (v13.0.2149.0)。

2016 年 3 月 8 日:我们最小的立方体在一夜之间发生错误。CU1 没有解决这个问题。今天我报告了 MS Connect 上的错误,并且我还记录了与 Microsoft 的支持电话。

2016 年 12 月 8 日:MS-Support 最初做出了回应,但回应是“我们没有解决方案”。支持人员将与他的同事讨论并回复我。8天后我没有他的消息。

虽然我没有“修复”,但我们确实找到了适合我们的解决方法。请参阅我发布的答案。

2016 年 9 月 29 日。我上周申请了CU2。在星期四,我们不小心运行了旧版本的合并,它再次失败并出现同样的错误。所以.. CU2 也没有修复它。

23/1/2017:我应用了2016 SP1 CU1,我相信这已经解决了这个问题。特别是 KB3205964

sql-server sql-server-2016
  • 4 4 个回答
  • 6137 Views

4 个回答

  • Voted
  1. Best Answer
    wBob
    2016-07-28T04:44:37+08:002016-07-28T04:44:37+08:00

    查看 KB,您有几个选项/解决方法:

    1. 切换到完全恢复模式。您说“这对于仓库来说不是一个很好的选择”,但实际上只是定期设置事务日志备份的问题,例如 15 分钟,然后处理它们。SSIS/维护计划有用于执行此操作的库存任务。您将丢失批量记录的事务,但我从未发现这些事务对运行时产生了很大影响,只是日志大小。您甚至可以将日志备份到 nul,我不会在这里描述。如果您不确定该怎么做,请咨询当地的 DBA。磁盘空间和事务日志备份保留是比致命错误更容易解决的问题。当这个问题最终得到解决时,您可以切换回来。
    2. KB 提到“单个分布式事务中的多个 BULK INSERT 语句”。从您的问题中不清楚您的批量插入是如何设置的。您是否使用 SSIS 运行使用MERGE命令?这里的“多个 BULK INSERT”是什么意思?有没有办法将您的方法转换为单个 BULK INSERT,例如一次一个?例如,在 SSIS 中,您可以将“MaxConcurrentExecutables”临时设置为 1,看看是否有帮助。将其绑定到配置变量,以便您以后可以将其更改回来。显然它会减慢速度,但您更喜欢 ETL 完成而不是快速失败。并行处理是一种很好的模式,也是 SSIS 的真正优势,但你只能与最慢的组件一样快;假设你有 10 个维度需要一分钟,一个事实需要一个小时,你的 ETL 在一小时内并行运行或 1 小时 10 分钟连续运行。
    3. MERGE很好,但确实有一些问题。您可以考虑转换回INSERT/ UPDATE。你也应该根据这里HOLDLOCK使用with 。你用那个提示吗?如果你这样做,对这个问题有什么影响吗?我们在早期的 SQL 2014 构建中遇到了一个问题,在列存储中使用可组合 DML(子句)导致了这种断言——我让他们将列存储索引从维度中删除,他们在没有告诉我的情况下添加了这些索引。MERGEMERGEOUTPUT
    4. 你在做什么样的事务处理?有时使用 ETL,只需重新运行即可重复该位置。有时您需要它失败并回滚。你是如何实现的?可以改变它不是“单一分布式事务”吗?

    祝你好运。

    • 2
  2. Sir Swears-a-lot
    2017-01-23T12:40:51+08:002017-01-23T12:40:51+08:00

    我相信这已在 2016 SP1 CU1 中得到解决。

    具体由KB3205964

    • 2
  3. Steve Neshausen
    2016-08-01T13:37:52+08:002016-08-01T13:37:52+08:00

    通过为 MSSQL2016 应用累积更新 1 (CU1) 可以解决此问题,请参阅链接 https://support.microsoft.com/en-us/kb/3164674

    • 1
  4. Sir Swears-a-lot
    2016-08-04T21:10:02+08:002016-08-04T21:10:02+08:00

    我相信我们已经找到了另一种解决方法。我发布了我的答案,因为我认为它可能有用,并且与 wBob 的建议有很大不同。

    我们更改了合并语句的插入部分,使其插入临时表而不是原始目标。

    一旦合并语句执行,我们就从#table 插入到目标中。

    这并不理想,但至少合并仍然通过标记已停用/过期的行来处理“更新插入”的复杂性。

    与将合并完全重写为单独的插入和更新相比,我们发现这是一个可以接受的权衡。

    CREATE TABLE #Activity(
    [ETL_ActivitySurrogateKey] [int] IDENTITY(1,1) NOT NULL,
    [Field1] [varchar](255) NULL,
    )
    
    -- Insert statements for procedure here
    INSERT INTO #Activity ( [Field1],2,3,etc )
    
    SELECT [Field1],2,3,etc
    FROM 
    (
        MERGE [DDS_OZ_CC].[dimActivity] AS target 
        USING (
          SELECT [Field1],2,3,etc
          FROM [STAGE_OZ_CC].[Transform_Activity]
          ) as source
        ON
        (
          target.RowIsCurrent = source.RowIsCurrent
             AND target.[Field1] = source.[Field1]
        )
        WHEN MATCHED 
            AND (        
            EXISTS (SELECT target.Level5Id EXCEPT SELECT source.Level5Id)
        )
        THEN
          UPDATE SET 
            ETL_ValidToDateTime = source.ETL_ValidFromDateTime 
           ,ETL_RowIsCurrent = 0 
           ,ETL_LastTouchedBy = source.ETL_LastTouchedBy 
           ,ETL_RowChangeReason = 'SCD2 Retired' 
    
        WHEN NOT MATCHED THEN 
        INSERT 
        (    
         [Field1],2,3,etc
        )
        VALUES (      
          source.[Field1],2,3,etc
        )
           WHEN NOT MATCHED BY SOURCE AND target.ETL_RowIsCurrent = 1
           THEN UPDATE SET
           ETL_RowIsCurrent = 0 
           ,ETL_RowChangeReason = 'Fact Removed' 
           ,ETL_LastTouchedBy = 'Unknown'
    
      OUTPUT
        $action      
          ,source.[Field1],2,3,etc    
    
      ) AS MergeOutput
      (
        action  
        ,[Field1],2,3,etc   
      ) 
    
      WHERE ACTION = 'UPDATE' AND ETL_RowIsCurrent = 1
    
        INSERT INTO [DDS_OZ_CC].[dimActivity]
        ( [Field1],2,3,etc  )
        SELECT [Field1],2,3,etc
        FROM #Activity
    
        END
    
    • 1

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve