参考:http://mysql.taobao.org/monthly/2015/07/03/
https://wiki.postgresql.org/images/e/e5/FOSDEM2013-Timelines.pdf
在做即时恢复时,为了能支持恢复到任意时间点,引入了时间线的概念。
每当存档恢复完成时,就会创建一个新的timeline来标识恢复后生成的一系列WAL记录。时间轴ID号是WAL段文件名的一部分,所以新的时间轴不会覆盖以前的时间轴生成的WAL数据。它的作用为了区分因数据库恢复造成的不同时间段的wal日志,以支持dba在出现数据库down机时依据基础备份和wal日志恢复大宕机之前的任意状态。
wal文件的组成:由16进制命名总共24个字符由三部分组成: 时间线ID + LogId+ logSeg
0000000100000001000000C4
00000001 //时间线ID
00000001 //LogId
000000C4 //logSeg
何时会产生新的时间线?
两种情况:
1、即时恢复(PITR) 配置recovery.conf文件,设置好recovery.conf文件后,启动数据库,将会产生新的timeline,而且会生成一个新的history文件。恢复的默认行为是沿着与当前基本备份相同的时间线恢复。如果你想恢复到某些时间线,你需要指定的recovery.conf目标时间线recovery_target_timeline
,不能恢复到早于基本备份分支的时间点。
比如:
restore_command = 'cp /mnt/server/archivedir/%f %p' //从归档目录恢复日志
recovery_target_time = '2015-7-16 12:00:00 ' //指定归档时间点,如没指定恢复到故障前的最后一完成的事务
recovery_target_timeline = '00000002.history' //指定归档时间线,’latest’代表最新的时间线分支,如没指定恢复到故障前的pg_control里面的时间线
standby_mode = ‘off’ //打开后将会以备库身份启动,而不是即时恢复
2、主备架构,备库promote为主库时,会切换时间线。
每次创建一个新的时间线,PostgreSQL都会创建一个“时间线历史”文件,文件名类似.history,该文件可能含有多行记录,每个记录的内容格式如下:
<parentTLI> <switchpoint> <reason>
parentTLI:ID of the parent timeline
switchpoint: XLogRecPtr of the WAL position where the switch happened
reason: human-readable explanation of why the timeline was changed
比如上图的00000002.history:
#cat 00000002.history
1 0/DE0000D8 no recovery target specified
当数据库在从包含多个时间线的归档中进行恢复时,这些history文件帮助系统选取正确的wal文件。当我们在recovery.conf指定目标时间线tli进行恢复时,程序首先寻找.history文件,根据.history文件里面记录的时间线分支关系,找到从pg_control里面的startTLI到tli之间的所有时间线对应的日志文件,再进行恢复。