1

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

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

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

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

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

我该如何进行?

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

我究竟做错了什么?

4

1 回答 1

1

尽管它包含一些可读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'
于 2017-11-03T20:51:08.023 回答