全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

SQL Server在AlwaysOn中使用内存表的“踩坑”记录

前言

最近因为线上alwayson环境的一个数据库上使用内存表。经过大概一个星期监控程序发现了一个非常严重问题这个数据库的日志文件不会截断,已用空间一直在增加(存在定时的每个小时的日志备份),同时内存表数据库文件也无法删除,下面就介绍一下后面我的处理过程,话不多说了,来一起看看详细的介绍吧。

数据库:SQL Server2014 Enterprise Edition (64-bit)

删除文件

使用一个单独非alwayson环境的数据库测试。

一、创建内存表

---创建内存表文件组
ALTER DATABASE [test] ADD FILEGROUP [test_ag] CONTAINS MEMORY_OPTIMIZED_DATA 
GO 
----创建内存表数据库文件
ALTER DATABASE [test] 
ADD FILE 
( 
 NAME = 'test_memory', 
 FILENAME ='D:\database\memory' 
) 
TO FILEGROUP [test_ag]; 
GO

二、删除内存表数据库文件

USE [test]
GO
ALTER DATABASE [test] REMOVE FILE [test_memory]
GO

备注:此时还未创建表,创建完后数据库文件执行删除就无法删除,接下来试试在线文档的删除方法方法

三、官方相关的删除方法

即使已使用“DBCC SHRINKFILE”操作清空 FILESTREAM 容器,但出于各种系统维护原因,数据库可能仍然需要保留对已删除文件的引用。 sp_filestream_force_garbage_collection (TRANSACT-SQL)将运行 FILESTREAM 垃圾回收器删除这些文件时,则可以安全进行这些操作。 除非 FILESTREAM 垃圾回收器已从 FILESTREAM 容器中删除所有文件,否则 ALTER DATABASEREMOVE FILE 操作将无法删除 FILESTREAM 容器并返回错误。 建议使用以下过程删除 FILESTREAM 容器。

1.运行DBCC SHRINKFILE (TRANSACT-SQL)带有 EMPTYFILE 选项以将此容器的活动内容移动到其他容器

USE test; 
GO 
-- Create a data file and assume it contains data. 
ALTER DATABASE test 
ADD FILE ( 
 NAME = Test1data, 
 FILENAME = 'D:\database\t1data.ndf', 
 SIZE = 5MB 
 ); 
GO 
-- Empty the data file. 
DBCC SHRINKFILE (test_memory, EMPTYFILE); 
GO

2.确保已在 FULL 或 BULK_LOGGED 恢复模型中执行日志备份。

3.确保复制日志读取器作业已运行(如果相关)。

通过log_reuse_wait_desc的状态可以看到当前数据库已经无需日志备份,当然我已经执行过日志备份。

4.运行sp_filestream_force_garbage_collection (TRANSACT-SQL)强制垃圾回收器删除不再需要此容器中的任何文件

USE [test]
GO 
EXEC sp_filestream_force_garbage_collection @dbname = N'test' @filename = N' test_memory '; 

5.执行带有 REMOVE FILE 选项的 ALTER DATABASE,以删除此容器。

USE [test]
GO
ALTER DATABASE [test] REMOVE FILE [test_memory]
GO

还是无法删除!!!

四、问题分析

一开始是在alwayson的环境中删除,提示由于副本的原因无法删除。后面单独在一个非alwayson的环境下的数据库测试同样是无法删除,起初以为是创建了内存表的原因后面测试仅仅创建文件组和文件然后来删除文件同样是无法删除,个人猜测有可能是buffer的缘故;在buffer中一直存在内存表相关的文件存在,通过执行DBCC DROPCLEANBUFFERS命令也无法清空buffer中的内存表对象。使尽浑身解数还是无法将它删除掉,最后只能投降了!!!线上环境等不下去;只能使用最不愿使用的生成表结构导出数据的办法来重建新的数据库。

生成脚本重建数据库

创建一个新的数据库同时保证当前数据库可用(重命名当前的数据库,新创建的数据库使用之前的名称这样可以保证应用程序那边不需要改变),这样如果出现什么问题也可以及时的切换回来。

步骤如下(在允许停机维护的情况下进行):

1.禁用所有相关作业

2禁用应用程序登入用户

同时保证相关进程事务都已完成。

ALTER LOGIN [test] DISABLE
GO

USE [master]
GO
ALTER DATABASE [test] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;--将数据库设置成单用户并回滚当前连接

USE [test];---保持连接操作,防止其它用户此时进行连接
GO

3.执行checkpoint刷新所有脏页

CHECKPOINT

---返回当前buffer中每个数据库所占的buffer大小和buffer中脏页的大小
WITH CTE1
 AS ( SELECT COUNT(*) * 8 / 1024 AS dirty_cached_size_MB ,
  COUNT(*) AS dirty_pages,
  CASE database_id
  WHEN 32767 THEN 'ResourceDb'
  ELSE DB_NAME(database_id)
  END AS database_name
 FROM sys.dm_os_buffer_descriptors
 WHERE is_modified = 1
 GROUP BY DB_NAME(database_id),database_id
 ),
 CET2
 AS ( SELECT COUNT(*) * 8 / 1024 AS cached_size_MB ,
  COUNT(*) AS pages,
  CASE database_id
  WHEN 32767 THEN 'ResourceDb'
  ELSE DB_NAME(database_id)
  END AS database_name
 FROM sys.dm_os_buffer_descriptors
 GROUP BY DB_NAME(database_id),database_id
 )
 SELECT 
 CET2.database_name,
 CET2.cached_size_MB,
 --CET2.pages,
 CTE1.dirty_cached_size_MB
 --CTE1.dirty_pages 
 FROM CTE1 INNER JOIN CET2 ON CTE1.database_name = CET2.database_name

---将数据库选项改成多用户访问
ALTER DATABASE [test] 
SET MULTI_USER;

4.生成数据库脚本

5.重命名旧的数据库

注意:如果数据库是在alwayson中,需要先从可用性数据库中删除,否则无法重命名数据库。

/*
1.断开数据库所有连接同时禁止新的连接进来
2.比如禁止登入用户、将实例设为单用户模式等。
*/
----1.设置数据库脱机
USE [master] 
ALTER DATABASE [test] SET OFFLINE WITH ROLLBACK IMMEDIATE;

----2.手动修改数据库物理文件名,例如将test.mdf改成test_old.mdf

----3.语句修改
USE [master] 
ALTER DATABASE [test] 
MODIFY FILE (NAME = test, FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\test_old.mdf');
GO
ALTER DATABASE [test] 
MODIFY FILE (NAME = test_log, FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\test_old_log.ldf');
GO

---4.设置数据库在线
USE [master] 
ALTER DATABASE [test] SET ONLINE


----5.修改数据库逻辑文件名

USE [test]
GO
ALTER DATABASE [test] MODIFY FILE (NAME=N'test', NEWNAME=N'test_old')
GO
USE [test]
GO
ALTER DATABASE [test] MODIFY FILE (NAME=N'test_log', NEWNAME=N'test_old_log')
GO

----6.重命名数据库
USE [master] 
EXEC sp_renamedb N'test', N'test_old'; 

----7.查询
SELECT *
FROM sys.master_files
WHERE database_id = DB_ID('test_old');

6.创建新的数据库同时导入脚本到新的数据库

如果同时导出表结构和数据在ssms工具中执行可能会因为脚本过大无法执行,可以使用sqlcmd工具执行脚本导入,具体方法可以百度一下。当然还有其他方法就是只导出表结构然后通过“导出数据\导入数据”的方法同步数据。

注意:如果使用“导出数据\导入数据”的方法同步数据,注意勾选“启用标示插入”

7.其它

      1.如果存在alwayson记得将新的数据库加入到可用性数据库组中。

      2.将新的数据库加入到备份作业中。

      3.对比新旧两个数据库的表数量是否相同。

      4.配置登入用户新的数据库权限。

总结

内存表是2014新引入的功能所以对于新功能的第一个版本使用要比较慎重,特别是在线上环境。虽然在上线之前做过测试,但是显然备份这块的测试往往比较容易被忽略因为没有线上的这种环境。好在是这次影响的是一个新上的项目数据量和并发都很小且允许节假日停机维护;如果是非常大的系统对于需要导入导出数据肯定是非常头疼的事情关键还得看允许停机的时长。因为自己在生产环境踩了坑,写这篇文章希望后面的人可以避免踩坑。

备注:内存表在2014版本的alwayson中无法同步到辅助副本,这就导致了它的作用大打折扣,2016版本可以同步到辅助副本,建议有条件的直接上2016。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。


# sql  # server  # alwayson  # sqlserver  # 内存  # SQL语句实现查询SQL Server内存使用状况  # 优化SQL Server的内存占用之执行缓存  # SQL Server 数据页缓冲区的内存瓶颈分析  # SqlServer如何通过SQL语句获取处理器(CPU)、内存(Memory)、磁盘(Disk)以及  # SQL Server 2008 R2占用cpu、内存越来越大的两种解决方法  # 解决SQL Server虚拟内存不足情况  # 揭秘SQL Server 2014有哪些新特性(1)-内存数据库  # 浅谈SQL Server 对于内存的管理[图文]  # SQL Server内存遭遇操作系统进程压榨案例分析  # sql server学习基础之内存初探  # 线上  # 是在  # 重命名  # 登入  # 数据库文件  # 可用性  # 清空  # 应用程序  # 的人  # 的是  # 好了  # 第一个  # 有可能  # 不需要  # 说了  # 不多  # 不愿  # 设为  # 有一定  # 也可 


相关文章: 制作网站公司那家好,网络公司是做什么的?  如何高效完成自助建站业务培训?  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  如何用免费手机建站系统零基础打造专业网站?  深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?  建站主机如何安装配置?新手必看操作指南  如何通过商城免费建站系统源码自定义网站主题?  Thinkphp 中 distinct 的用法解析  建站主机CVM配置优化、SEO策略与性能提升指南  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  武清网站制作公司,天津武清个人营业执照注销查询系统网站?  如何选择PHP开源工具快速搭建网站?  为什么Go需要go mod文件_Go go mod文件作用说明  北京的网站制作公司有哪些,哪个视频网站最好?  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  建站之星导航配置指南:自助建站与SEO优化全解析  制作充值网站的软件,做人力招聘为什么要自己交端口钱?  整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?  广东企业建站网站优化与SEO营销核心策略指南  建站主机选哪家性价比最高?  广州建站公司哪家好?十大优质服务商推荐  如何快速搭建自助建站会员专属系统?  ,南京靠谱的征婚网站?  深圳企业网站制作设计,在深圳如何网上全流程注册公司?  专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?  建站之星微信建站一键生成小程序+多端营销系统  魔毅自助建站系统:模板定制与SEO优化一键生成指南  建站主机选择指南:服务器配置与SEO优化实战技巧  怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?  建站主机解析:虚拟主机配置与服务器选择指南  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  如何快速生成橙子建站落地页链接?  网站企业制作流程,用什么语言做企业网站比较好?  盐城做公司网站,江苏电子版退休证办理流程?  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换  零服务器AI建站解决方案:快速部署与云端平台低成本实践  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  宝塔建站后网页无法访问如何解决?  已有域名建站全流程解析:网站搭建步骤与建站工具选择  如何用虚拟主机快速搭建网站?详细步骤解析  无锡营销型网站制作公司,无锡网选车牌流程?  建站之星下载版如何获取与安装?  建站之星伪静态规则如何设置?  广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?  代购小票制作网站有哪些,购物小票的简要说明?  已有域名如何免费搭建网站?  Android自定义listview布局实现上拉加载下拉刷新功能  西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。