首页 > 解决方案 > 由于空白字符串被视为不存在的数据,因此无法从 pg_dump 恢复数据

问题描述

我目前在 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 文件,发现缺少一些我希望得到某种信息的选项卡,而且很明显,恢复过程也是如此。

正则表达式缺少选项卡的演示

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

所以 -

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

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

标签: postgresqldockerrestoredatabase-backups

解决方案


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(不生成插入语句)。


推荐阅读