PostgreSQL PITR实验
磨砺技术珠矶,践行数据之道,追求卓越价值
回到上一级页面: PostgreSQL基础知识与基本操作索引页 回到顶级页面:PostgreSQL索引页
看PostgreSQL中与PITR相关的设定:
wal_level=archive
…
# - Archiving -
archive_mode = on # allows archiving to be done
# (change requires restart)
archive_command = 'cp %p "/usr/local/pgsql/arch/%f"' # command to use to archive a logfile segment
#archive_timeout = 0 # force a logfile segment switch after this
# number of seconds; 0 disables
开始,在运行之前,看xlog状况:
[postgres@pg201 pgsql]$ ls -lrt ./data/pg_xlog
total
-rw------- postgres postgres Aug :
drwx------ postgres postgres Aug : archive_status
-rw------- postgres postgres Aug :
[postgres@pg201 pgsql]$ [postgres@pg201 pgsql]$ ls -lrt ./arch
total
-rw------- postgres postgres Aug :
[postgres@pg201 pgsql]$
为文件拷贝进行准备:
[postgres@pg201 pgsql]$ ./bin/psql
psql (9.1.2)
Type "help" for help. postgres=# select pg_start_backup('gao');
pg_start_backup
-----------------
0/3000020
(1 row) postgres=#
此时,xlog和archive log状况如下:
[postgres@pg201 pgsql]$
[postgres@pg201 pgsql]$ ls -lrt ./data/pg_xlog
total 49216
-rw------- 1 postgres postgres 16777216 Aug 6 14:16 000000010000000000000004
-rw------- 1 postgres postgres 16777216 Aug 6 14:17 000000010000000000000002
drwx------ 2 postgres postgres 4096 Aug 6 14:17 archive_status
-rw------- 1 postgres postgres 16777216 Aug 6 14:17 000000010000000000000003 [postgres@pg201 pgsql]$ ls -lrt ./arch
total 32808
-rw------- 1 postgres postgres 16777216 Aug 6 14:16 000000010000000000000001
-rw------- 1 postgres postgres 16777216 Aug 6 14:17 000000010000000000000002
[postgres@pg201 pgsql]$
完成文件拷贝:
[postgres@pg201 pgsql]$ tar -cvf basedata.tar ./data
结束基础备份:
postgres=# select pg_stop_backup();
NOTICE: pg_stop_backup complete, all required WAL segments have been archived
pg_stop_backup
----------------
0/30000A0
(1 row) postgres=#
再次查看log:
[postgres@pg201 pgsql]$ ls -lrt ./data/pg_xlog
total 49220
-rw------- 1 postgres postgres 16777216 Aug 6 14:16 000000010000000000000004
-rw------- 1 postgres postgres 16777216 Aug 6 14:17 000000010000000000000002
drwx------ 2 postgres postgres 4096 Aug 6 14:20 archive_status
-rw------- 1 postgres postgres 267 Aug 6 14:20 000000010000000000000003.00000020.backup
-rw------- 1 postgres postgres 16777216 Aug 6 14:20 000000010000000000000003
[postgres@pg201 pgsql]$ [postgres@pg201 pgsql]$ ls -lrt ./arch
total 49216
-rw------- 1 postgres postgres 16777216 Aug 6 14:16 000000010000000000000001
-rw------- 1 postgres postgres 16777216 Aug 6 14:17 000000010000000000000002
-rw------- 1 postgres postgres 267 Aug 6 14:20 000000010000000000000003.00000020.backup
-rw------- 1 postgres postgres 16777216 Aug 6 14:20 000000010000000000000003
[postgres@pg201 pgsql]$
可以看到产生了一个backup文件,看内容:
[postgres@pg201 pgsql]$ cat ./data/pg_xlog/000000010000000000000003.00000020.backup
START WAL LOCATION: 0/3000020 (file 000000010000000000000003)
STOP WAL LOCATION: 0/30000A0 (file 000000010000000000000003)
CHECKPOINT LOCATION: 0/3000020
BACKUP METHOD: pg_start_backup
START TIME: 2013-08-06 14:17:53 CST
LABEL: gao
STOP TIME: 2013-08-06 14:20:53 CST
[postgres@pg201 pgsql]$
强制日志切换,模拟大量数据产生导致日志switch:
postgres=# select pg_switch_xlog();
pg_switch_xlog
----------------
0/4000000
(1 row) postgres=#
log发生了变化:
[postgres@pg201 pgsql]$ ls -lrt ./data/pg_xlog
total 49220
-rw------- 1 postgres postgres 16777216 Aug 6 14:20 000000010000000000000006
-rw------- 1 postgres postgres 267 Aug 6 14:20 000000010000000000000003.00000020.backup
-rw------- 1 postgres postgres 16777216 Aug 6 14:25 000000010000000000000004
drwx------ 2 postgres postgres 4096 Aug 6 14:27 archive_status
-rw------- 1 postgres postgres 16777216 Aug 6 14:27 000000010000000000000005
[postgres@pg201 pgsql]$
[postgres@pg201 pgsql]$ ls -lrt ./arch
total 65620
-rw------- 1 postgres postgres 16777216 Aug 6 14:16 000000010000000000000001
-rw------- 1 postgres postgres 16777216 Aug 6 14:17 000000010000000000000002
-rw------- 1 postgres postgres 267 Aug 6 14:20 000000010000000000000003.00000020.backup
-rw------- 1 postgres postgres 16777216 Aug 6 14:20 000000010000000000000003
-rw------- 1 postgres postgres 16777216 Aug 6 14:25 000000010000000000000004
[postgres@pg201 pgsql]$
再作几次log switch,最后是这样:
[postgres@pg201 pgsql]$ ls -lrt ./data/pg_xlog
total 49220
-rw------- 1 postgres postgres 16777216 Aug 6 14:20 000000010000000000000006
-rw------- 1 postgres postgres 267 Aug 6 14:20 000000010000000000000003.00000020.backup
-rw------- 1 postgres postgres 16777216 Aug 6 14:25 000000010000000000000004
drwx------ 2 postgres postgres 4096 Aug 6 14:27 archive_status
-rw------- 1 postgres postgres 16777216 Aug 6 14:27 000000010000000000000005
[postgres@pg201 pgsql]$
[postgres@pg201 pgsql]$ ls -lrt ./arch
total 65620
-rw------- 1 postgres postgres 16777216 Aug 6 14:16 000000010000000000000001
-rw------- 1 postgres postgres 16777216 Aug 6 14:17 000000010000000000000002
-rw------- 1 postgres postgres 267 Aug 6 14:20 000000010000000000000003.00000020.backup
-rw------- 1 postgres postgres 16777216 Aug 6 14:20 000000010000000000000003
-rw------- 1 postgres postgres 16777216 Aug 6 14:25 000000010000000000000004
[postgres@pg201 pgsql]$
经过一次正常关机后,日志再次变化:
[postgres@pg201 pgsql]$ ./bin/pg_ctl -D ./data stop
日志变为:
[postgres@pg201 pgsql]$ ls -lrt ./data/pg_xlog
total 49220
-rw------- 1 postgres postgres 267 Aug 6 14:20 000000010000000000000003.00000020.backup
-rw------- 1 postgres postgres 16777216 Aug 6 14:25 000000010000000000000007
drwx------ 2 postgres postgres 4096 Aug 6 14:39 archive_status
-rw------- 1 postgres postgres 16777216 Aug 6 14:39 000000010000000000000006
-rw------- 1 postgres postgres 16777216 Aug 6 14:39 000000010000000000000005
[postgres@pg201 pgsql]$
[postgres@pg201 pgsql]$ ls -lrt ./arch
total 82024
-rw------- 1 postgres postgres 16777216 Aug 6 14:16 000000010000000000000001
-rw------- 1 postgres postgres 16777216 Aug 6 14:17 000000010000000000000002
-rw------- 1 postgres postgres 267 Aug 6 14:20 000000010000000000000003.00000020.backup
-rw------- 1 postgres postgres 16777216 Aug 6 14:20 000000010000000000000003
-rw------- 1 postgres postgres 16777216 Aug 6 14:25 000000010000000000000004
-rw------- 1 postgres postgres 16777216 Aug 6 14:39 000000010000000000000005
[postgres@pg201 pgsql]$
重新启动PostgreSQL,添加数据,然后杀掉进程,模拟崩溃:
[postgres@pg201 pgsql]$ ./bin/psql
psql (9.1.2)
Type "help" for help. postgres=# create table test(id integer);
CREATE TABLE
postgres=# insert into test values(1);
INSERT 0 1
postgres=# \q
[postgres@pg201 pgsql]$
[root@pg201 ~]# ps -ef | grep post
root 3120 3049 0 14:08 pts/1 00:00:00 su - postgres
postgres 3121 3120 0 14:08 pts/1 00:00:00 -bash
root 3216 3191 0 14:15 pts/2 00:00:00 su - postgres
postgres 3217 3216 0 14:15 pts/2 00:00:00 -bash
root 3299 3279 0 14:17 pts/3 00:00:00 su - postgres
postgres 3300 3299 0 14:17 pts/3 00:00:00 -bash
postgres 3516 1 0 15:00 pts/2 00:00:00 /usr/local/pgsql/bin/postgres -D ./data
postgres 3518 3516 0 15:00 ? 00:00:00 postgres: writer process
postgres 3519 3516 0 15:00 ? 00:00:00 postgres: wal writer process
postgres 3520 3516 0 15:00 ? 00:00:00 postgres: autovacuum launcher process
postgres 3521 3516 0 15:00 ? 00:00:00 postgres: archiver process
postgres 3522 3516 0 15:00 ? 00:00:00 postgres: stats collector process
root 3559 3535 0 15:01 pts/4 00:00:00 grep post
[root@pg201 ~]# kill -s SIGQUIT 3516
[root@pg201 ~]#
下面开始回复动作、找出基础备份:
[postgres@pg201 pgsql]$ tar -xvf basedata.tar ./data
其pg_xlog目录下,还是旧的online redo log:
[postgres@pg201 pg_xlog]$ ls -lrt
total 49216
-rw------- 1 postgres postgres 16777216 Aug 6 14:16 000000010000000000000004
-rw------- 1 postgres postgres 16777216 Aug 6 14:17 000000010000000000000002
drwx------ 2 postgres postgres 4096 Aug 6 14:17 archive_status
-rw------- 1 postgres postgres 16777216 Aug 6 14:17 000000010000000000000003
[postgres@pg201 pg_xlog]$
把它清空后,不补足online redolog,仅仅用 archive log的效果:
在解压好的data目录下,建立 recovery.conf文件:
[postgres@pg201 data]$ cat recovery.conf
restore_command = 'cp /usr/local/pgsql/arch/%f %p'
[postgres@pg201 data]$
启动PostgreSQL:
[postgres@pg201 pgsql]$ ./bin/pg_ctl -D ./data status
pg_ctl: no server running
[postgres@pg201 pgsql]$ ./bin/pg_ctl -D ./data start
pg_ctl: another server might be running; trying to start server anyway
server starting
[postgres@pg201 pgsql]$ LOG: database system was interrupted; last known up at 2013-08-06 14:17:53 CST
LOG: creating missing WAL directory "pg_xlog/archive_status"
LOG: starting archive recovery
LOG: restored log file "000000010000000000000003" from archive
LOG: redo starts at 0/3000078
LOG: consistent recovery state reached at 0/4000000
LOG: restored log file "000000010000000000000004" from archive
LOG: restored log file "000000010000000000000005" from archive
cp: cannot stat `/usr/local/pgsql/arch/000000010000000000000006': No Such File or Directory
LOG: could not open file "pg_xlog/000000010000000000000006" (log file 0, segment 6): No Such File or Directory
LOG: redo done at 0/5000078 LOG: restored log file "000000010000000000000005" from archive cp: cannot stat `/usr/local/pgsql/arch/00000002.history': No Such File or Directory
LOG: selected new timeline ID: cp: cannot stat `/usr/local/pgsql/arch/00000001.history':No Such File or Directory
LOG: archive recovery complete
LOG: autovacuum launcher started
LOG: database system is ready to accept connections
因为我的创建table test 的动作虽然计入了 redo log中,但是由于突然的崩溃,没有来得及放入archive 日志中,所以,没有得到恢复:
[postgres@pg201 pgsql]$ ./bin/psql
psql (9.1.2)
Type "help" for help. postgres=# select * from test;
ERROR: relation "test" does not exist
LINE 1: select * from test;
^
postgres=#
此时,看Log,就可以清晰地看到TimeLine的痕迹了:
[postgres@pg201 pgsql]$ ls -lrt ./data/pg_xlog
total 49220
-rw------- 1 postgres postgres 56 Aug 6 15:11 00000002.history
-rw------- 1 postgres postgres 16777216 Aug 6 15:11 00000000000000000000005
-rw------- 1 postgres postgres 16777216 Aug 6 15:17 00000000000000000000006
drwx------ 2 postgres postgres 4096 Aug 6 15:17 archive_status
-rw------- 1 postgres postgres 16777216 Aug 6 15:17 00000000000000000000007
[postgres@pg201 pgsql]$
[postgres@pg201 pgsql]$ ls -lrt ./arch
total 114836
-rw------- 1 postgres postgres 16777216 Aug 6 14:16 000000010000000000000001
-rw------- 1 postgres postgres 16777216 Aug 6 14:17 000000010000000000000002
-rw------- 1 postgres postgres 267 Aug 6 14:20 000000010000000000000003.00000020.backup
-rw------- 1 postgres postgres 16777216 Aug 6 14:20 000000010000000000000003
-rw------- 1 postgres postgres 16777216 Aug 6 14:25 000000010000000000000004
-rw------- 1 postgres postgres 16777216 Aug 6 14:39 000000010000000000000005
-rw------- 1 postgres postgres 56 Aug 6 15:11 0000000.history
-rw------- 1 postgres postgres 16777216 Aug 6 15:17 00000000000000000000006
-rw------- 1 postgres postgres 16777216 Aug 6 15:17 00000000000000000000005
[postgres@pg201 pgsql]$ cat ./arch/00000002.history
1 000000010000000000000005 no recovery target specified
[postgres@pg201 pgsql]$
这次再看清空pg_xlog目录后,补足online redolog+archive log的效果:
还要把 pg_xlog/archive_status 目录清空:
[postgres@pg201 pgsql]$ cp ./data.bak/pg_xlog/* ./data/pg_xlog/
... [postgres@pg201 pg_xlog]$ ls -lrt
total 98432
-rw------- 1 postgres postgres 16777216 Aug 6 14:16 000000010000000000000004
-rw------- 1 postgres postgres 16777216 Aug 6 14:17 000000010000000000000002
-rw------- 1 postgres postgres 16777216 Aug 6 14:17 000000010000000000000003
-rw------- 1 postgres postgres 267 Aug 6 15:41 000000010000000000000003.00000020.backup
-rw------- 1 postgres postgres 16777216 Aug 6 15:41 000000010000000000000007
-rw------- 1 postgres postgres 16777216 Aug 6 15:41 000000010000000000000006
-rw------- 1 postgres postgres 16777216 Aug 6 15:41 000000010000000000000005
drwx------ 2 postgres postgres 4096 Aug 6 15:44 archive_status
[postgres@pg201 pg_xlog]$
此时,启动 PostgreSQL:
[postgres@pg201 pgsql]$ ./bin/pg_ctl -D ./data start
pg_ctl: another server might be running; trying to start server anyway
server starting
[postgres@pg201 pgsql]$ LOG: database system was interrupted; last known up at 2013-08-06 14:17:53 CST
LOG: starting archive recovery
LOG: restored log file "000000010000000000000003" from archive
LOG: redo starts at 0/3000078
LOG: consistent recovery state reached at 0/4000000
LOG: restored log file "000000010000000000000004" from archive
LOG: restored log file "000000010000000000000005" from archive
cp: cannot stat `/usr/local/pgsql/arch/000000010000000000000006': No such file or directory
LOG: record with zero length at 0/6011770
LOG: redo done at 0/6011730
LOG: last completed transaction was at log time 2013-08-06 15:01:17.757945+08
LOG: restored log file "00000002.history" from archive
cp: cannot stat `/usr/local/pgsql/arch/00000003.history': No such file or directory
LOG: selected new timeline ID: 3
cp: cannot stat `/usr/local/pgsql/arch/00000001.history': No such file or directory
LOG: archive recovery complete
LOG: autovacuum launcher started
LOG: database system is ready to accept connections
看数据:
[postgres@pg201 pgsql]$ ./bin/psql
psql (9.1.2)
Type "help" for help. postgres=# select * from test;
id
----
1
(1 row) postgres=#
回到上一级页面: PostgreSQL基础知识与基本操作索引页 回到顶级页面:PostgreSQL索引页
磨砺技术珠矶,践行数据之道,追求卓越价值
PostgreSQL PITR实验的更多相关文章
- PostgreSQL基础知识与基本操作索引页
磨砺技术珠矶,践行数据之道,追求卓越价值 返回顶级页:PostgreSQL索引页 luckyjackgao@gmail.com 本页记录所有本人所写的PostgreSQL的基础知识和基本操作相关文摘和 ...
- PostgreSQL的PITR中,对 unfilled wal log 如何处理为好
磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL基础知识与基本操作索引页 回到顶级页面:PostgreSQL索引页 通过实验,可以发现,PostgreSQL中使 ...
- PostgreSQL LIKE 查询效率提升实验<转>
一.未做索引的查询效率 作为对比,先对未索引的查询做测试 EXPLAIN ANALYZE select * from gallery_map where author = '曹志耘'; QUERY P ...
- PostgreSQL数据库表名的大小写实验
磨砺技术珠矶,践行数据之道,追求卓越价值回到上一级页面:PostgreSQL基础知识与基本操作索引页 回到顶级页面:PostgreSQL索引页[作者 高健@博客园 luckyjackgao@g ...
- postgresql基于备份点PITR恢复
实验目的: 01.基于备份点直接恢复数据库 02.基于备份点后续增量wal日志恢复到特定的时间点 实验环境: centos7 postgresql9.5 01.安装postgresql9.5 post ...
- PostgreSQL的 PITR实战---运用 recovery_target_time
磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL基础知识与基本操作索引页 回到顶级页面:PostgreSQL索引页 看了很多的例子,没有发现具体讲 recove ...
- PostgreSQL的xlog实验一
磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL基础知识与基本操作索引页 回到顶级页面:PostgreSQL索引页 一,从initdb开始,initdb执行结束 ...
- PostgreSQL设置事务隔离级别实验
apple=# begin; BEGIN apple=# set transaction ISOLATION LEVEL read committed ; SET apple=# select * f ...
- 对PostgreSQL数据库的hstore类型建立GisT索引的实验
磨砺技术珠矶,践行数据之道,追求卓越价值回到上一级页面:PostgreSQL基础知识与基本操作索引页 回到顶级页面:PostgreSQL索引页[作者 高健@博客园 luckyjackgao@g ...
随机推荐
- 使用eclipse遇到的unable to install breakpoint的问题
调试一个tomcat工程,设置好断点,启动工程,结果出现了下面的错误: 继续运行,再进入断点之前,还会再度提示,但是最终会命中断点. 使用CGLIB查找关键字,了解到CGLIB是一个AOP的拦截库,想 ...
- sql server 查询ntext字段长度
DATALENGTH 返回任何表达式所占用的字节数. 语法 DATALENGTH ( expression ) 参数 expression 任何类型的表达式. 返回类型 int 注释 DATALENG ...
- systemd 之 systemctl
Systemd 常规操作与彩蛋 一.前言 上了俩个月的RHCE工程师的班,收获颇多.话说回来,在 redhat 7 中有个非常重要的概念,即:systemd systemd 是 Linux 下的一款系 ...
- iOS8中的定位服务
iOS8中的定位服务 My app that worked fine in iOS 7 doesn't work with the iOS 8 SDK. CLLocationManager doesn ...
- November 25th 2016 Week 48th Friday
People will fall for its appearance while driving passionately. 观者倾心,驭者动魄. This is an advertisement ...
- 心情烦闷annoying,贴几个图!唉!annoying
nothing could be more annoying!!!!! lost!failed!
- QT 登录记住密码方法之一:Qt QSettings读写配置文件
不过本文写的是明文保存,最好还是加密一下,以防文件被非法读取 /**登录初始化的时候处理这部分操作*/ Settings cfg("user.ini",QSettings::Ini ...
- java Calendar日历类
~Calendar类是一个抽象类,为特定瞬间与一组诸如YEAR,MONTH,DAY_OF_MONTH,HOUR等日历字段之间的转换提供了一些方 法,并为操作日历字段(例如获得下星期的日期)提供了一些方 ...
- BZOJ 2330 糖果 差分约束求最小值
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2330 题目大意: 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果 ...
- 理解JVM——类加载机制
我们在编写Java程序之后,会通过编译器得到一个class文件,这个class文件是如何与JVM进行配合的呢?类中的信息是如何变成JVM可以使用的Java类型呢?这些都是类加载机制做到的. 虚拟机把描 ...