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

标签 postgresql docker restore database-backups

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

demonstration of tabs missing with regular expressions

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

所以 -

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

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

如果我用空字符串创建一个示例表,然后是空白字符串,我可以看到 NULL 换行但空白没有 null values showing a \n and blanks showing no \n

最佳答案

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

关于postgresql - 由于空白字符串被视为不存在的数据,无法从 pg_dump 恢复数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55082930/

相关文章:

Postgresql - 从 500Gb 数据库/自动真空中大量删除?

docker - 什么是docker中间层或镜像?

PostgreSQL - 如何恢复非常大的数据库

database - 从 .bak 文件还原 sql 数据库时出错

sql - SQL中的 ":1"、 ":2"是什么意思?

sql - 使用另一个表中的值更新 postgresql 表

sql - 查询限制和顺序不能在 django 中一起工作

Docker 构建抛出 "react-scripts: not found"错误

docker - 在 Dockerfile 中运行 SQL 脚本

save - 我如何让 fabric.js 保存 Canvas 中每个对象的状态/位置并恢复以供将来编辑?