AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 231583
Accepted
Ivan Voras
Ivan Voras
Asked: 2019-03-08 08:42:45 +0800 CST2019-03-08 08:42:45 +0800 CST 2019-03-08 08:42:45 +0800 CST

更快地恢复 PostgreSQL 表

  • 772

有一个 PostgreSQL PITR 系统运行在一个相当大的系统上,有数百个数据库,每个数据库有数百个表,当我们试图从单个数据库或一组数据库恢复单个表时,我们遇到了基于时间限制的问题. PITR 由 Barman 管理。

使用此设置,我们需要恢复整个集群(可能包含数十个数据库),然后提取单个表,然后恢复数据——这可能需要数小时。

从统计上讲,由于涉及的数据库数量和涉及的人员数量,这种情况经常发生,以至于成为一个问题。

是否有更快的解决方案可以为我们提供类似 PITR 的功能?我想过pg_dump每小时对每个表单独进行一次手动备份,但也许有更好的解决方案?

postgresql backup
  • 1 1 个回答
  • 235 Views

1 个回答

  • Voted
  1. Best Answer
    jjanes
    2019-03-09T08:33:05+08:002019-03-09T08:33:05+08:00

    我假设您已经尝试过“羞辱人们变得更加小心”的方法但没有成功。

    我想我会尝试一个数据库内解决方案,比如向表中添加时间戳列并为“软删除”添加列而不是进行硬删除,这样您就可以运行查询将表恢复到以前的状态。如果禁止用户级硬删除不是一个选项,那么您可以保留一些日志表,以允许您制作此类恢复性查询。为此,我广泛使用了这个模块,尽管如果我是从头开始,我可能会考虑像这样更现代的东西。执行此日志记录所需的触发器确实会对任何 DML 操作造成相当大的开销,因此您将评估您是否可以容忍这种情况。

    这种方法的一个好处是,您通常可以提出可以修复一个人的错误的查询,而无需在该错误丢失后进行所有更改。当然,如果oopsie的坏数据导致级联错误,因为后面的工作依赖于坏数据,这可能是不可能的。

    如果那行不通,也许混合方法是个好主意。您可以每小时保存一次 pg_dump 快照,并将它们保存 12 小时(或您愿意为此目的投入的任何存储量)。如果您很少需要返回超过 12 小时,则改为回退到 PITR 恢复方法。如果你走这条路,你可能想使用 pg_dump 的-Fc或-Fd选项。这样一来,您每小时只需转储一次数据库,但可以在恢复时选择要恢复的表,而不是转储时间。

    如果你想保持你目前的做法,有很多方法可以让它更快,但这取决于当前的瓶颈是什么。如果瓶颈是在开始恢复之前从存档恢复基本备份,那么您可以只保留一些已经恢复的副本,以便您可以使用预备份快速启动恢复,只需编辑 pg_restore.conf 文件,然后开始。一旦使用过,您就必须将其丢弃并在后台重新创建它,以便下次使用。如果瓶颈是执行 PITR 本身所花费的时间,那么您可以更频繁地进行基础备份并使用最新的备份,该备份足够旧,可用于您所需的恢复时间。这样就可以减少恢复工作。比如每天做一个base backup,但只保留一个从时间开始的,一个从今天开始的,一个从昨天开始的。每次成功完成基本备份后,删除两天前的备份。

    您还可以使用“recovery_min_apply_delay”保持滞后的热备用,它总是落后 12 小时左右,但是当您停止该服务器时,更改配置以将其快进到您需要的时间,完成后将其丢弃并重新创建下一次,它可能不会比只保留最近的基本备份快多少,但会增加一些复杂性。

    • 1

相关问题

  • 运行时间偏移延迟复制的最佳实践

  • Oracle 中的数据库备份 - 导出数据库还是使用其他工具?

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve