gpt4 book ai didi

postgresql - pg_dump 和 pg_restore : "Error Segmentation fault (core dumped)" when altering table of contents

转载 作者:行者123 更新时间:2023-11-29 13:17:21 24 4
gpt4 key购买 nike

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

为了备份数据(只有数据)我运行这个命令:

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

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

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

我该如何进行?

toc.datproperties 改变数据前的条目:

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

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

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 和备份文件改回原来的样子,错误就消失了(好吧,插入显然会失败,因为架构不同)。

我做错了什么?

最佳答案

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

无需修改 toc.dat 文件,您可以在恢复期间跳过该表,然后使用 psql 手动导入它:

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

关于postgresql - pg_dump 和 pg_restore : "Error Segmentation fault (core dumped)" when altering table of contents,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47102145/

24 4 0