基础备份
在线数据库备份大致分为两类:逻辑备份和物理备份。
逻辑备份有一个缺点:执行需要花费太多的时间,特别是对于大型数据库而言,这是致命伤。相反的是,物理备份可以在相对较短的时间内备份和恢复大型数据库。
在Postgresql里用的主要是物理备份,整个数据库集簇在运行时的快照称基础备份。
时间点恢复(Point-In-Time Recovery, PITR)
PITR模式下的PostgreSQL会在基础备份上重放归档日志中的WAL数据,从pg_start_backup创建的重做点开始,恢复至你想要的位置为止。在PostgreSQL中,要恢复到的位置,被称为恢复目标(recovery target)。
PITR是这样工作的,假设你在GMT时间2018-07-16 12:05:00出了错误。那你应该删掉当前的数据库集簇,并使用之前制作的基础备份恢复一个新的出来。然后,创建一个recovery.conf文件,并在其中将参数recovery_target_time参数配置为你犯错误的时间点(在本例中,也就是12:05 GMT) 。recovery.conf文件如下所示:
#Place archive logs under /mnt/server/archivedir directory.
restore_command = ‘cp /mnt/server/archivedir/%f %p’
recovery_target_time = “2018-7-16 12:05 GMT”
时间线与时间线历史文件
PostgreSQL中的时间线用于区分原始数据库集簇和恢复生成的数据库集簇,它是PITR的核心概念。
时间线标识(TimeLineID)
每个时间线都有一个相应的时间线标识,一个四字节的无符号整数,从1开始计数
每个数据库集簇都会被指定一个时间线标识。由initdb命令创建的原始数据库集簇,其时间线标识为1。每当数据库集簇恢复时,时间线标识都会增加1。例如在前一节的例子中,从原始集簇中恢复得到的集簇,其时间线标识为2。
下图从时间线标识的角度展示了PITR过程。首先,我们删除当前的数据库集簇,并替换为过去的基础备份,以便返回到恢复的起始点,这一步在图中用红色曲线箭头标识。接下来,我们启动PostgreSQL服务器,它通过跟踪初始时间线(时间线标识1),从创建的重做点开始,重放归档日志中的WAL数据,直到恢复目标达成,这一步在图中用蓝色直线箭头标识。接下来,恢复得到的数据库集簇将被分配一个新的时间线标识2,而PostgreSQL将运行在新的时间线上。
时间线历史文件
当PITR过程完成时,会在归档目录和pg_xlog子目录(10或更高版本为pg_wal子目录)下创建名称为00000002.history的时间线历史文件。该文件记录了当前时间线是从哪条时间线分叉出来的,以及分叉的时间。
时间线历史文件至少包含一行,每行由以下三项组成:
1.时间线标识 —— 曾用于恢复的归档日志的时间线。
2.LSN —— 发生WAL段切换的LSN位置。
3.原因 —— 可读的时间线发生变化的原因解释。