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

问题描述 投票:0回答:2

我当前在 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 容器恢复)由于以下错误,表返回空 -

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

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

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

那么 -

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

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

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

postgresql docker restore database-backups
2个回答
7
投票

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
选项不会发生这种情况(不生成插入语句)。


0
投票

使用刀片会大大减慢恢复速度。我测试了相当小的数据库,5 分钟后我不得不取消导入而没有完成。

但是,您可以使用

--quote-all-identifiers
标志(有关更多信息,请参阅 pg_dump 文档)将空字符串括在引号中。 这样,复制命令可以按预期使用空字符串。

© www.soinside.com 2019 - 2024. All rights reserved.