工具 | 一条 SQL 实现 PostgreSQL 数据找回

作者:张连壮 PostgreSQL 研发工程师
从事多年 PostgreSQL 数据库内核开发,对 citus 有非常深入的研究。

快速恢复丢失的数据是数据库的重要功能要求,一般推荐使用官方推荐的工具。对于开源数据库,生态中也有很多有用的开源工具。

[En]

Rapid recovery of lost data is an important functional requirement of the database, and it is generally recommended to use officially recommended tools. For open source databases, there are also many useful open source tools in the ecology.

PostgreSQL 是非常流行的开源数据库,接下来介绍一款近期在社区开源的 PostgreSQL 数据找回工具 pg_recovery ,并实例演示如何找回误操作而丢失的数据。

pg_recovery 是一款 PostgreSQL 数据找回工具。可以恢复 COMMIT / DELETE / UPDATE / ROLLBACK / DROP COLUMN 操作后导致的数据变化,并以表的形式返回。安装方便,操作简单。仓库地址:https://github.com/radondb/pg_recovery

快速安装

根据环境配置 PG_CONFIG。

$ make PG_CONFIG=/home/lzzhang/PG/postgresql/base/bin/pg_config
gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -g -g -O0 -fPIC -I. -I./ -I/home/lzzhang/PG/postgresql/base/include/server -I/home/lzzhang/PG/postgresql/base/include/internal  -D_GNU_SOURCE   -c -o pg_recovery.o pg_recovery.c
gcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno-format-truncation -Wno-stringop-truncation -g -g -O0 -fPIC -shared -o pg_recovery.so pg_recovery.o -L/home/lzzhang/PG/postgresql/base/lib    -Wl,--as-needed -Wl,-rpath,'/home/lzzhang/PG/postgresql/base/lib',--enable-new-dtags

$ make install PG_CONFIG=/home/lzzhang/PG/postgresql/base/bin/pg_config
/usr/bin/mkdir -p '/home/lzzhang/PG/postgresql/base/lib'
/usr/bin/mkdir -p '/home/lzzhang/PG/postgresql/base/share/extension'
/usr/bin/mkdir -p '/home/lzzhang/PG/postgresql/base/share/extension'
/usr/bin/install -c -m 755  pg_recovery.so '/home/lzzhang/PG/postgresql/base/lib/pg_recovery.so'
/usr/bin/install -c -m 644 .//pg_recovery.control '/home/lzzhang/PG/postgresql/base/share/extension/'
/usr/bin/install -c -m 644 .//pg_recovery--1.0.sql  '/home/lzzhang/PG/postgresql/base/share/extension/'

插件已成功初始化,并返回以下信息。

[En]

The plug-in was initialized successfully and the following information was returned.

$ create extension pg_recovery ;
CREATE EXTENSION

1. 准备初始化数据

准备一个表和一些数据。

$ create table lzzhang(id int, dp int);
CREATE TABLE
insert into lzzhang values(1, 1);
INSERT 0 1
$ insert into lzzhang values(2, 2);
INSERT 0 1

2. 找回 UPDATE 数据

对数据进行变更操作,不加 WHERE 条件。

$ update lzzhang set id=3, dp=3;
UPDATE 2
lzzhang=# select * from pg_recovery('lzzhang') as (id int, dp int);
 id | dp
  3 |  3
  3 |  3
(2 rows)

3. 找回 DELETE 数据

尝试恢复 DELETE 的数据。

$ delete from lzzhang;
DELETE 2
lzzhang=# select * from lzzhang;
 id | dp
  1 |  1
  2 |  2
  3 |  3
  3 |  3
(4 rows)

4. 找回 ROLLBACK 数据

尝试在回滚操作之前恢复数据。

[En]

Attempt to recover the data before the rollback operation.

$ begin ;
BEGIN
$ insert into lzzhang values(4, 4);
INSERT 0 1
$ rollback ;
ROLLBACK
$ select * from lzzhang;
 id | dp
  1 |  1
  2 |  2
  3 |  3
  3 |  3
  4 |  4
(5 rows)

5. 找回 DROP COLUMN 数据

尝试恢复表中已删除的列和数据。

[En]

Try to recover the deleted columns and data in the table.

`
$ alter table lzzhang drop column dp;
ALTER TABLE
$ select attnum from pg_attribute, pg_class where attrelid = pg_class.oid and pg_class.relname=’lzzhang’ and attname ~ ‘dropped’;
attnum
(0 rows)

$ select * from pg_recovery(‘lzzhang’) as (id int, dropped_attnum_2 int);
id | dropped_attnum_2
5
(1 row)

$ select * from pg_recovery(‘lzzhang’, recoveryrow => false) as (id int, recoveryrow bool);
id | recoveryrow

Original: https://www.cnblogs.com/radondb/p/15598046.html
Author: RadonDB
Title: 工具 | 一条 SQL 实现 PostgreSQL 数据找回

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/508000/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Mysql 数据恢复逻辑 基于binlog redolog undolog

    注:文中有个易混淆的地方”事务” sql事务,即每次数据库操作生成的事务,这个事务trx_id只在undolog里存储,因为MVVC需要记录修改的事务id,…

    数据库 2023年6月16日
    090
  • Linux 学习笔记2(未完待续)

    Linux 学习笔记2 学习Linux的原因 Linux刚面世时并没有图形界面,所有操作全靠命令完成,如磁盘操作、文件读写、目录操作、进程管理、文件权限; 在职场中,大量的服务器维…

    数据库 2023年6月14日
    072
  • 译文 | MySQL 8.0 密码管理策略(一)

    MySQL 8.0 在密码管理方面有很多改善,本文将介绍以下两个特性。 密码重用策略 生成随机密码 简单地说,当您设置新密码时,您可以限制使用以前使用的密码。有两种策略: [En]…

    数据库 2023年5月24日
    076
  • MySql 删除数据表

    定义: 删除数据表就是删除数据库中已经存在的表。请注意,当表被删除时,表的定义和表中的所有数据都将被删除。因此,在执行删除操作之前,最好对表中的数据进行备份,以避免无法挽回的后果。…

    数据库 2023年5月24日
    081
  • 如何设计一个更通用的查询接口

    临近放假,手头的事情没那么多,老是摸鱼也不好,还是写写博客吧。 今天来聊聊: 如何设计一个通用的查询接口。 首先,我们从一个简单的场景开始。现在,我需要一个订单列表,用来查询【我的…

    数据库 2023年6月6日
    097
  • 记录下在阿里云linux上安装与配置Mysql

    环境:阿里云ECS服务器,系统为centos7.2 用户:root 参考博客: https://blog.csdn.net/kunzai6/article/details/8193…

    数据库 2023年6月16日
    0107
  • Javaweb-文件上传和邮件发送

    1.文件上传 新建空项目 准备工作 在maven仓库里下载commons io 和 commons fileupload两个jar包 实用类介绍 文件上传注意事项 为保证服务器安全…

    数据库 2023年6月16日
    081
  • 【01】Maven依赖插件之maven-dependency-plugin

    1、analyze:分析项目依赖,确定哪些是已使用已声明的,哪些是已使用未声明的,哪些是未使用已声明的 2、analyze-dep-mgt:分析项目依赖,列出已解析的依赖项与dep…

    数据库 2023年6月9日
    086
  • 双色球系统开发

    Java对彩票双色球系统开发的简单实现 双色球系统 案例: 中奖条件及奖金表 代码及解释 main方法代码: public static void main(String[] ar…

    数据库 2023年6月16日
    0108
  • eclipse连接MySQL 8.0.29.0

    推荐文章: eclipse导入JDBC MySQL详细安装 菜鸟java MySQL连接教程 步骤: 找到MySQL的连接Java的jar文件; 如下图: 在eclipse项目文件…

    数据库 2023年5月24日
    0102
  • Mybatis-Plus使用 ORDER BY FIELD

    一、Mybatis-Plus使用 ORDER BY FIELD 如图所示 两张仅有一个字段关联的表,商品表想用活动商品表查出来的顺序去查商品可以使用以下方法(不想去XML写Sql的…

    数据库 2023年6月6日
    076
  • mybatis缓存

    加上flushCache=”true”后,再次运行结果如下 2.二级缓存 mybatis的二级缓存默认开启,但真正使用需要在mapper文件中添加相应的缓存…

    数据库 2023年6月16日
    080
  • 2010最危险的编程错误(转)

    网络无处不在的今天,安全问题日益严峻,攻击事件层出不穷,应该说,软件系统中代码存在安全漏洞是主要的祸因之一。而这实际上反映了软件开发人员在编程的安全性方面缺乏必要的培训和常识。 由…

    数据库 2023年6月11日
    092
  • 建议收藏备查!MySQL 常见错误代码说明

    先给大家看几个实例的错误分析与解决方案。 1.ERROR 2002 (HY000): Can’t connect to local MySQL server throu…

    数据库 2023年6月9日
    0123
  • MySQL的插入性能优化

    MySQL的插入性能优化 修改系统变量的方法 一、通过编辑ini配置文件进行修改; 二、通过输入sql命令进行修改; 查询和修改系统变量; 如果要修改全局变量, 必须要显示指定&#…

    数据库 2023年6月14日
    086
  • JUC学习笔记(八)

    JUC学习笔记(一)https://www.cnblogs.com/lm66/p/15118407.htmlJUC学习笔记(二)https://www.cnblogs.com/lm…

    数据库 2023年6月6日
    085
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球