澳门在线威尼斯官方 > 电脑数据库 > 威尼斯澳门在线在AlwaysOn上运用内部存款和储蓄器

原标题:威尼斯澳门在线在AlwaysOn上运用内部存款和储蓄器

浏览次数:74 时间:2019-12-30

介绍

因为线上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:databasememory'  
)  
TO FILEGROUP [test_ag];  
GO  

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

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

威尼斯澳门在线 1

备考:那时候还没创设表,成立完后数据库文件施行删除就不恐怕删除,接下去试试在线文书档案的删除方法形式

 三、合法相关的删除方法**

哪怕已使用“DBCC SHTiggoINKFILE”操作清空 FILESTREAM 容器,但出于各类系统爱惜原因,数据库只怕如故要求保留对已去除文件的引用。 sp_filestream_force_garbage_collection (TRANSACT-SQL卡塔尔国将运转FILESTREAM 垃圾回收器删除这个文件时,则能够安全实行这个操作。 除非 FILESTREAM 垃圾回笼器已从 FILESTREAM 容器中删除全部文件,不然 ALTELANDDATABASEREMOVE FILE 操作将不可能删除 FILESTREAM 容器并赶回错误。 提议采取以下进程删除 FILESTREAM 容器。

1.运维DBCC SHPRADOINKFILE (TRANSACT-SQL卡塔尔带有 EMPTYFILE 选项以将此容器的移位内容移动到此外容器。

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

威尼斯澳门在线 2

2.承保已在 FULL 或 BULK_LOGGED 恢复生机模型中实行日志备份。

3.承保复制日志读取器作业已运行(假若有关)。

威尼斯澳门在线 3

通过log_reuse_wait_desc的情形能够观望眼下数据库已经不需求日志备份,当然作者早就施行过日志备份。

4.运行sp_filestream_force_garbage_collection (TRANSACT-SQLState of Qatar压迫垃圾回笼器删除不再供给此容器中的任何文件。

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

5.奉行带有 REMOVE FILE 选项的 ALTE中华V DATABASE,以删除此容器。

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

威尼斯澳门在线 4

照旧不可能删除!!!

四、难点深入分析

生机勃勃开头是在alwayson的情况中除去,提醒由于别本的原因不能删除。前边单独在三个非alwayson的情状下的数据库测验肖似是力所不及删除,初阶感到是开创了内部存款和储蓄器表的源委前面测量检验唯有创制文件组和文件然后来去除文件大器晚成律是力所比不上删除,个人估摸有异常的大或然是buffer的缘由;在buffer中央职能部门接留存内部存款和储蓄器表相关的公文存在,通超过实际行DBCC DROPCLEANBUFFERubiconS命令也束手无计清空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

威尼斯澳门在线 6

威尼斯澳门在线 7

威尼斯澳门在线 8

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 FilesMicrosoft SQL ServerMSSQL12.MSSQLSERVERMSSQLDATAtest_old.mdf');
GO
ALTER DATABASE [test] 
MODIFY FILE (NAME = test_log, FILENAME = 'C:Program FilesMicrosoft SQL ServerMSSQL12.MSSQLSERVERMSSQLDATAtest_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工具施行脚本导入,具体方法能够百度时而。当然还可能有其它事办公室法就是只导出表布局然后经过“导出数据导入数据”的法子同步数据。

留意:要是运用“导出数据导入数据”的章程同步数据,注意勾选“启用标示插入”

威尼斯澳门在线 9

7.其它

1.要是存在alwayson记得将新的数据库插足到可用性数据库组中。

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

3.相对来讲新旧四个数据库的表数据是还是不是相像。

4.配置登陆客户新的数据库权限。

总结

内部存款和储蓄器表是2014新引入的功能由此对于新职能的首先个版本接纳要比较严慎,非常是在线上情形。即使在上线以前做过测量检验,不过鲜明备份那块的测量试验往往比比较简单于被忽视因为还未线上的这种境况。万幸是此次影响的是叁个新上的等级次序数据量和产出都超级小且允许节日假日日停机维护;就算是十分大的种类对此急需导入导出数据明确是特别高烧的工作要害还得看允许停机的时间长度。因为本身在生产情状踩了坑,写那篇文章希望前边的人方可防止踩坑。

备注:内部存款和储蓄器表在二零一四本子的alwayson中无法同步到协助别本,那就变成了它的效果大优惠扣,二〇一六本子能够后生可畏并到扶助别本,提议有法则的第一手上二零一四。

 

 

 

 

备注:

    作者:pursuer.chen

    博客:http://www.cnblogs.com/chenmh

本站点所有随笔都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链接。

《欢迎交流讨论》

本文由澳门在线威尼斯官方发布于电脑数据库,转载请注明出处:威尼斯澳门在线在AlwaysOn上运用内部存款和储蓄器

关键词:

上一篇:【威尼斯澳门在线】中的SOS_SCHEDULE汉兰达_YIELD类

下一篇:没有了