磨砺技术珠矶,践行数据之道,追求卓越价值
回到上一级页面: 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 32812
-rw------- 1 postgres postgres 16777216 Aug 6 14:16 000000010000000000000001 drwx------ 2 postgres postgres 4096 Aug 6 14:16 archive_status -rw------- 1 postgres postgres 16777216 Aug 6 14:16 000000010000000000000002 [postgres@pg201 pgsql]$ [postgres@pg201 pgsql]$ ls -lrt ./arch total 16404
-rw------- 1 postgres postgres 16777216 Aug 6 14:16 000000010000000000000001 [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: 2 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 000000020000000000000005
-rw------- 1 postgres postgres 16777216 Aug 6 15:17 000000020000000000000006
drwx------ 2 postgres postgres 4096 Aug 6 15:17 archive_status
-rw------- 1 postgres postgres 16777216 Aug 6 15:17 000000020000000000000007
[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 00000002.history
-rw------- 1 postgres postgres 16777216 Aug 6 15:17 000000020000000000000006
-rw------- 1 postgres postgres 16777216 Aug 6 15:17 000000020000000000000005
[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索引页
磨砺技术珠矶,践行数据之道,追求卓越价值