pg_dump和pg_restore:更改目录

时间:2017-11-03 18:14:09

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

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

备份数据(仅数据)我运行此命令:

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.dat

properties条目:

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

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

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

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

改变数据后表toc.data

properties条目:

    ...@^@^@?^@^@^@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和备份文件更改回原来的错误,那么错误就会消失(好吧,因为架构不同,插入会很明显失败)。

我做错了什么?

1 个答案:

答案 0 :(得分: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'