最近一段工作较忙,更新的速度可能会减慢,敬请见谅,后期采用隔天更新的方式
误删除数据的情况,一般都是通过备份,或日志来进行恢复,当然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)
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 步根据得到当前的事务号以及日志文件,开始寻找恢复日志的数据范围
3 在找到大约的 delete 前的位置,可以直接通过 LSN 号定位的方式
pg_waldump 00000002000000010000001F 000000020000000100000025 -s 1/7C030CF8
或者通过
pg_waldump 00000002000000010000001F 000000020000000100000025 -r transaction | grep delete 的方式找到准确的删除数据的日志号。
4 在找到并确认事务号的情况下,关闭数据库服务
5 通过指定事务号的方式重置数据库
pg_resetwal -x 464902 -D /pgdata/data/
6 启动数据库并且查看数据是否恢复
经过确认数据已经恢复
但这里需要注意几点
1 在进行了操作后,设置的LSN 号后的数据都取消了,相当于回滚到指定的事务LSN 号的位置
2 WAL 日志整体被清理,原有的日志(单机)会被归并,原有的日志都没有了。
操作之前的日志
操作后的日志