oceanbase备份恢复原理问题

【 使用版本 】4.1
【问题描述】
oceanbase备份恢复时,是可以通过ALTER SYSTEM RESTORE UNTIL 'timestamp’恢复到指定时间位点。
是按照这个时间位点检查log 的log ts 是否可以恢复。但由于log ts是>= gts分配的事务提交时间戳的。
如果恢复到10点,log ts是否有可能是大于10点?事务的提交时间戳,即所有分支prepared version最大值时10点,那preppare 的log是否可能大于10点?怎么保证按照10点恢复时,能恢复出这个事务?

用户指定恢复到的timestamp在OB内会映射为SCN,此时恢复流程会回放所有log_scn <= SCN值的redo log。对于某些commit version > SCN 的事务,这类事务在日志回放到SCN时,没有commit log,其是最终是commit 还是 abort 取决于后续的用户行为。
1.恢复出来的租户作为备租户使用,在用户执行recover命令后,继续回放日志,随后可以回放到该事物对应的commit log。从而commit。
2.租户恢复完成,用户执行ACTIVATE STANDBY TENANT转成主租户,此时这类事务将会abort掉。

由于prepared version <= commited version。 所以对于问题中10点时该事务的状态是未决的。

用户指定恢复到的timestamp在OB内会映射为SCN,此时恢复流程会回放所有log_scn <= SCN值的redo
怎么确保不会有大于这个SCN的log_scn 的事务日志的提交时间戳都大于用户指定恢复到的timestamp?

即log_scn是否有>= gts分配的事务提交时间戳的场景?

1.怎么确保不会有大于这个SCN的log_scn 的事务日志的提交时间戳都大于用户指定恢复到的timestamp?
对于这个问题,恢复不需要这种保证。恢复要做的只是将timestamp之前的redo log都正确回放即可。
比如一个事务9点50开启,10点10分commit。 用户要恢复到10点。那10点钟的时刻,这个事务就是未commit的。
2.log_scn是否有>= gts分配的事务提交时间戳的场景?
这个问题没理解。如果你指的是用户指定的timestamp是否可能超过当前租户的GTS?那我理解就是用户指定的恢复时间戳为未来的一个时间。这种情况恢复发起就会报错。
可恢复区间的计算你可以参考官方文档:https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000218386 中关于timestamp和scn的选取约束章节。

恢复流程会回放所有log_scn <= SCN值的redo

这个log scn跟事务的提交时间是什么关系呢?比如事务提交完成时间是10点,log scn就是10点吗?

事务提交也会写redo log. 每条redo log会有其对应的log_scn。
简单来说,假如事务在10点提交,其对应的commit log的scn 为 1000。
如果用户恢复到9,对应的scn为900, 900 < 1000. 那么这个事务的commit log就不会回放。
如果用户恢复到11点,对应的scn为 1100, 1100 > 1000, 那么这个事务的commit log就会回放。