返回顶部
首页 > 资讯 > 数据库 >工具 | 一条 SQL 实现 PostgreSQL 数据找回
  • 336
分享到

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

工具|一条SQL实现PostgreSQL数据找回 2019-03-10 16:03:14 336人浏览 才女
摘要

作者:张连壮 postgresql 研发工程师 从事多年 Postgresql 数据库内核开发,对 citus 有非常深入的研究。 快速找回丢失数据,是数据库的一项重要功能需求,一般建议使用官方推荐的工具。面向开源数据库,生态中也出现

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

作者:张连壮 postgresql 研发工程师

从事多年 Postgresql 数据库内核开发,对 citus 有非常深入的研究。

快速找回丢失数据,是数据库的一项重要功能需求,一般建议使用官方推荐的工具。面向开源数据库,生态中也出现很多好用的开源工具。

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

| 什么是 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/"

初始化插件成功,返回如下信息。

$ 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 
----+----
  1 |  1
  2 |  2
(2 rows)

$ select * from lzzhang;
 id | dp 
----+----
  3 |  3
  3 |  3
(2 rows)

3. 找回 DELETE 数据

尝试恢复 DELETE 的数据。

$ delete from lzzhang;
DELETE 2
lzzhang=# select * from lzzhang;
 id | dp 
----+----
(0 rows)

$ select * from pg_recovery("lzzhang") as (id int, dp int);
 id | dp 
----+----
  1 |  1
  2 |  2
  3 |  3
  3 |  3
(4 rows)

4. 找回 ROLLBACK 数据

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

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

$ select * from pg_recovery("lzzhang") as (id int, dp int);
 id | dp 
----+----
  1 |  1
  2 |  2
  3 |  3
  3 |  3
  4 |  4
(5 rows)

5. 找回 DROP COLUMN 数据

尝试恢复表中被删除的列及数据。

$ 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 
--------
      2
(1 row)

$ select * from lzzhang;
 id 
----
(0 rows)

$ select * from pg_recovery("lzzhang") as (id int, dropped_attnum_2 int);
 id | dropped_attnum_2 
----+------------------
  1 |                1
  2 |                2
  3 |                3
  3 |                3
  4 |                4
(5 rows)

-- dropped_attnum_2: if the drop attnum is 5, set dropped_attnum_2 to dropped_attnum_5

6. 显示找回数据

显示该表历史上所有写入过的数据。

$ insert into lzzhang values(5);
INSERT 0 1
$ select * from lzzhang;
 id 
----
  5
(1 row)

$ select * from pg_recovery("lzzhang", recoveryrow => false) as (id int, recoveryrow bool);
 id | recoveryrow 
----+-------------
  1 | t
  2 | t
  3 | t
  3 | t
  4 | t
  5 | f
(6 rows)

注意事项

  • 支持的 PostgreSQL 版本

目前 pg_revovery工具已支持 PostgreSQL 12/13/14 。

PostgreSQL 通过参数 vacuum_defer_cleanup_age 值大小,可限制可恢复的事务数。如果预期需要恢复的数据量较大,可通过配置参数值,提高可恢复的事务数。

pg_recovery 通过读取 PostgreSQL dead 元组来恢复不可见的表数据。如果元组被 vacuum 清除掉,那么 pg_recovery 便不能恢复数据。

pg_recovery 使用期间,支持正常的读表的锁请求。此外 pg_recovery未使用期间,不会对数据库造成任何额外的开销或是影响,无需暂停服务。

您可能感兴趣的文档:

--结束END--

本文标题: 工具 | 一条 SQL 实现 PostgreSQL 数据找回

本文链接: https://lsjlt.com/news/8937.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 工具 | 一条 SQL 实现 PostgreSQL 数据找回
    作者:张连壮 PostgreSQL 研发工程师 从事多年 PostgreSQL 数据库内核开发,对 citus 有非常深入的研究。 快速找回丢失数据,是数据库的一项重要功能需求,一般建议使用官方推荐的工具。面向开源数据库,生态中也出现...
    99+
    2019-03-10
    工具 | 一条 SQL 实现 PostgreSQL 数据找回
  • Oracle 闪回 找回数据的实现方法
    闪回技术是Oracle强大数据库备份恢复机制的一部分,在数据库发生逻辑错误的时候,闪回技术能提供快速且最小损失的恢复(多数闪回功能都能在数据库联机状态下完成)。需要注意的是,闪回技术旨在快速恢复逻辑错误,对...
    99+
    2024-04-02
  • Python中怎么实现一个数据预测集成工具
    这篇文章给大家介绍Python中怎么实现一个数据预测集成工具,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。数据的训练和训练的GUI窗口经过算法比较,发现这里我们选择使用sklearn简单的多元回归进行拟合数据可以达到比...
    99+
    2023-06-16
  • sql脚本函数编写postgresql数据库实现解析
    这篇文章主要介绍了sql脚本函数编写postgresql数据库实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 postgresql创建Long自增...
    99+
    2024-04-02
  • Python实现一个自助取数查询工具
    目录具体思路:一、数据库连接类二、数据提取主函数模块基于底层数据来开发不难,无非是将用户输入变量作为筛选条件,将参数映射到 sql 语句,并生成一个 sql 语句然后再去数据库执行 最后再利用 QT 开发一个 GUI...
    99+
    2022-06-02
    python 自助取数 python 取数查询
  • 基于PyQt5实现一个串口接数据波形显示工具
    目录工具简述主程序代码Qt Designer设计UI界面程序运行效果工具简述 基于PyQt5开发UI界面使用QtDesigner设计,需要使用到serial模块(串口库)和pyqtg...
    99+
    2023-01-14
    PyQt5数据波形显示工具 PyQt5数据波形显示 PyQt5数据波形
  • 一条sql实现统计总数、分组分别统计总数
    wshanshi:个人使用记录… 一、 方法一 SELECT COALESCE( sex, '总数' ),COUNT( id ) '人数'FROMtestGROUP BYsex WIT...
    99+
    2023-09-02
    sql 数据库 mysql
  • Python Pandas工具绘制数据图怎么实现
    这篇文章主要为大家展示了“Python Pandas工具绘制数据图怎么实现”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Python Pandas工具绘制数据图怎么实现”这篇...
    99+
    2023-06-21
  • oracle如何实现查询当天数据的sql条件
    这篇文章主要介绍了oracle如何实现查询当天数据的sql条件,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。日报数据统计中会用到当天数据的查...
    99+
    2024-04-02
  • Python如何实现实时增量数据加载工具
    这篇文章主要介绍Python如何实现实时增量数据加载工具,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!结合单例模式实际应用案例:实现实时增量数据加载工具的解决方案。最关键的是实现一个可进行添加、修改、删除等操作的增量...
    99+
    2023-06-29
  • 怎样用sql语句实现access随机显现10条数据
    本篇文章为大家展示了怎样用sql语句实现access随机显现10条数据,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 代码如下:select *...
    99+
    2024-04-02
  • 使用xtrabackup工具实现对MySQL数据库备份
    下文给大家带来有关使用xtrabackup工具实现对MySQL数据库备份内容,相信大家一定看过类似的文章。我们给大家带来的有何不同呢?一起来看看正文部分吧,相信看完使用xtrabackup工具实现对MySQ...
    99+
    2024-04-02
  • 使用AJAX工具实现调用mysql数据库方法
    下面一起来了解下使用AJAX工具实现调用mysql数据库方法,相信大家看完肯定会受益匪浅,文字在精不在多,希望使用AJAX工具实现调用mysql数据库方法这篇短内容是你想要的。    &...
    99+
    2024-04-02
  • MySQL数据库实现远程同步的工具alibaba otter
    本篇文章给大家主要讲的是关于MySQL数据库实现远程同步的工具alibaba otter的内容,感兴趣的话就一起来看看这篇文章吧,相信看完MySQL数据库实现远程同步的工具alibaba otter对大家多...
    99+
    2024-04-02
  • Python3 操作 MySQL 插入一条数据并返回主键 id的实例
    Python 中貌似并没有直接返回插入数据 id 的操作(反正我是没找到),但是我们可以变通一下,找到最新插入的数据 #!/usr/bin/env python3 # -*- coding: UTF-8 -*- ...
    99+
    2022-05-27
    Python3 MySQL 插入数据 主键id
  • php怎么实现点击按钮删除一条数据
    PHP是一种流行的服务器端编程语言,具有广泛的应用范围,其中包括将数据从数据库中删除。在本文中,我们将学习如何使用PHP编写代码来实现当用户单击按钮时,从MySQL数据库中删除数据的功能。具体实现方式如下:首先需要建立一个名为“delet&...
    99+
    2023-05-14
    php 数据库
  • Oracle中实现删除重复数据只保留一条
    目录oracle删除重复数据只保留一条Oracle删除重复记录,保留一条,没有主键的情况总结Oracle删除重复数据只保留一条 查询及删除重复记录的SQL语句 1、查找表中多余的重复记录,重复记录是根据单个字段(Id)来...
    99+
    2023-02-15
    Oracle删除重复数据 Oracle删除数据 Oracle保留一条数据
  • php如何实现点击按钮删除一条数据
    这篇文章主要讲解了“php如何实现点击按钮删除一条数据”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php如何实现点击按钮删除一条数据”吧!首先需要建立一个名为“delete.ph...
    99+
    2023-07-05
  • db2分组排序取第一条数据怎么实现
    要在DB2中分组排序并取每组的第一条数据,可以使用以下SQL语句: WITH ranked_data AS ( SELEC...
    99+
    2024-03-13
    db2
  • 新一代数据集成工具ETLCloud入门实践:实现MySQL到ClickHouse的快速迁移
    背景 大数据(BigData)最重要的是数据,没有数据其他的就无从谈起(如今GPT大热,也是得益于海量数据的采集、存储、计算及治理能力的提升)。大数据项目开发的首要任务就是采集海量数据,这就要求我们具备海量数据采集的能力。 在实际工作中,数...
    99+
    2023-08-18
    MySQL ClickHouse ETLCloud 数据集成工具 可视化数据集成
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作