PostgreSQL12数据库备份与恢复主要类型为“恢复到指定时间点、 恢复到指定还原点 和 恢复到指定事务。具体如下:
01-指定时间点
模拟灾难操作
insert into t values(3,'before delete '||now());
select current_timestamp;
2019-12-27 12:53:07.530293+08
delete from t;
恢复操作与测试
$ pg_ctl -D /opt/data5432 stop
$ rm -rf data5432
$ cp -R data-pitr/ data5432
$ vi data5432/postgresql.conf
restore_command = 'cp /opt/archive5432/%f %p'
recovery_target_time='2019-12-27 12:53:07.530293+08'
$ vi data5432/recovery.signal --保存空文件即可
$ pg_ctl -D /opt/data5432 start &
2019-12-27 12:55:15.825 CST [2393] LOG: recovery has paused
2019-12-27 12:55:15.825 CST [2393] HINT: Execute pg_wal_replay_resume() to continue.
$ psql -p5432 -Upostgres
-- 注意此时数据库进入read only 模式
postgres=# delete from t;
ERROR: cannot execute DELETE in a read-only transaction
postgres=# select * from t;
id | info |
---|
| before delete 2019-12-27 12:47:07.919464+08
(3 rows)
postgres=# select pg_wal_replay_resume();
(1 row)
postgres=# delete from t where id=2;
DELETE 1
postgres=# select * from t;
id | info |
---|
创建还原点
select pg_create_restore_point('my_res_point1');
--数据变更
insert into t2 values(4,'data4 '||now());
update t2 set info=null where id=2;
select * from t2 order by id;
id | info |
---|
恢复到还原点“my_res_point1”
$ pg_ctl -D /opt/data5432 stop
$ rm -rf data5432
$ cp -R data-pitr/ data5432
$ vi data5432/postgresql.conf
restore_command = 'cp /opt/archive5432/%f %p'
recovery_target_name='my_res_point1'
$ vi data5432/recovery.signal --保存空文件即可
$ pg_ctl -D /opt/data5432 start &
2019-12-27 13:42:00.626 CST [2554] LOG: recovery stopping at restore point "my_res_point1", time 2019-12-27 13:39:01.703618+08
2019-12-27 13:42:00.626 CST [2554] LOG: recovery has paused
2019-12-27 13:42:00.626 CST [2554] HINT: Execute pg_wal_replay_resume() to continue.
$ psql -p5432 -Upostgres
-- 注意此时数据库进入read only 模式
postgres=# select * from t2;
id | info |
---|
| data3 2019-12-27 13:37:24.834763+08
(3 rows)
postgres=# select pg_wal_replay_resume();
(1 row)
03-指定事务
基础备份
pg_basebackup -D /opt/data-pitr/ -Fp -Xs -v -P -h127.0.0.1 -p5432 -Urepuser
4.开启事务删数据
postgres=# begin;
BEGIN
postgres=# select txid_current();
492
(1 row)
postgres=# delete from t3 where id=3;
DELETE 1
postgres=# end;
COMMIT
postgres=# select * from t3;
id | info |
---|
恢复到事务的xid=491(前面的492-1)
$ pg_ctl -D /opt/data5432 stop
$ rm -rf data5432
$ cp -R data-pitr/ data5432
$ vi data5432/postgresql.conf
restore_command = 'cp /opt/archive5432/%f %p'
recovery_target_xid=491
$ vi data5432/recovery.signal --保存空文件即可
$ pg_ctl -D /opt/data5432 start &
2019-12-27 14:21:47.748 CST [2879] LOG: recovery stopping after abort of transaction 491, time 2019-12-27 14:18:51.63361+08
2019-12-27 14:21:47.748 CST [2879] LOG: recovery has paused
2019-12-27 14:21:47.748 CST [2879] HINT: Execute pg_wal_replay_resume() to continue.
$ psql -p5432 -Upostgres
-- 注意此时数据库进入read only模式
postgres=# select * from t3;
id | info |
---|
| data3 2019-12-27 14:17:12.330043+08
(3 rows)
postgres=# select pg_wal_replay_resume();
(1 row)
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞1
添加新评论0 条评论