适用于:SQL Server
内存优化表会作为常规数据库备份的一部分进行备份。 对于基于磁盘的表,数据文件与增量文件对的校验和会作为数据库备份的一部分进行验证,以检测存储损坏。
注意
在备份期间,如果检测到内存优化文件组中的一个或多个文件存在校验和错误,备份操作会失败。 在这种情况下,你必须从最近一次已知完好的备份中恢复你的数据库。
如果没有备份,可从内存优化表和基于磁盘的表导出数据,然后在删除并重新创建数据库之后重新加载数据。
包含一个或多个内存优化表的数据库,其完整备份由基于磁盘的表(如有)的已分配存储空间、活动的事务日志,以及内存优化表的数据和增量文件对(也称为检查点文件对)组成。 但是,如 内存优化表的持久性中所述,内存优化表使用的存储可以比其在内存中的大小大得多,会影响数据库备份的大小。
完整数据库备份
此讨论侧重于只有持久内存优化表的数据库的数据库备份,因为基于磁盘的表的备份过程是相同的。 内存优化文件组内的检查点文件对可能处于不同状态。 下表介绍备份的文件部分。
| 检查点文件对状态 | 备份 |
|---|---|
| 预先创建的 | 仅文件元数据 |
| 正在施工中 | 仅限文件元数据 |
| 活动 | 文件元数据加上使用的字节 |
| MERGE 目标 | 仅限文件元数据 |
| 等待日志截断 | 文件元数据加上使用的字节 |
有关检查点文件对的状态说明,请参阅 sys.dm_db_xtp_checkpoint_files (Transact-SQL) 以及其中的 state_desc 列。
具有一个或多个内存优化表的数据库备份的大小通常大于其在内存中的大小,但小于其磁盘上存储。 额外大小取决于删除的行数及其他因素。
估计完整数据库备份的大小
重要
不建议使用 BackupSizeInBytes 值来估计内存中 OLTP 的备份大小。
第一个工作负载场景用于(主要)插入操作。 在此方案中,大多数数据文件处于“活动”状态,已完全加载,且删除的行非常少。 数据库备份的大小接近于内存中的数据大小。
第二个工作负荷方案适用于频繁的插入、删除和更新操作。 在最坏情况下,将已删除的行计算在内后,每对检查点文件都只加载了 50%。 数据库备份的大小至少是内存中的数据大小的 2 倍。
具有内存优化表的数据库的差异备份
如 内存优化表的持久性中所述,内存优化表的存储由数据文件和增量文件构成。 具有内存优化表的数据库的差异备份包含下列数据:
用于存储基于磁盘的表的文件组的差异备份不会受到内存优化表是否存在的影响。
活动事务日志与在完整数据库备份中相同。
对于内存优化数据文件组,差异备份采用与完整数据库备份相同的算法来识别要备份的数据文件和增量文件,但随后会按如下方式筛选出其中一部分文件:
数据文件包含新插入的行,并且在该文件已满时,它会关闭并且标记为只读。 只有在上次完整数据库备份后关闭了数据文件的情况下,才备份该数据文件。 差异备份仅备份包含自上次完整数据库备份后插入的行的数据文件。 一种例外情况是,在更新和删除场景下,某些已插入的行可能已经被标记为待垃圾回收,或者已经被垃圾回收。
增量文件存储对已删除数据行的引用。 因为任何未来的事务都可能删除某一行,所以差异文件在其整个生命周期内都可能被修改,因此它永远不会关闭。 差异文件始终会被备份。 差异文件通常使用不到 10% 的存储空间,因此,差异文件对差异备份大小的影响很小。
如果内存优化表在您的数据库大小中占据很大比例,则差异备份可显著减小数据库备份大小。 对于典型 OLTP 工作负荷,差异备份显著小于完整数据库备份。