共计 1935 个字符,预计需要花费 5 分钟才能阅读完成。
通常,咱们对数据库进行误操作后,须要把数据库 Rollback 到之前的版本。一个罕用的办法就是,应用日志来进行数据库复原。这个办法尽管弱小无效,然而破费工夫等老本较高。而数据库表快照(Snapshot)性能,能够在某些工夫点为数据表创立快照,爱护快照工夫点的数据不被批改,并可依据须要疾速复原快照点数据,从而达到高效、牢靠的数据备份恢复能力。
Snapshot 是一个数据库或表的只读正本,它是数据库表所有数据的映射,由快照被执行的工夫点来决定它的内容。因为快照是只读的,所以查问快照数据是无锁查问,会对查问速度有肯定的晋升。数据快照在报表方面十分有价值,快照设计最开始的目标是为了报表服务。比方,要失去 2021 的资产负债表,须要数据放弃在 2021 年 12 月 31 日零点时的状态,利用快照即可实现。快照也可应用在劫难复原中,用于将现有的数据恢复到现有的快照工夫点,或者在无害数据操作申明的事件中存储个别必要的表和数据。
Part 1 – 比照备份复原计划的优缺点
(1)数据库快照创立时十分快,复原也比拟高效。
(2)数据库快照可解决用户误操作造成的数据失落问题,借助多正本的存储策略,也可应答单机系统故障的数据失落问题。
(3)无奈解决整个集群故障或大面积故障造成的失落数据问题。
(4)除了数据安全保障,“备份 / 复原”计划还能够实现数据的跨集群迁徙,这是数据库快照计划无奈实现的。
Part 2 – 快照应用限度
(1)为了缩小占用存储,一个数据库或一张表限度最多只能有 3 个快照。
(2)为避免应用快照后呈现数据不统一,当表有外键等内部束缚时,无奈创立快照。当表有束缚:主键、UNIQUE、CHECK 时可创立快照。当快照有序列时可创立快照。库创立快照:当该库的表与其余库的表有外键等内部束缚时,无奈创立快照。
(3)在数据库有快照时,无奈减少表、删除表,ALTER 表、TRUNCATE 表、删除库。当表有快照时,无奈删除表,ALTER 表、TRUNCATE 表。
(4)在复原快照期间,该数据库或表无奈有其余事务。
(5)在复原快照时,数据表也无奈有外键等援用。
(6)快照是关联到数据库、表的,因而在删除数据库、表之前,需把关联的快照删除。
图 1
快照的实现次要利用了 MVCC- 多版本并发管制来存储 KV 数据,Key 应用工夫戳作为数据的版本号,同一 Key 的多个版本依照工夫戳倒序排序,如图 1 所示;工夫戳 t = 0 的数据表示写数据的事务还未提交,数据在 WriteIntent 中,值是 Metadata;对于多版本的数据,云溪数据库会定时进行清理,当快照开启时,会爱护快照工夫点对应的数据版本不被清理或批改,并可依据须要疾速复原快照点数据,从而实现数据疾速“备份”和复原。
2.1 快照复原
当须要复原快照点数据时,首先需查看要复原的表或库是否存在内部束缚,表级快照复原只有当没有内部束缚的状况下能力实现快照复原;库级快照复原时,如果库内的表有内部束缚,需查看相关联的表是否在该数据库内,如不在同一数据库内,则无奈复原。
图 2
快照复原时,首先查找建设快照的工夫点,而后须要失去要复原表的元数据 Descriptor,依据 Descriptor 找出所有要复原的数据 Range,构建 Span,最初将 Range 回退到建设快照的工夫点对应的版本。
图 3
图 4
复原 Range 数据到快照工夫点时,须要遍历 Range 内所有 Key 版本, 利用 MVCC 多版本机制,依据同一 Key 的多个版本的工夫戳与快照工夫点进行比拟,将数据恢复到快照工夫点,次要流程为:
(1)快照点后未变动的数据,不解决
(2)快照点后新减少的数据,应用 DELETE 标记笼罩
(3)快照点后批改或删除的数据,应用快照前的值笼罩
复原快照期间遇到写用意时,需清理已提交事务的写用意,未清理的需返回给上游查看写用意状态,如此事务未提交,则无奈进行复原。
2.2 快照与 GC
云溪数据库的 GC 策略是比拟数据表的过期工夫与多余 MVCCKey 的工夫戳,选出工夫戳小于过期工夫的 Key 进行清理;当建设快照时,须要在工夫戳比拟时,减少对快照工夫的比拟:
(1)第一个快照点的 delete 数据可删除
(2)没有快照的 delete 数据可删除
(3)邻近快照点的 delete 数据不能 GC,否则会拜访到更旧的数据
例如,现有如下数据:
减少 2 个快照 s1 和 s2,那么在 GC 筛选垃圾数据时就会有 3 个工夫戳的比拟,则数据表的 GC 示例如下:
在原有的 GC 逻辑中,如果最新的数据已 delete 并过期,那么该数据的所有 Version 都会被清理。但有了快照之后则不能如此操作。比方下面例子中的 Key d,如果把 d@ts25h_1 删除,那么在查问快照 2 的数据时会失去 d@ts2day 数据,而实际上在 ts25h_1 时,数据曾经被标记删除,客户端应该查不到数据才正确。