【问题标题】:pg_dump and pg_restore: "Error Segmentation fault (core dumped)" when altering table of contentspg_dump 和 pg_restore:更改目录时出现“错误分段错误(核心转储)”
【发布时间】:2017-11-03 18:14:09
【问题描述】:

我目前正在尝试在更改数据库架构时建立数据库备份工作流。

为了备份数据(仅数据),我运行以下命令:

pg_dump --data-only --compress=0 --encoding=utf8 -U my_user -F d -f backup_directory_name my_db_name

这将创建一个新文件夹,其中每个表都有一个文件和目录文件toc.dat

现在我正在更改我的数据库架构,假设我向表 properties 添加了一个新的布尔列 isencrypted。我的备份现在已经过时并且不适合架构。

我该如何进行?

toc.datproperties 的条目在更改数据之前:

    ...@^@^@?^@^@^@COPY properties (key, createdat, updatedat, value) FROM stdin;

在更改数据之前保存表 properties 的所有条目的相关表备份文件:

mail.subject.verification       \N      \N      Mailadresse bestätigen

现在我更改两个文件以匹配新架构:

toc.dataproperties 更改数据后的条目:

    ...@^@^@?^@^@^@COPY properties (key, createdat, updatedat, value, isencrypted) FROM stdin;

修改数据后的相关表备份文件:

mail.subject.verification       \N      \N      Mailadresse bestätigen  f

如果我现在尝试恢复该表,则会收到错误消息。 恢复命令:

$ pg_restore -U my_user --data-only --table=properties --format=d -d my_db_name backup_directory_name

错误:

Segmentation fault (core dumped)

如果我将toc.dat 和备份文件改回原来的样子,错误就消失了(好吧,插入显然会失败,因为架构不同)。

我做错了什么?

【问题讨论】:

  • @a_horse_with_no_name 所以我对 2 个拼写错误投了反对票?
  • 添加列后为什么不创建备份?或者,使用普通 sql 进行转储,然后您可以对其进行编辑。
  • 我正在使用 JPA / hibernate (docs.jboss.org/hibernate/orm/5.0/manual/en-US/html/ch03.html),我必须将 'hibernate.hbm2ddl.auto' 值从 'validate' 设置为 'create' ,导致所有数据完全丢失随着架构的重新创建。我想有单独的文件,所以我不会弄乱其他东西。此外,文件可能会变得很大
  • 没有投了反对票(而且我认为这个问题不值得一票)
  • 哈哈抱歉,看起来像 :) 感谢编辑,我很着急,这个问题让我很生气

标签: postgresql database-backups pg-dump pg-restore


【解决方案1】:

虽然它包含一些可读的字符串,例如COPY properties (key, createdat, updatedat, value, isencrypted) FROM stdin;,但toc.dat 是一个二进制文件。在这些字符串之间的字节中,它们的长度可能是二进制编码的,在您将, isencrypted 添加到文件后不再正确,从而导致错误数据出现分段错误。

您可以在还原过程中跳过该表,然后使用 psql 手动导入它,而不是破解 toc.dat 文件:

psql my_dbname -c '\copy properties (key, createdat, updatedat, value, isencrypted) from 12345678.dat'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    相关资源
    最近更新 更多