postgresql 时间点数据恢复PITR(point in time recovery)

环境准备

数据库:postgresql 11
系统:阿里云centos7

测试过程

数据库安装过程不再描述。

准备测试环境

//创建保存wal日志归档的目录,并修改目录拥有者
mkdir /usr/wallog_bk
chown postgres:postgres -R wallog_bk

//修改PG数据库配置文件postgresql.conf
vi /usr/pgsql-11/data/postgresql.conf

//修改如下配置项:
wal_level = replica
archive_mode = on		//打开归档功能
archive_command = 'cp %p /usr/wallog_bk/%f' //配置归档命令,拷贝到wal文件到指定目录,%p为实际的wal文件目录,%f为wal文件名称

//保存后重启数据库
su postgres
pg_ctl restart

此时已打开wal日志归档功能。

准备测试数据

创建test库,并在test库中创建test表,并写入1000条数据

postgres=# create database test;
postgres=# \c test
You are now connected to database "test" as user "postgres".
test=# create table test(id int, name text);
CREATE TABLE
test=# insert into test select generate_series(1,1000), md5(random()||'');
INSERT 0 1000

执行基础备份

//使用单独目录存储备份文件
mkdir /usr/base_bk
chown postgres:postgres -R /usr/base_bk

//执行备份
pg_basebackup -p 5432 -D /usr/base_bk/

//成功后可看到已把$PGDATA目录下的文件拷贝到了base_bk目录下

//执行一次wal切换
test=# select pg_switch_wal();
 pg_switch_wal 
---------------
 0/D040370
(1 row)

修改数据

//删除test表中id小于10的数据,模拟误删除数据的操作
postgres=# \c test
You are now connected to database "test" as user "postgres".
test=# delete from test where id < 10;
DELETE 9

//查询出当前时间,根据此时间确定大概的恢复时间点
test=# select now();
              now              
-------------------------------
 2019-10-25 17:45:33.763765+08
(1 row)

恢复数据

//停止数据库运行
bash-4.2$ pg_ctl stop
waiting for server to shut down.... done
server stopped

//重命令data目录
mv data ./data_bk

//新建data目录,并修改权限

mkdir data
chown postgres:postgres -R ./data
chmod 700 ./data

//拷贝/usr/base_bk/目录下的文件到data目录
mv ./base_bk/* ./data/

//配置data目录下的recovery.conf文件,如果没有则创建。
restore_command='cp /usr/wallog_bk/%f %p'		//wal归档的目录
recovery_target_time='2019-10-25 17:40:30.255238'	//恢复到此时刻
recovery_target_timeline='latest'

启动数据库

//启动数据库,启动时即执行恢复操作。
//启动成功,执行解除禁止操作
select pg_wal_replay_resume();

//查询id<10的数据,能正常查到,说明恢复成功
test=# select * from test where id < 10;
 id |               name               
----+----------------------------------
  1 | 67d4422412804d530f07ccc7fa5f1a1f
  2 | 15be34015d86f5b23ef41d6641bd8985
  3 | f4cf64fc19aa935447d54fab6af94f4b
  4 | 89c0b7d47b5ed445abbb5ca3db3f4e8e
  5 | 7d7178c60cc80139ad57988ae83003a2
  6 | e67b95e07c66f15afdd6f194bcbf5b0f
  7 | 4bfda0766325e37c9f898581442c6d71
  8 | 629663fd570b3d6f821c23d76c0978ae
  9 | f478ee063bf3601ce934c674cdab4c92
(9 rows)

recovery.conf配置说明

归档恢复设置

restore_command:用于获取一个已归档段的XLOG日志文件的命令
archive_cleanup_command:清除不在需要的XLOG日志文件的命令
recovery_end_command:归档恢复结束后执行的命令

恢复目标设置(默认情况下,数据库将会一直恢复到 WAL 日志的末尾)
recovery_target = ’immediate’:在从一个在线备 份中恢复时,这意味着备份结束的那个点
recovery_target_name (string):这个参数指定(pg_create_restore_point()所创建)的已命名的恢复点,将恢

复到该恢复点

recovery_target_time (timestamp):这个参数指定恢复到的时间戳
recovery_target_xid (string):这个参数指定恢复到的事务 ID
recovery_target_inclusive (boolean):指定是否在指定的恢复目标之后停止(true),或者在恢复目标之前停止 (false);适用于recovery_target_time或者recovery_target_xid被指定的情况;这个设置分别控制事务是否有准确的目标提交时间或 ID 是否将被包括在该恢复中;默认值为 true
recovery_target_timeline (string):指定恢复到一个特定的时间线
recovery_target_action (enum):指定在达到恢复目标时服务器应该立刻采取的动作,包括pause(暂停)、promote(接受连接)、shutdown(停止服务器),其中pause为默认动作

备库参数设置

standby_mode(boolean):为on表示作为一个备库,否则不为备库
primary_conninfo (string):指定备库连接主库的连接字符串
primary_slot_name (string):通过流复制指定主库的一个复制槽来复制主库数据,如果没有设置primary_conninfo,则此参数无效
trigger_file (string):指定一个触发器文件,该文件存在可以结束备库的恢复,即升级备库为一个独立的主库
recovery_min_apply_delay (integer):这个参数允许将恢复延迟一段固定的时间,如果没有指定单位则以毫秒为单位。
如果recovery.conf中同时指定了recoveryTargetXid、recoveryTargetName、recoveryTargetTime时,PostgreSQL会按照RECOVERY_TARGET_XID> RECOVERY_TARGET_NAME > RECOVERY_TARGET_TIME的优先级来获取最终的目标恢复位点。

如果在recovery.conf指定recovery_targetTimeLine为latest,则可以基于当前TimeLineID为起点寻找最新时间线:

寻找当前TimeLineID的时间线历史文件“XXX.history”,如果存在则继续寻找,否则错误退出
TimeLineID是线性增长的,将当前TimeLineID自增1寻找是否存在时间线历史文件,直到不存在对应的时间线历史文件为止,即可找到最新的时间线。

你可能感兴趣的:(Postgresql)