最近一段工作较忙,更新的速度可能会减慢,敬请见谅,后期采用隔天更新的方式

误删除数据的情况,一般都是通过备份,或日志来进行恢复,当然ORACLE FLASHBACK的模式实际上也是对一定期限的数据进行数据的恢复。 对于POSTGRESQL 是否可以进行这样的操作,根据POSTGRESQL 的原理来说是可以的。

下面我们就来操作一下瞬间恢复日志的方式

步骤

1  建立一个数据库

2  建立一个表

3  插入数据

4  删除数据

5  数据恢复

这里面我们主要用到的命令为 pg_waldump  pg_resetwal 

pg_waldump 命令就不多说了,前面有详细的一篇提到过,pg_waldump 的使用和日志的分析。

pg_resetwal 命令这边的好好的说一说, pg_resetwal 主要的工作的目的为为了在系统数据损坏的时候,通过pg_resetwal来重新标志日志的位置,让系统可以重启运行并且重置pg_control文件等等。

You are now connected to database "testn" as user "postgres".

testn=# 

testn=# 

testn=# create table deid (id int, name varchar(20));

CREATE TABLE

testn=# insert into deid (id,name) values (1,'t');

INSERT 0 1

testn=# insert into deid (id,name) values (2,'c');

INSERT 0 1

testn=# 

testn=# delete from deid where id =2 ;

DELETE 1

testn=# select * from deid;

 id | name 

----+------

  1 | t

(1 row)

776f131a52f4c67fe9c28b392c195c26.png

postgres=# \c testn

You are now connected to database "testn" as user "postgres".

testn=# 

testn=# 

testn=# create table deid (id int, name varchar(20));

CREATE TABLE

testn=# insert into deid (id,name) values (1,'t');

INSERT 0 1

testn=# insert into deid (id,name) values (2,'c');

INSERT 0 1

testn=# 

testn=# delete from deid where id =2 ;

DELETE 1

testn=# select * from deid;

 id | name 

----+------

  1 | t

(1 row)

上面我们删除了新插入的数据, 下面我们就通过上面的两个命令将数据还原到删除前的状态

1  步 确认当前的日志的以及LSN号

select pg_current_wal_lsn(),pg_walfile_name(pg_current_wal_lsn()),pg_walfile_name_offset(pg_current_wal_lsn());

2  步根据得到当前的事务号以及日志文件,开始寻找恢复日志的数据范围

8f8a9a994db3cd1b4daffe01bb967bc2.png

3  在找到大约的 delete 前的位置,可以直接通过  LSN 号定位的方式

pg_waldump 00000002000000010000001F 000000020000000100000025 -s 1/7C030CF8

c269d21c7ecdc303eda5f29f20addf74.png

或者通过

pg_waldump 00000002000000010000001F 000000020000000100000025 -r transaction  |  grep  delete 的方式找到准确的删除数据的日志号。

4  在找到并确认事务号的情况下,关闭数据库服务

f856739cb0f2921b290472d12521f73c.png

5   通过指定事务号的方式重置数据库

pg_resetwal -x 464902 -D /pgdata/data/

d38596c7bf5ba016fb58c23a89415fbf.png

6  启动数据库并且查看数据是否恢复

191e19c45a9115b5973c172998105906.png

经过确认数据已经恢复

但这里需要注意几点 

1  在进行了操作后,设置的LSN 号后的数据都取消了,相当于回滚到指定的事务LSN 号的位置

2  WAL 日志整体被清理,原有的日志(单机)会被归并,原有的日志都没有了。

操作之前的日志

97456453aa5fd45c1cdddc9c4f541fd6.png

操作后的日志

a3af4c587d1a4e5664b33d4d881e4b44.png

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐