【问题标题】:Design: running pg_dump when tables are continuously created and dropped设计:在不断创建和删除表时运行 pg_dump
【发布时间】:2019-06-16 14:23:05
【问题描述】:

我们将 PostgreSQL (v9.5) 作为 the Kappa architecture 的变体中的 Serving DB 运行:

  • 计算作业的每个实例都会创建并填充自己的结果表,例如“t_jobResult_instanceId”。
  • 一旦作业完成,其输出表就可供访问。同一作业类型的多个结果表可能同时使用。
  • 当不需要输出表时,将其删除。

计算结果并不是这个数据库实例中唯一的一种表,我们需要定期进行热备份。这就是我们的问题。当表来来去去时,pg_dump 会死掉。这是一个重现我们的故障模式的简单测试(它涉及 2 个会话,S1 和 S2):

S1 : psql -U postgres -d myuser

create table t1 ( a int );
begin transaction;
drop table t1;

S2 : pg_dump -Fc -v -U postgres -d myuser -f /tmp/rs.dump

S1 : commit;

Session S2 now shows the following error:

pg_dump -Fc -U postgres -d myuser -f /tmp/rs.dump
pg_dump: [archiver (db)] query failed: ERROR: relation "public.t1" does not exist
pg_dump: [archiver (db)] query was: LOCK TABLE public.t1 IN ACCESS SHARE MODE

我们想到了几个解决方案,但我们都不喜欢其中任何一个:

  1. 将所有结果表放入单独的架构中,并从备份中排除该架构。我们喜欢简单,但这种方法破坏了模块化:我们的数据库对象按垂直切片分组到模式中。
  2. 编写在备份期间暂停表删除的应用程序代码。我们想知道是否有更简单的解决方案。

我们喜欢以下想法,但无法实现:

  1. 我们的结果表遵循命名约定。我们可以编写一个正则表达式来确定一个表名是否引用了一个结果表。理想情况下,我们可以运行 pg_dump 并使用参数指示它跳过与此模式匹配的表(请注意,在备份开始时选择要排除的表还不够好,因为可能会在 pg_dump 运行时创建和删除新的结果表)。这要么是不可能的,要么是我们不够聪明,无法弄清楚如何做到这一点。

抱歉背景啰嗦了,但现在我终于到了问题:

  • 有没有办法实现我们错过的 3. ?
  • 有更好的想法吗?

【问题讨论】:

    标签: regex postgresql pg-dump


    【解决方案1】:

    使用pg_dump-T 选项应该可以做到这一点:

    -T <strong><em>table</em></strong>
    --exclude-table=<strong><em>table</em></strong>
    不要转储任何匹配<strong><em>table</em></strong> 模式的表。

    psql 文档详细介绍了这些模式:

    在一个模式中,* 匹配任何字符序列(包括无字符),? 匹配任何单个字符。 (这种表示法类似于 Unix shell 文件名模式。)例如,\dt int* 显示名称以 int 开头的表。但在双引号内,*? 失去了这些特殊含义,只是按字面意思匹配。

    包含点 (.) 的模式被解释为模式名称模式后跟对象名称模式。例如,\dt foo*.*bar* 显示所有表名包含bar 的表,这些表位于架构名称以foo 开头的架构中。如果没有出现点,则该模式仅匹配在当前模式搜索路径中可见的对象。同样,双引号中的点失去了它的特殊含义,并且按照字面意思匹配。

    高级用户可以使用诸如字符类之类的正则表达式表示法,例如[0-9] 来匹配任何数字。所有正则表达式特殊字符都按Section 9.7.3 中指定的方式工作,除了上面提到的. 作为分隔符,* 被翻译成正则表达式符号.*? 被翻译到.$,它们是字面匹配的。您可以在需要时模拟这些模式字符,方法是为. 编写?,为R* 编写(R+|),或为R? 编写(R|)$ 不需要作为正则表达式字符,因为模式必须匹配整个名称,这与正则表达式的通常解释不同(换句话说,$ 会自动附加到您的模式中)。如果您不希望模式被锚定,请在开头和/或结尾写上*。请注意,在双引号内,所有正则表达式特殊字符都会失去其特殊含义并按字面​​意思匹配。

    【讨论】:

    • 非常感谢!为我感到羞耻的时刻。我一直在寻找这个确切的功能,我多次阅读文档但不知何故错过了它。
    猜你喜欢
    • 1970-01-01
    • 2017-12-16
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 2022-06-14
    相关资源
    最近更新 更多