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,在对象的整个生命 ...
随机推荐
- Windows下使用Fortran读取HDF5文件
需要用Fortran读取HDF5格式的GPM IMERG卫星降水文件,在已经安装HDF5库(参见VS2019+ Intel Fortran (oneAPI)+HDF5库的安装+测试 - chinago ...
- 渲染杂谈:early-z、z-culling、hi-z、z-perpass到底是什么?
之前一直被这几个和深度缓存(z-buffer)相关的概念搞得神魂颠倒.今天在翻阅<Real-Time Rendering>时碰巧碰巧看到了这部分的讲解.硬着头皮看了看,姑且算是讲几个概念分 ...
- 1.1 WCF SOA架构和webservice
1.什么是SOA? SOA全称:面向服务架构(service Oriented Architecture),它是一种组件架构模式. 一.定义 1.WebService:严格来说是行业标准,不是技术,使 ...
- docker容器启动报错Unable to access jarfile
1.错误表现 Errot: Unable to access jarfile /opt/run-java/deployments/chiano.jar 2.原因:容器的基础镜像对jar的权限有要求 3 ...
- 2022-3-24内部群每日三题-清辉PMP
1.敏捷团队成员认为每日站会并不会增加价值,是因为小组规模太大.在回顾会议上,他们提出将现有的项目团队分解成更小的小组.Scrum主管应该怎么做? A.缩小团队规模,使站会更易于管理. B.在采取行动 ...
- 其他4-shell脚本后台运行知识
1. 用途和方法 在实际工作中,一般会通过ssh连接服务器,隐藏可能就会有脚本或命令在执行期间不能中断的需求,若中断,则不仅前功尽弃,还可能破坏系统数据,下面是防止脚本执行终端的3种方法: 1)使用s ...
- leecode编写记录
记录leecode刷题思路 39.组合总数 39. 组合总和 - 力扣(LeetCode) 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candida ...
- Telerik——GridView总结(Winform)
在使用Telerik控件时有很多的方法,属性经常被用到,分享在此总结也便于查看复习. 1.基本属性 GridViewTextBoxColumn col = new GridViewTextBoxCol ...
- linux smb
/etc/samba/smb.conf [global]workgroup =WORKGROUPsecurity = usermap to guest =Bad Userpassdb backend ...
- CF546E
这题并不是太难 首先题目我们将每个城市拆点,由源点向一端连容量为初始人数的边,由另一端向汇点连容量为最后人数的边,然后按照题目要求从一端向另一端连容量无穷大的边 这样跑出最大流之后我们只需比较这个流量 ...