不了解内存表的同学请参阅我之前写的学习笔记:
SQL2014学习笔记1--初识内存优化表
SQL SERVER2014学习笔记2--内存优化表索引简介
SQL2014学习笔记3--内存优化表的事务
------------------------------------------------------------------------------------------------------------------------------------------------
本篇文章先说内存优化表的恢复。
内存优化表的恢复是很多还不了解它的人最怀疑的点:一个存在于内存中的表,怎么保证在断电等异常情况下不丢失数据?
要回答这个问题让我们先来回顾一下传统表是如何处理的:传统的磁盘表,更新操作于内存中和磁盘的日志文件里更新,日志文件写入完毕后,通过checkpoint加载到磁盘中。这样的机制使日志文件里保留了全部的已提交变更。因此当遇到断电或磁盘损坏的情况,只要有完整的日志文件,数据库重启时就可以依据日志文件将没及时提交磁盘的数据文件重新提交,最终保证已提交事务的完整性。
内存优化表由于同样采用了写日志的机制,因此恢复时同样可以像上面的步骤一样恢复它的未提交数据,而与磁盘表主要恢复磁盘文件不同的是,内存表是先根据磁盘里存储的文件对(数据文件和差异文件)在内存中重建并填充好数据,再由日志文件完成已提交事务对内存表的变更。至于磁盘上的文件对则依然由对应的后台线程更新。
上面说的这种机制,也就是在数据库重启时内存表的恢复机制:先在内存中建立表结构并根据表定义分配内存空间,再从磁盘的数据文件读取数据填充内存,最后通过日志文件提交增量数据。
这里有个小知识点:MS在填充内存表数据时,先创建和CPU核数一样多的数据加载器,每个数据加载器分别处理文件对,先加载差异文件,也就是存储delete的文件,然后以这批数据作为筛选器的数据源,选择性的加载数据文件中的数据到内存表中。
------------------------------------------------------------------------------------------------------------------------------------------------
内存表的恢复大概就是这样,下面再说一下内存表的备份和恢复:
内存表的备份分完整备份和差异备份和文件组备份(日志备份和磁盘表完全无差别),日常主要用到的是完整备份和差异备份。
内存表的完整备份就是写日志文件和数据文件到备份文件里,数据文件由于存在差异数据,因此会比实际存储的有效数据占用的磁盘空间更大一些,但也不会大多少,一般也就是10%到20%,考虑到内存表本身的大小也不会太大以及现在磁盘的白菜价,多的这部分基本可以无视。
差异部分就复杂一点了,对于文件对中的数据文件,只备份有增量数据的数据文件,而对于差异文件则是全部备份到差异备份中。
当还原时,同样是恢复的那一套流程,先从备份文件中读取文件对的内容,再加载到内存中,然后就是日志文件的事务处理,这部分和以前是一样的。
------------------------------------------------------------------------------------------------------------------------------------------------
总的来说,在未采用延迟性事务时,内存表的完整性基本可以认为是和磁盘表一样的。而在采取延迟性事务之后,会有一部分的丢失可能,参考我之前写的内存表事务处理机制。