由于空白字符串被视为不存在的数据,因此无法从pg_dump恢复数据

时间:2019-03-09 23:17:14

标签: postgresql docker restore database-backups

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

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

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

(泊坞窗容器还原)由于以下错误,表返回空-

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

我检查了db文件,发现缺少一些我希望获得某种信息的选项卡,并且显然还原过程也是如此。

demonstration of tabs missing with regular expressions

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

所以-

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

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

如果我创建了一个包含空字符串然后带空字符串的示例表,我可以看到NULL得到换行符,但是空白不null values showing a \n and blanks showing no \n

1 个答案:

答案 0 :(得分:3)

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选项不会发生(不会生成insert语句)。