“时间线”(Timeline)是PG一个很有特色的概念,在备份恢复方面的文档里面时有出现。但针对这个概念的详细解释却很少,也让人不太好理解,我们在此仔细解析一下。

时间线的引入

为了理解引入时间线的背景,我们来分析一下,如果没有时间线,会有什么问题?先举个将数据库恢复到以前时间点的例子。假设在一个数据库的运行过程 中,DBA在周三12:00AM删掉了一个关键的表,但是直到周五中午才发现这个问题。这个时候DBA拿出最初的数据库备份,加上存在归档目录的日志文 件,将数据库恢复到周三11:00AM的时间点,这样就能正常启动和运行。但是,DBA后来意识到这样恢复是不对的,想恢复到周四8:00AM的数据,这 时会发现无法做到:因为在数据库不断运行中,会产生与旧的WAL文件重名的文件,这些文件进入归档目录时,会覆盖原来的旧日志,导致恢复数据库需要的 WAL文件丢失。为了避免这种情况,需要区分原始数据库历史生成的WAL文件和完成恢复之后继续运行产生的(重名的)新WAL文件。整个过程如图1所示:

为了解决这个问题,PostgreSQL引入了时间线的概念。每当归档文件恢复完成后,创建一个新的时间线用来区别新生成的WAL记录。WAL文件名由时间线和日志序号组成,源码实现如下:

#define XLogFileName(fname, tli, log, seg)    \
snprintf(fname, XLOG_DATA_FNAME_LEN + , "%08X%08X%08X", tli, log, seg)

例如:

$ ls -
.history
.history
00000003000000000000001A
00000003000000000000001B

时间线ID号是WAL文件名组成之一,因此一个新的时间线不会覆盖由以前的时间线生成的WAL。如图2所示,每个时间线类似一个分支,在当前时间线的操作不会对其他时间线WAL造成影响,有了时间线,我们就可以恢复到之前的任何时间点。

What happens at a end of recovery?

  • End of recovery means the point where the database opens up for writing
  • New timeline is chosen
  • A timeline history file is written
  • The partial last WAL file on the previous timeline is copied with the new timeline's ID
  • A checkpoint record is written on the new timeline

Example: End of recovery

LOG:  database system was interrupted; last known up at --
:: EET
LOG: starting archive recovery
LOG: redo starts at /E00000C8
LOG: could not open file "pg_xlog/0000000100000013000000E4": No
such file or directory
LOG: redo done at /E3D389A0
LOG: last completed transaction was at log time -- ::+
LOG: selected new timeline ID:
LOG: archive recovery complete
LOG: database system is ready to accept connections

First WAL file with new timeline

aaarticlea/png;base64,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" alt="" />

Timeline history file

0000000100000013000000E1
0000000100000013000000E2
0000000100000013000000E3
0000000100000013000000E4
0000000100000013000000E5
.history
0000000200000013000000E3
0000000200000013000000E4
0000000200000013000000E5

Timeline history file

aaarticlea/png;base64,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" alt="" />

新时间线的出现场景

新的时间线会在什么情况下出现呢?

1、即时恢复(PITR)

   配置recovery.conf文件:

 restore_command = 'cp /mnt/server/archivedir/%f %p' //从归档目录恢复日志
recovery_target_time = '2015-7-16 12:00:00 ' //指定归档时间点,如没指定恢复到故障前的最后一完成的事务
recovery_target_timeline = 'latest' //指定归档时间线,’latest’代表最新的时间线分支,如没指定恢复到故障前的pg_control里面的时间线
standby_mode = ‘off’ //打开后将会以备库身份启动,而不是即时恢复

设置好recovery.conf文件后,启动数据库,将会产生新的timeline,而且会生成一个新的history文件。恢复的默认行为是沿着与当前基本备份相同的时间线恢复。如果你想恢复到某些时间线,你需要指定的recovery.conf目标时间线recovery_target_timeline,不能恢复到早于基本备份分支的时间点。

2、standby promote

搭建一个PG主备,然后停止主库,在备库机器执行:

 $ pg_ctl promote –D $PGDATA

这时候备库将会升为主备,同时产生一个新的timeline,同样生成一个新的history文件。

history文件

每次创建一个新的时间线,PostgreSQL都会创建一个“时间线历史”文件,文件名类似.history,它里面的内容是 由原时间线history文件的内容再追加一条当前时间线切换记录。假设数据库恢复启动后,切换到新的时间线ID=5,那么文件名就是 00000005.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

例如:

$ cat .history
/140000C8 no recovery target specified
/ no recovery target specified
/1F000090 no recovery target specified

当数据库在从包含多个时间线的归档中恢复时,这些history文件允许系统选取正确的WAL文件,当然,它也能像WAL文件一样被归档到WAL归档目录里。历史文件只是很小的文本文件,所以保存它们的代价很小。

当我们在recovery.conf指定目标时间线tli进行恢复时,程序首先寻找.history文件,根据.history文件里面记录的时间线分支关系,找到从pg_control里面的startTLI到tli之间的所有时间线对应的日志文件,再进行恢复。

总结

PG中通过timeline机制能够方便地实现数据库恢复到任意时间点,这对我们数据库备份有重要的作用。我们可以在数据库的使用中合理地备份和归档我们的数据,一旦数据出现丢失或损坏,我们都能有条不紊的使用timeline机制恢复出来我们需要的数据。

参考:

http://mysql.taobao.org/monthly/2015/07/03/

https://wiki.postgresql.org/images/e/e5/FOSDEM2013-Timelines.pdf

postgreSQL 时间线的更多相关文章

  1. PostgreSQL提升为主库 时间线加一的问题

    在使用PostgreSQL高可用集群过程中发现一个很难解决的问题,先记录在这里. 我们知道在PG流复制集群中,如果主库死掉了,备库要提升为主库有两种方法: 1)pg_ctl promote 2)创建对 ...

  2. WPF中的动画——(三)时间线(TimeLine)

    WPF中的动画——(三)时间线(TimeLine) 时间线(TimeLine)表示时间段. 它提供的属性可以让控制该时间段的长度.开始时间.重复次数.该时间段内时间进度的快慢等等.在WPF中内置了如下 ...

  3. ANDROID_MARS学习笔记_S04_007_从服务器获取微博数据时间线

    一.代码 1.xml(1)activity_main.xml <?xml version="1.0" encoding="utf-8"?> < ...

  4. SpriteBuilder中时间线播放音效的弊端

    当你美滋滋的在时间线中播放音效的时候,你要想到音效时间线并不适于播放同步于游戏事件的声音,比如碰撞和加速时. 它同样不能被用来播放背景循环的声音,这就本质上拒绝了通过timeline播放背景音乐.甚至 ...

  5. 如何解决Angular网页内嵌推特时间线无法正常显示

    我最近解决了一个折磨了我好久但是解决方法却只是添加两三行代码的问题.我没有在网上找到合适的解决方案,最后是我根据官方网站和很多的帖子里的部分代码得到的启发,尝试了很久之后得到的解决方法.因为过程实在是 ...

  6. PowerBI功能发布时间线

    DAX/PowerBI系列 - PowerBI功能发布时间线 PowerBI从GA/上线以来,每月发布的功能收集起来做成了一个报表:(耐心等待PowerBI 出来,噔噔噔噔~~~) 上图显示: 1)D ...

  7. CSS之实现垂直时间线展示相关内容效果

    如下,最近在工作中遇到实现时间线效果的需求,用纯css即可实现,下面给出详细实现代码. html: <div class="time_line_list_wrap hide" ...

  8. Python图表数据可视化Seaborn:3. 线性关系数据| 时间线图表| 热图

    1. 线性关系数据可视化 lmplot( ) import numpy as np import pandas as pd import matplotlib.pyplot as plt import ...

  9. echarts的时间线图表

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script sr ...

随机推荐

  1. php大力力 [018节]如何联系大力力

    有事儿就注册博客园,给我发 博客园站内的 短消息呗,唉,没有人联系我呀,啦啦啦,爱我爱我,快点爱我 2015-08-26 php大力力018.如何联系大力力

  2. Java容器类接口的选择

    我们知道Java容器类实际提供了四类接口:Map,List,Set和Queue,如下图所示,每种接口都有不止一个版本的实现,如果在实际编写程序时需要使用某种接口时该如何选择. 从Oracle的Java ...

  3. ajax 提交成功页面跳转问题

    jsx/ajax提交成功后采用以下方式跳转:1.本页面跳转:"window.location.href"."location.href" 2.上一层页面跳转:& ...

  4. 【Tsinghua OJ】范围查询(Range)问题

    [问题描述]数轴上有n个点,对于任一闭区间 [a, b],试计算落在其内的点数. [输入]第一行包括两个整数:点的总数n,查询的次数m.第二行包含n个数,为各个点的坐标.以下m行,各包含两个整数:查询 ...

  5. 【LEETCODE OJ】Binary Tree Preorder Traversal

    Problem Link: http://oj.leetcode.com/problems/binary-tree-preorder-traversal/ Even iterative solutio ...

  6. Java可变参数/可变长参数

    Java可变参数/可变长参数 传递的参数不确定长度,是变长的参数,例如小例子: package demo; public class Demo { public static int sum(int ...

  7. Selenium Grid原理

    转载: http://blog.csdn.net/five3/article/details/9428655 Selenium-Grid版本 selenium-grid分为版本1和版本2,其实它的2个 ...

  8. 第一个Sprint冲刺第十天

    讨论成员:邵家文.李新.朱浩龙.陈俊金 工作:第一个计时功能完成,还有一些复杂的公式已完成.          关于github其实我们团队,还没有搞清楚github的真正用途,我们尚要花时间去学习如 ...

  9. 让UIWebView弹出键盘上的按钮显示中文

    UIWebView是一个很常用的视图,一般用来加载网页,比如百度: 点击文本框输入框后,会弹出一个带有toolbar的键盘,toolbar中有3个辅助按钮 有了这3个按钮,是方便很多,但默认是英文的, ...

  10. (实用篇)php 文件夹删除,清除缓存程序

    <?php header('content-type:text/html;charset=utf-8'); function delFile($fpath) { $filesize = arra ...