暂无图片
暂无图片
3
暂无图片
暂无图片
1
暂无图片

Halo数据库快速恢复数据

陈佳琪 2024-01-18
97

目前常用的数据恢复办法基本都是依靠备份进行恢复,备份包括逻辑备份和物理备份。

逻辑备份与恢复 :利用数据库自带的类似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更新在清除死亡行版本之前,应该推迟多久(以事务数量计)。默认值是零个事务,表示死亡行版本将被尽可能快地清除,即当它们不再对任何打开的事务可见时尽快清除。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

贾桂权
暂无图片
1年前
评论
暂无图片 0
pg_recovery 能够快速在halo数据库恢复误操作数据。该工具支持 update、delete、rollback、dropcolumn 后的数据恢复。
1年前
暂无图片 点赞
评论