pg_dump 和 pg_restore:"Error Segmentation fault (core dumped)" 当改变 table 内容时
pg_dump and pg_restore: "Error Segmentation fault (core dumped)" when altering table of contents
我目前正在尝试在更改数据库模式时建立数据库备份工作流。
为了备份数据(只有数据)我运行这个命令:
pg_dump --data-only --compress=0 --encoding=utf8 -U my_user -F d -f backup_directory_name my_db_name
这将创建一个新文件夹,其中每个文件 table 和 table 个内容文件 toc.dat
。
现在我正在更改我的数据库架构,假设我将一个新的布尔列 isencrypted
添加到 table properties
。我的备份现在已经过时并且不符合架构。
我该如何进行?
toc.dat
条目 table properties
更改数据前:
...@^@^@?^@^@^@COPY properties (key, createdat, updatedat, value) FROM stdin;
相关 table 备份文件保存 table properties
的所有条目,然后更改数据:
mail.subject.verification \N \N Mailadresse bestätigen
现在我更改两个文件以匹配新模式:
更改数据后 toc.data
table properties
条目:
...@^@^@?^@^@^@COPY properties (key, createdat, updatedat, value, isencrypted) FROM stdin;
相关table修改数据后的备份文件:
mail.subject.verification \N \N Mailadresse bestätigen f
如果我现在尝试恢复 table,我会收到错误消息。
恢复命令:
$ 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
添加到文件后不再正确,导致错误数据出现分段错误。
您可以在恢复期间跳过 table,然后使用 psql
:
手动导入它,而不是修改 toc.dat
文件
psql my_dbname -c '\copy properties (key, createdat, updatedat, value, isencrypted) from 12345678.dat'
我目前正在尝试在更改数据库模式时建立数据库备份工作流。
为了备份数据(只有数据)我运行这个命令:
pg_dump --data-only --compress=0 --encoding=utf8 -U my_user -F d -f backup_directory_name my_db_name
这将创建一个新文件夹,其中每个文件 table 和 table 个内容文件 toc.dat
。
现在我正在更改我的数据库架构,假设我将一个新的布尔列 isencrypted
添加到 table properties
。我的备份现在已经过时并且不符合架构。
我该如何进行?
toc.dat
条目 table properties
更改数据前:
...@^@^@?^@^@^@COPY properties (key, createdat, updatedat, value) FROM stdin;
相关 table 备份文件保存 table properties
的所有条目,然后更改数据:
mail.subject.verification \N \N Mailadresse bestätigen
现在我更改两个文件以匹配新模式:
更改数据后toc.data
table properties
条目:
...@^@^@?^@^@^@COPY properties (key, createdat, updatedat, value, isencrypted) FROM stdin;
相关table修改数据后的备份文件:
mail.subject.verification \N \N Mailadresse bestätigen f
如果我现在尝试恢复 table,我会收到错误消息。 恢复命令:
$ 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
添加到文件后不再正确,导致错误数据出现分段错误。
您可以在恢复期间跳过 table,然后使用 psql
:
toc.dat
文件
psql my_dbname -c '\copy properties (key, createdat, updatedat, value, isencrypted) from 12345678.dat'