pg_dump和pg_restore:更改目录时"Error Segmentation fault (core dumped)"



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

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

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

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

现在我正在更改我的数据库模式,比如说我向表properties添加了一个新的布尔列isencrypted。我的备份现在已过期,不符合架构。

如何继续?

更改数据前表propertiestoc.dat条目:

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

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

mail.subject.verification       N      N      Mailadresse bestätigen

现在我更改两个文件以匹配新模式:

更改数据后表propertiestoc.data条目:

...@^@^@?^@^@^@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添加到文件中后,长度就不再正确了,从而导致坏数据出现分段错误。

您可以在恢复过程中跳过该表,然后使用psql:手动导入该表,而不是对toc.dat文件进行黑客攻击

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

相关内容

  • 没有找到相关文章

最新更新