
点击上方蓝字关注我们
在任何时间,PostgreSQL在数据集簇目录的pg_wal/子目录下都保持有一个预写式日志(wal)。这个日志存在的目的是为了保证崩溃后的安全:如果系统崩溃,可以“重放”从最后一次检查点以来的日志项来恢复数据库的一致性。
Postgresql在PITR模式下重放基础备份下的归档wal数据,从pg_start_backup创建的REDO点到你要恢复的点,在postgresql中,要恢复的点称为恢复目标。
环境如下:
操作系统:redhat6.8
数据库:11.2
PGHOME=/db/pgsql
PGDATA=/db/pgsql_data


vipostgresql.conf archive_mode= on archive_command= 'cp -i %p db/archive/%f' wal_level= hot_standby |

| $/db/pgsql/bin/pg_ctl -D db/pgsql_data -l logfile start |


模拟数据
创建测试数据库:
| createdatabase aaaa; |
创建表,补充数据
CREATETABLE demo1(id int,name varchar(20)); INSERTINTO demo1 VALUES (1,’xiaowang’), (2,’zhaosi’); aaaa=#select * from demo1; id| name ----+---------- 1| xiaowang 2| zhaosi (2rows) |

aaaa=# select now(); now ------------------------------- 2021-01-19 23:41:56.476472+08 (1 row) aaaa=# select pg_start_backup('bak_ws_2021-01-19 23:41:56'); pg_start_backup ----------------- 0/2000060 (1row) |

| tar-cvzf pgsql_data.tar pgsql_data |

aaaa=#select pg_stop_backup(); NOTICE: pg_stop_backup complete, all required WAL segments have beenarchived pg_stop_backup ---------------- 0/2000168 (1row) aaaa=#select pg_switch_wal(); pg_switch_wal --------------- 0/3000078 (1row) |
注意:从PostgreSQL10 开始将"pg_xlog"目录重命名为"pg_wal",所以很多网上的版本会存在查看pg_xlog

CREATETABLE demo2(id int,name varchar(20)); aaaa=#INSERT INTO demo2 VALUES (1,'xiaoli'),(2,'zhaoqian'); INSERT0 2 |

(1)结束PG服务
aaaa=#\q $/db/pgsql/bin/pg_ctl -D db/pgsql_data/ stop waitingfor server to shut down.... done serverstopped |
(2)模拟数据库毁坏
| rm-rf pgsql_data |
(3)恢复备份文件pgsql_data.tar
| $tar -xvf pgsql_data.tar |
(4)删除pg_wal文件夹并重建
$rm -rf pg_wal $ mkdir -p pg_wal/archive_status |
(5)拷贝recovery.conf文件并修改
| cp$PGHOME/share/recovery.conf.sample $PGDATA/recovery.conf |
直接添加或修改以下参数:
| restore_command= 'cp db/archive/%f "%p"' |
以下参数可以根据需要进行添加:
archive_cleanup_command='pg_archivecleanup/db/archive %r' ###一般来说,设置自动清理archive_log可以在配置文件中添加archive_cleanup_command参数。 recovery_target_time='2021-01-1923:45:12' ###recovery_target_time这是用户自行设定的,如果不写则会恢复到之前接收到的最后一个归档文件。 |
(6)启动数据库:
$/db/pgsql/bin/pg_ctl -D db/pgsql_data -l logfile start pg_ctl:another server might be running; trying to start server anyway waitingfor server to start.... done serverstarted $/db/pgsql/bin/psql postgres postgres psql(11.2) Type"help" for help. postgres=#\c aaaa Youare now connected to database "aaaa" as user "postgres". aaaa=#\dt Listof relations Schema| Name | Type | Owner --------+-------+-------+---------- public| demo1 | table | postgres public| demo2 | table | postgres (2rows) aaaa=#select * from demo2; id| name | age ----+----------+----- 1| xiaoli | 2| zhaoqian | |
(7)查看日志,恢复成功

注:结束后,recovery.conf会改名变成recovery.done。

总结:PITR技术对7*24小时支撑很重要,对于数据库体量很小的,可以增加pg_dump备份频率,对于体量较大数据库就很需要了。需要注意的是pg_dump和pg_dumpall不会产生文件系统级别的备份,并且不能用于连续归档方案。这类转储是逻辑的并且不包含足够的信息用于wal重放。






