【问题标题】:Cannot restore data from pg_dump due to blank strings being treated as nonexistant data由于空白字符串被视为不存在的数据,因此无法从 pg_dump 恢复数据
【发布时间】:2019-03-09 23:17:14
【问题描述】:

我目前在 PostgreSQL 9.3.9 服务器上有一个数据库,我正在使用 pgdump 以最简单的方式进行备份,例如 pg_dump orb > mar_9_2018.db

其中一个表(链接标签)具有以下定义:

CREATE TABLE linktags (
    linktagid integer NOT NULL,
    linkid integer,
    tagval character varying(1000)
);

当试图通过 PostgreSQL 11.2 恢复数据库时

cat mar_9_2018.db | docker exec -i pg-docker psql -U postgres

(docker container restore) 由于以下错误,表返回空 -

ERROR:  missing data for column "tagval"
CONTEXT:  COPY linktags, line 737: "1185    9325"
 setval

我检查了 db 文件,发现缺少一些选项卡,我希望在其中提供某种信息,显然恢复过程也是如此。

我还验证了数据库中的值是空字符串。

所以——

  • 是否有一种惯用的方法来备份和恢复我丢失的 postgres 数据库?
  • 我的版本是否足够老以至于这个版本的 pg_dump 应该有一些特殊的考虑? 我只是恢复了这个错误吗?

编辑: 我做了一些进一步的研究,发现我在最初检查 NULL 时是不正确的,而是导致问题的空白字符串。

如果我用空字符串和空白字符串创建一个示例表,我可以看到 NULL 得到一个换行符,但空白没有

【问题讨论】:

  • 我验证了版本 10 中的 pg_dump 具有相同的行为。
  • 在 9.5 的 postgres 安装中,pg_dump 默认使用 COPY 语句,对于包含 NULL 值的任何字段,使用制表符分隔值 \N
  • 谢谢@clamp 我弄错了,这个问题只出现在空白字符串上,而不是空值。我已经用其他示例更新了这个问题。
  • 空格也会换行,否则 3 和 4 会在同一行。
  • 此外,如果您在编辑器中检查转储或使用 cat -T ,您应该会在第 3 行和第 4 行看到选项卡。

标签: postgresql docker restore database-backups


【解决方案1】:

pg_dump 可以选择使用INSERT 而不是COPY

pg_dump -d db_name --inserts

正如手册警告的那样,它可能会使恢复速度变慢(并且转储文件更大)。即使在某些不一致的情况下,表格也会被有效的行填充。

另一个问题是空表,pg_dump 生成空的复制语句,如:

COPY config (key, value) FROM stdin;
\.

在这种情况下,您将在重新导入时遇到错误,例如:

 ERROR:  invalid input syntax for type smallint: "  "
CONTEXT:  COPY config, line 1, column group: "  "

--insert 选项不会发生这种情况(不生成插入语句)。

【讨论】:

  • 我没有原始的东西要测试了,但看起来差不多,谢谢!
猜你喜欢
  • 2019-12-07
  • 1970-01-01
  • 2019-06-20
  • 2019-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多