SQL SERVER 内存优化表踩坑记
背景
因为生产应用需要刷新大量的状态数据到数据库中用于客户端的显示,于是新建了一张状态表,表内行数固定,状态更新到列内。刚开始运行时还行,更新都很及时,查询速度也不慢。于是就这样使用了有一个月的时间。直到生产反应交互变慢,有时会出现响应超时的情况。
于是想到SQL SERVER 有内存优化表功能,根据内存优化表设置方法设置好内存优化表之后,系统运行效率缺失有提升,数据更新时间缩短到原来的三分之一了。本以为万事大吉,啤酒炸鸡。
故障现象
- 一段时间之后数据库无法连接。
- 从 MS 查看数据库被置为恢复状态,并且一直处于恢复中。
- SQL SERVER 日志中出现。An XTP checkpoint operation encountered an error。(事后检查日志时发现的)随着时间的延续,出现越来越频繁。
紧急恢复办法
因为是生产系统必须尽快恢复,刚开始完全没有思路,只能硬着头皮上了。
此时数据库处于恢复状态,任何附加分离操作都无法进行。总结出了下面的操作步骤来恢复数据库。
- 首先准备好一个正常状态的数据库备份,恢复然后分离备用。
- 手动停止 SQL SERVER 服务。
- 找到备用数据库的 FILESTREAM 文件所在路径,把 filestream.hdr 覆盖到当前故障的数据库中。
- 启动 SQL SERVER 服务,并且立即把数据库设置为紧急模式。这里需要多试几次,不一定每次都成功,时机很重要。
- 修改 FILESTREAM 文件 自增为“无限制”。分离数据库。
- 重启服务器。再附加数据库就可以看到数据库恢复正常了。
原因调查
根据日志查找到下面是一些关于内存优化表的解释:
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/
总结
- 这种建立状态表更新状态的办法并不是特别好,一是更新频繁数据库响应不及时,二是数据库本质还是用来保存数据,像这样刷新会产生大量的更新日志,导致数据库日志文件暴增。
- 如果需要用到 MEMORY_OPTIMIZED_DATA 文件组,绝对不能限制 MEMORY_OPTIMIZED_DATA 文件组的文件大小,必须让他自由扩展。
SQL SERVER 内存优化表踩坑记的更多相关文章
- 使用SQL Server内存优化表 In-Memory OLTP
如果你的系统有高并发的要求,可以尝试使用SQL Server内存优化表来提升你的系统性能.你甚至可以把它当作Redis来使用. 要使用内存优化表,首先要在现在数据库中添加一个支持内存优化的文件组. M ...
- SQL Server 内存优化表的索引设计
测试的版本:SQL Server 2017 内存优化表上可以创建哈希索引(Hash Index)和内存优化非聚集(NONCLUSTERED)索引,这两种类型的索引也是内存优化的,称作内存优化索引,和基 ...
- Sql server2014 内存优化表 本地编译存储过程
参考文献:http://www.infoq.com/cn/news/2013/09/Compiled-Queries http://www.bianceng.cn/database/SQLServer ...
- SQL Server 2014内存优化表的使用场景
SQL Server 2014内存优化表的使用场景 最近一个朋友找到走起君,咨询走起君内存优化表如何做高可用的问题 大家知道,内存优化表是从SQL Server 2014开始引入,可能大家对内存优化表 ...
- SQL Server 2014内存优化表的使用场景(转载)
最近一个朋友找到走起君,咨询走起君内存优化表如何做高可用的问题 大家知道,内存优化表作为In-Memory OLTP功能是从SQL Server 2014开始引入,用来对抗Oracle 12C的In- ...
- SQL Server 内存中OLTP内部机制概述(三)
----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...
- In-Memory:内存优化表的事务处理
内存优化表(Memory-Optimized Table,简称MOT)使用乐观策略(optimistic approach)实现事务的并发控制,在读取MOT时,使用多行版本化(Multi-Row ve ...
- 试试SQLSERVER2014的内存优化表
试试SQLSERVER2014的内存优化表 SQL Server 2014中的内存引擎(代号为Hekaton)将OLTP提升到了新的高度. 现在,存储引擎已整合进当前的数据库管理系统,而使用先进内存技 ...
- Spark踩坑记——Spark Streaming+Kafka
[TOC] 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark strea ...
- In-Memory:内存优化表 DMV
在内存优化表的DMV中,有两个对象ID(Object ID): xtp_object_id 是内部的内存优化表(Internal Memory-Optimized Table)的ID,在对象的整个生命 ...
随机推荐
- HiveServer2启动报TezConfiguration类NoClassDefFoundError错误
错误信息如下: 2021-01-03 20:11:26,355 WARN [main] server.HiveServer2: Error starting HiveServer2 on attemp ...
- django日志分割的几种处理
https://blog.csdn.net/qq_42819407/article/details/125041634
- CxImageJPG
typedef struct tag_ExifInfo { char Version [5]; //EXIF 信息版本 char CameraMake [32]; //DC 制造商 char Came ...
- lg8862题解
脑抽了,一开始想着扫描线然后用线段树求历史最大值.
- C++实现链式表示多项式加法运算
#include<iostream>#include<cstdlib>using namespace std;#define MAXSIZE 100#define OK 1#d ...
- MVC对session或cookie保存的值在js中做处理
在cshtml中保存数据 eg: @Html.Hidden("sessionUserName", Session["userName"]) @Html.Hidd ...
- js两个数组对象中,获取不相同的值 非交集元素对象
查看前端面试题小程序 大量面试题和答案,请微信查看 var array1 = [ {"Num": "A " },{"Num": " ...
- HUAWEI——— 防火墙+ACL访问控制+AP上线+默认路由+NAT+DHCP(案例拓扑)
#HUAWEI--- 防火墙+ACL访问控制+AP上线+默认路由+NAT+DHCP(案例拓扑) 网络拓扑图: 项目要求: 1.交换机SwitchA,作为有线终端的网关,同时作为DHCP server, ...
- 平方损失函数为例的BP的关键公式推导
看了刘建平老师的博客https://www.cnblogs.com/pinard/p/6422831.html对如下其中两个公式进行详细推导 损失函数为(大写字母为矩阵,小写字母字母加粗为列向量,其中 ...
- 安装python及环境搭建
操作系统是windows7 64位 打算使用visual studio code进行代码编写 1.先安装visual studio code去visual studio 官网下载VS code htt ...