背景

因为生产应用需要刷新大量的状态数据到数据库中用于客户端的显示,于是新建了一张状态表,表内行数固定,状态更新到列内。刚开始运行时还行,更新都很及时,查询速度也不慢。于是就这样使用了有一个月的时间。直到生产反应交互变慢,有时会出现响应超时的情况。

于是想到SQL SERVER 有内存优化表功能,根据内存优化表设置方法设置好内存优化表之后,系统运行效率缺失有提升,数据更新时间缩短到原来的三分之一了。本以为万事大吉,啤酒炸鸡。

故障现象

  1. 一段时间之后数据库无法连接。
  2. 从 MS 查看数据库被置为恢复状态,并且一直处于恢复中。
  3. SQL SERVER 日志中出现。An XTP checkpoint operation encountered an error。(事后检查日志时发现的)随着时间的延续,出现越来越频繁。

紧急恢复办法

因为是生产系统必须尽快恢复,刚开始完全没有思路,只能硬着头皮上了。

此时数据库处于恢复状态,任何附加分离操作都无法进行。总结出了下面的操作步骤来恢复数据库。

  1. 首先准备好一个正常状态的数据库备份,恢复然后分离备用。
  2. 手动停止 SQL SERVER 服务。
  3. 找到备用数据库的 FILESTREAM 文件所在路径,把 filestream.hdr 覆盖到当前故障的数据库中。
  4. 启动 SQL SERVER 服务,并且立即把数据库设置为紧急模式。这里需要多试几次,不一定每次都成功,时机很重要。
  5. 修改 FILESTREAM 文件 自增为“无限制”。分离数据库。
  6. 重启服务器。再附加数据库就可以看到数据库恢复正常了。

原因调查

根据日志查找到下面是一些关于内存优化表的解释:
The Memory-Optimized table automatic checkpoint will be triggered when the database transaction log file becomes bigger than 1.5 GB since the last checkpoint, including the transaction log records for both the Memory-Optimized and disk-based tables. The Memory-Optimized tables checkpoint occurs periodically in order to advance the active part of the transaction log, allowing the tables to be recovered to the last successful checkpoint and applying the last active portion of the transaction log to complete the recovery process.
当数据库事务日志文件自上一个检查点(包括内存优化表和基于磁盘的表的事务日志记录)以来大于1.5 GB时,将触发内存优化表自动检查点。内存优化表检查点定期出现,以推进事务日志的活动部分,允许将表恢复到最后一个成功的检查点,并应用事务日志的最后一个活动部分来完成恢复过程。
There is a special case in SQL Server 2016 in which the checkpoint characteristics for Memory-Optimized tables differs, called the Large Checkpoint, that is enabled on large machines with 16 or more logical processors, 128GB or greater memory or the ones that is capable of greater than 200MB/sec I/O measured for the IO subsystem of that database. The automatic large checkpoint is triggered only when 12GB of the transaction log file is filled up since the last checkpoint. The purpose of the large checkpoints is to ensure that the checkpoint process would not be continually executing and would scale efficiently.
SQL Server 2016中存在一种特殊情况,即内存优化表的检查点特征不同,称为大型检查点,它在具有16个或更多逻辑处理器、128GB或更大内存的大型计算机上启用,或者在该数据库的IO子系统上测得的I/O大于200MB/秒的大型计算机上启用。仅当自上一个检查点以来事务日志文件的12GB空间已满时,才会触发自动大检查点。大型检查点的目的是确保检查点流程不会持续执行,并且可以有效扩展。

英文原文:https://www.sqlshack.com/sql-server-2016-memory-optimized-tables-checkpoint-operation/

中文翻译:https://blog.csdn.net/culuo4781/article/details/107626408

此外还发现了一个补丁 KB3206584,是解决Sql Server 2016 中使用的内存优化表中时,检查点文件过度增长。这个补丁和当前问题没有关系,补丁是解决错误在普通计算机上默认开启大检查点的设置失误。

网站找到的类似问题

https://social.msdn.microsoft.com/Forums/en-US/f9743bce-1968-42a7-bb9b-250a50f9fd67/inmemory-oltp-quotan-xtp-checkpoint-operation-encountered-an-errorquot-no-idea-why

关于当前问题非常有用的一篇文章,下面的博客中还有很多关于 sql server 的内容非常值得推荐:

其主要内容是说 绝对不能限制 MEMORY_OPTIMIZED_DATA 文件组的文件大小,必须让他自由扩展。

http://nedotter.com/archive/2018/07/dangerous-moves-setting-max-size-for-in-memory-oltp-containers/

总结

  1. 这种建立状态表更新状态的办法并不是特别好,一是更新频繁数据库响应不及时,二是数据库本质还是用来保存数据,像这样刷新会产生大量的更新日志,导致数据库日志文件暴增。
  2. 如果需要用到 MEMORY_OPTIMIZED_DATA 文件组,绝对不能限制 MEMORY_OPTIMIZED_DATA 文件组的文件大小,必须让他自由扩展。

SQL SERVER 内存优化表踩坑记的更多相关文章

  1. 使用SQL Server内存优化表 In-Memory OLTP

    如果你的系统有高并发的要求,可以尝试使用SQL Server内存优化表来提升你的系统性能.你甚至可以把它当作Redis来使用. 要使用内存优化表,首先要在现在数据库中添加一个支持内存优化的文件组. M ...

  2. SQL Server 内存优化表的索引设计

    测试的版本:SQL Server 2017 内存优化表上可以创建哈希索引(Hash Index)和内存优化非聚集(NONCLUSTERED)索引,这两种类型的索引也是内存优化的,称作内存优化索引,和基 ...

  3. Sql server2014 内存优化表 本地编译存储过程

    参考文献:http://www.infoq.com/cn/news/2013/09/Compiled-Queries http://www.bianceng.cn/database/SQLServer ...

  4. SQL Server 2014内存优化表的使用场景

    SQL Server 2014内存优化表的使用场景 最近一个朋友找到走起君,咨询走起君内存优化表如何做高可用的问题 大家知道,内存优化表是从SQL Server 2014开始引入,可能大家对内存优化表 ...

  5. SQL Server 2014内存优化表的使用场景(转载)

    最近一个朋友找到走起君,咨询走起君内存优化表如何做高可用的问题 大家知道,内存优化表作为In-Memory OLTP功能是从SQL Server 2014开始引入,用来对抗Oracle 12C的In- ...

  6. SQL Server 内存中OLTP内部机制概述(三)

    ----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...

  7. In-Memory:内存优化表的事务处理

    内存优化表(Memory-Optimized Table,简称MOT)使用乐观策略(optimistic approach)实现事务的并发控制,在读取MOT时,使用多行版本化(Multi-Row ve ...

  8. 试试SQLSERVER2014的内存优化表

    试试SQLSERVER2014的内存优化表 SQL Server 2014中的内存引擎(代号为Hekaton)将OLTP提升到了新的高度. 现在,存储引擎已整合进当前的数据库管理系统,而使用先进内存技 ...

  9. Spark踩坑记——Spark Streaming+Kafka

    [TOC] 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark strea ...

  10. In-Memory:内存优化表 DMV

    在内存优化表的DMV中,有两个对象ID(Object ID): xtp_object_id 是内部的内存优化表(Internal Memory-Optimized Table)的ID,在对象的整个生命 ...

随机推荐

  1. AndroidStudio 集成kotlin,以及Kotlin-gradle-plugin-1.5.0.jar 下载失败

    配置Kotlin buildscript { ext.kotlin_version = '1.5.0' repositories { maven{url 'http://maven.aliyun.co ...

  2. No.1.6

    结构伪类选择器 根据元素在HTML中的结构关系查找元素 选择器 说明 E:first-child{} 匹配父元素中的第一个子元素,并且是E元素 E:last-child{} 匹配父元素中的最后一个子元 ...

  3. 用简单的代码,将小程序文件直传到腾讯云COS实践

    简介 本文介绍如何不依赖 SDK,用简单的代码,在小程序直传文件到腾讯云COS的存储桶. 注意: 本文档内容基于 XML 版本的 API. 前期条件 登录 对象存储控制台 ,创建存储桶,设置 Buck ...

  4. 【剑指Offer】【树】二叉树的镜像

    题目:操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 1 ...

  5. Redis如何找出并快速删除亿级指定前缀的key

    背景 由于Redis的单线程服务模式,命令keys *会阻塞正常的业务请求,不建议使用keys * pattern的方法进行查询,可能会使服务器卡顿而出现事故.如何获取指定的 key? 可以采用Red ...

  6. mysql的日期时间类型格式

    日期时间类型 一般用整型保存时间戳,因为PHP可以很方便的将时间戳进行格式化. datetime 8字节 日期及时间 1000-01-01 00:00:00 到 9999-12-31 23:59:59 ...

  7. Ubuntu20.04 TLS 开机卡在“A start job is running for wait for network to be Configured”解决

    问题: 安装ubuntu20.04 TLS系统后,开机卡在"A start job is running for wait for network to be Configured" ...

  8. Coursera Programming Languages, Part C 华盛顿大学 Week 2

    week 2 我们采用一种新的视角来对比 FP 与 OOP,即将问题分解 (decompose) 与实现 (implement) 的方式 OOP Versus Functional Decomposi ...

  9. css实现图片在div中居中的效果

    利用图片的margin属性将图片水平居中,利用div的padding属性将图片垂直居中. 结构代码同上: css代码如下: div {width:300px; height:150px; paddin ...

  10. Spring学习记事本

    原因:原因:Application的启动类不能放在默认的java目录,必须放在建有包的目录下.