背景

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

于是想到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. 《Spring Boot从零开始学(视频教学版)》快速入门Spring Boot应用开发

    #好书推荐##好书奇遇季#<Spring Boot从零开始学(视频教学版)>,目前为止较好的一本Spring Boot入门书.京东当当天猫都有发售.本书配套示例代码.课件与教学视频.定价7 ...

  2. mybatis-关联查询4-多对多查询

    三张表的关联查询  

  3. Consul 服务注册与发现

    Consul是一种分布式,高度可用且具有数据中心感知能力的解决方案,用于跨动态,分布式基础架构连接和配置应用程序. 1.下载consul.exe 2.在consul.exe文件夹地址栏输入cmd 3. ...

  4. Vite项目打包配置详解

    一:vite构建项目 配置base 1.base配置打包公共路径 打开package.json 做项目时可以不去掉 好了,在以上你构建了vite,并配置了最简单的操作后,你准备配置vite.confi ...

  5. 1255. 得分最高的单词集合 (Hard)

    问题描述 1255. 得分最高的单词集合 (Hard) 你将会得到一份单词表 words,一个字母表 letters (可能会有重复字母),以及每个字母对应的得分情况表 score. 请你帮忙计算玩家 ...

  6. pgsql给表重命名

    alter table "pavement_damage_dtl_temp" rename to "pavement_damage_dtl"; 搜索 复制

  7. Nginx 配置https的单向或双向认证

    一.自制https认证证书 1. 制作CA证书 A. 生成CA私钥:openssl genrsa -des3 -out ca.key 2048,注意要输入两次密码,若去除密码使用openssl rsa ...

  8. spring-configuration-metadata元数据与additional-spring-configuration-metadata元数据区别

    参考 https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-configuration-metadata.ht ...

  9. C# 以管理员方式运行程序

    让你的程序以管理员方式运行 在Program.cs文件中添加如下代码 /// <summary> /// 应用程序的主入口点. /// </summary> [STAThrea ...

  10. gitee提交过程

    https://gitee.com/ 一个线上代码云端软件开发协作平台 首先注册一个账号 然后添加新的仓库 仓库名称和路径是必填项 然后创建项目 选择  克隆存储数据库 存储库位置是网站获取的git位 ...