需要备份数据、归档日志。
备份方式
逻辑备份工具
一般用于迁移
pg_dump
pg_dumpall
物理备份工具
pg_basebackup
逻辑导入导出
导出:
pg_dump -d dbname > /tmp/dbname.sql
导入:
先建库,再执行
psql </tmp/dbname.sql
pg_basebackup物理备份
类似xbk热备的功能;
备份时先把脏页刷到磁盘上,然后备份数据,然后把归档日志也备走;
备份:
pg_basebackup -D /pgdata/pg_backup/ -Ft -Pv -Upostgres -h 10.10.0.51 -p 5432 -R
恢复:
将数据和归档日志分别解压到对应目录
tar xf base.tar -C /pgdata/12/data/
tar xf pg_wal.tar -C /archive/
修改配置文件postgresql.auto.conf(10版本之前好像叫recovery.conf)
vim postgresql.auto.conf
restore_command = 'cp /archive/%f %p'
recovery_target = 'immediate'
暂时不做主从可以把primary那行注释掉。
新建如下文件:
touch /pgdata/12/data/recovery.signal
会将恢复过程记录进来;没有这个文件其实也没关系。
场景模拟
每天23:00 PBK备份,下午14:00误删除数据,如何恢复?
思路:
1.恢复全被数据 tar xf -c ...
2.日志恢复:备份归档 + 23:00-14:00区间的归档恢复 + 在线redo日志
通过pg_waldump查看在线日志事务编号或者lsn或者时间点,然后不用target,改为
recovery_target_xid = '498'
此时pgsql进入发现仍是只读模式,需要执行
select pg_wal_replay_resume();
到此说明恢复结束
默认情况下,恢复将会一直恢复到 WAL 日志的末尾。可以使用参数用来指定一个更早的停止点。
恢复目标设置
recovery_target = 'immediate'
这个参数指定恢复应该在达到一个一致状态后尽快结束,即尽早结束。
在从一个在线备份中恢复时,这意味着备份结束的那个点。
在技术上,这是一个字符串参数,但是'immediate'是目前唯一允许的值。recovery_target_name (string)
由pg_create_restore_point()所创建,
创建还原点示例:
select pg_create_restore_point('huanyuan');
- recovery_target_time (timestamp)
这个参数指定恢复将进入的时间戳。
查看当前数据库的时间,以使数据库恢复到该时间点:
select current_timestamp;
- recovery_target_xid (string)
这个参数指定恢复将进入的事务 ID。记住虽然事务 ID 是在事务开始时顺序分配的,但是事务可能以不同的数字顺序完成。那些在指定事务之前(也可以包括该事务)提交的事务将被恢复。精确的停止点也受到recovery_target_inclusive的影响。
查看当前数据库的事务 ID,以使数据库恢复到该事务 ID:
select pg_current_xact_id();
- recovery_target_lsn
查看当前的lsn,以使数据库恢复到该lsn:
select pg_current_wal_lsn();
其他:
select pg_create_restore_point('wwj_before_delete');