zoukankan      html  css  js  c++  java
  • 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 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索引页

    磨砺技术珠矶,践行数据之道,追求卓越价值

  • 相关阅读:
    java 找不到或无法加载主类
    navicat connect error: Authentication plugin 'caching_sha2_password' cannot be loaded
    mysql command
    the diffirent between step into and step over (java)
    20181015
    Eclipse
    游戏2048源代码
    vue的生命周期
    简单快速了解Vue.js的开发流程
    C# 连接西门子PLC
  • 原文地址:https://www.cnblogs.com/gaojian/p/3240509.html
Copyright © 2011-2022 走看看