PostgreSQL备份还原基础

需要备份数据、归档日志。

备份方式

逻辑备份工具
一般用于迁移
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');

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容