目前常用的数据恢复办法基本都是依靠备份进行恢复,备份包括逻辑备份和物理备份。
逻辑备份与恢复 :利用数据库自带的类似dump的命令,或者是用图形化界面执行导入导出时,底层就是基于这个dump命令实现的。
优点:简单,方便操作。
缺点:数据数据量比较大,这种方式巨慢,可能导出、导入一天,都无法完所有数据。
物理备份与恢复 :找到当前数据库数据文件在磁盘存储的位置,将数据文件直接复制一份或多份,存储在不同的物理机上。
优点:相比逻辑备份,恢复的速度快。
缺点:在备份数据时,可能数据还正在写入,一定程度上会丢失数据。在恢复数据时,也需要注意数据库的版本和环境必须保持高度的一致。如果是线上正在运行的数据库,这种复制的方式无法在生产环境实现。
以上2中备份和恢复都是能够保证数据的正确完整恢复的,但是日常工作当中,用户或者开发很有可能误删除很小量的数据,但是影响范围很大,需要及时快速的在线进行数据恢复,那就需要一款能在最短时间内恢复误操作的数据的工具。
pg_recovery 能够快速在halo数据库恢复误操作数据。该工具支持 update、delete、rollback、dropcolumn 后的数据恢复。
一、下载编译安装
github下载地址:https://github.com/radondb/pg_recovery
复制
[halo@localhost src]$ ls -rlt pg_recovery-master.zip
复制
-rw-r--r-- 1 root root 13023 10月 30 10:19 pg_recovery-master.zip
复制
[halo@localhost ~]$ unzip pg_recovery-master.zip
复制
Archive: pg_recovery-master.zip
复制
886fc628534b43eb27344aaa07aabcc85f4d0b0e
复制
creating: pg_recovery-master/
复制
inflating: pg_recovery-master/.gitignore
复制
inflating: pg_recovery-master/License
复制
inflating: pg_recovery-master/Makefile
复制
inflating: pg_recovery-master/README.md
复制
inflating: pg_recovery-master/README_zh_CN.md
复制
creating: pg_recovery-master/expected/
复制
inflating: pg_recovery-master/expected/recovery.out
复制
inflating: pg_recovery-master/pg_recovery--1.0.sql
复制
inflating: pg_recovery-master/pg_recovery.c
复制
inflating: pg_recovery-master/pg_recovery.control
复制
creating: pg_recovery-master/sql/
复制
inflating: pg_recovery-master/sql/recovery.sql
复制
[halo@localhost pg_recovery-master]$ cd pg_recovery-master/
复制
[halo@localhost pg_recovery-master]$ make PG_CONFIG=/u01/app/halo/product/dbms/14/bin/pg_config
复制
[halo@localhost pg_recovery-master]$ make install PG_CONFIG=/u01/app/halo/product/dbms/14/bin/pg_config
复制
/bin/mkdir -p '/u01/app/halo/product/dbms/14/lib/postgresql'
复制
/bin/mkdir -p '/u01/app/halo/product/dbms/14/share/postgresql/extension'
复制
/bin/mkdir -p '/u01/app/halo/product/dbms/14/share/postgresql/extension'
复制
/bin/install -c -m 755 pg_recovery.so '/u01/app/halo/product/dbms/14/lib/postgresql/pg_recovery.so'
复制
/bin/install -c -m 644 .//pg_recovery.control '/u01/app/halo/product/dbms/14/share/postgresql/extension/'
复制
/bin/install -c -m 644 .//pg_recovery--1.0.sql '/u01/app/halo/product/dbms/14/share/postgresql/extension/'
复制
二、创建扩展
halo0root=# create extension pg_recovery;
复制
CREATE EXTENSION
复制
halo0root=# \dx pg_recovery
复制
已安装扩展列表
复制
名称 | 版本 | 架构模式 | 描述
复制
-------------+------+----------+---------------------------------------------------------------------
复制
pg_recovery | 1.0 | public | recovery table data of update/delete/rollback rows and drop columns
复制
(1 行记录)
复制
2.1 创建测试数据
halo0root=# create table halo_test(id int,name varchar(20));
CREATE TABLE
halo0root=# insert into halo_test values(1,'杭州');
INSERT 0 1
halo0root=# insert into halo_test values(2,'北京');
INSERT 0 1
halo0root=# select * from halo_test;
id | name
----+------
1 | 杭州
2 | 北京
(2 行记录)
2.2 模拟update修改数据的恢复(recovery update)
halo0root=# update halo_test set id=3,name='重庆' where id=1 and name='杭州';
复制
UPDATE 1
复制
复制
halo0root=# update halo_test set id=4,name='天津' where id=2 and name='北京';
复制
UPDATE 1
复制
复制
halo0root=# select * from halo_test;
复制
id | name
复制
----+------
复制
3 | 重庆
复制
4 | 天津
复制
(2 行记录)
复制
复制
halo0root=# select*from pg_recovery('halo_test')as(id int,name varchar(20));
复制
id | name
复制
----+------
复制
1 | 杭州
复制
2 | 北京
复制
(2 行记录)
复制
2.3 模拟delete删除数据的恢复(recovery delete)
halo0root=# delete from halo_test;
复制
DELETE 2
复制
复制
halo0root=# select * from halo_test;
复制
id | name
复制
----+------
复制
(0 行记录)
复制
复制
halo0root=# select * from pg_recovery('halo_test')as(id int,name varchar(20));
复制
id | name
复制
----+------
复制
1 | 杭州
复制
2 | 北京
复制
3 | 重庆
复制
4 | 天津
复制
(4 行记录)
复制
2.4 恢复回滚操作之前的数据(recovery rollback)
halo0root=# begin;
复制
BEGIN
复制
复制
halo0root=*# insert into halo_test values(5,'南京');
复制
INSERT 0 1
复制
复制
halo0root=*# rollback;
复制
ROLLBACK
复制
复制
halo0root=# select * from halo_test;
复制
id | name
复制
----+------
复制
(0 行记录)
复制
复制
halo0root=# select * from pg_recovery('halo_test')as(id int,name varchar(20));
复制
id | name
复制
----+------
复制
1 | 杭州
复制
2 | 北京
复制
3 | 重庆
复制
4 | 天津
复制
5 | 南京
复制
(5 行记录)
复制
2.5 模拟删除的列(recovery drop column)
halo0root=# alter table halo_test drop column name;
复制
ALTER TABLE
复制
复制
halo0root=# select attnum from pg_attribute a, pg_class where attrelid = pg_class.oid and pg_class.relname='halo_test' and attname ~ 'dropped';
复制
attnum
复制
--------
复制
2
复制
(1 行记录)
复制
复制
halo0root=# select * from halo_test;
复制
id
复制
----
复制
(0 行记录)
复制
复制
halo0root=# select * from pg_recovery('halo_test') as (id int, dropped_attnum_2 varchar(20));
复制
id | dropped_attnum_2
复制
----+------------------
复制
1 | 杭州
复制
2 | 北京
复制
3 | 重庆
复制
4 | 天津
复制
5 | 南京
复制
(5 行记录)
复制
2.6 显示该表历史上所有写入过的数据(show all data)
halo0root=# insert into halo_test values(6);
复制
INSERT 0 1
复制
复制
halo0root=# select * from halo_test;
复制
id
复制
----
复制
6
复制
(1 行记录)
复制
复制
halo0root=# select*from pg_recovery('halo_test', recoveryrow =>false)as(id int, dropped_attnum_2 varchar(20), recoveryrow bool);
复制
id | dropped_attnum_2 | recoveryrow
复制
----+------------------+-------------
复制
1 | 杭州 | t
复制
2 | 北京 | t
复制
3 | 重庆 | t
复制
4 | 天津 | t
复制
5 | 南京 | t
复制
6 | | f
复制
(6 行记录)
复制
三、注意事项
pg_recovery是通过读取postgresql表中的死元组进行数据恢复。
如果表做了vacuum或者vacuum full操作清理了死元组后,pg_recovery无法对表数据进行恢复。
涉及参数 vacuum_defer_cleanup_age (integer)
halo0root=# show vacuum_defer_cleanup_age;
vacuum_defer_cleanup_age
--------------------------
0
(1 row)
指定VACUUM和HOT更新在清除死亡行版本之前,应该推迟多久(以事务数量计)。默认值是零个事务,表示死亡行版本将被尽可能快地清除,即当它们不再对任何打开的事务可见时尽快清除。
评论
