簡體   English   中英

為什么 Docker 中的 pg_restore 段錯誤?

[英]Why is pg_restore segfaulting in Docker?

我正在 docker 容器內測試我的 postgres 數據庫的備份/恢復過程。

我像這樣轉儲我的數據庫:

$ docker exec -ti my_postgres_container pg_dump -Fc -U postgres > db.dump

之后,我嘗試像這樣恢復它:

$ docker cp db.dump my_postgres_container:/db.dump
$ docker exec -ti my_postgres_container pg_restore -U postgres -c -d postgres db.dump

該命令返回沒有 output 或錯誤,但沒有任何反應。

因此,我嘗試像這樣手動恢復它:

$ docker cp db.dump my_postgres_container:/db.dump
$ docker exec -ti my_postgres_container bash
root@fdaad610bee3:/# pg_restore -U postgres -c -d postgres db.dump
Segmentation fault (core dumped)

為什么在嘗試讀取我的數據庫轉儲時 pg_restore 出現段錯誤?

分析:

該問題是由轉儲數據庫時損壞引起的。 pg_dump產生二進制輸出。 此輸出首先通過 Docker 容器的stdout ,然后重定向到主機上的文件中。 在途中的某個地方,非 ASCII 字節已損壞。

解決方案:

pg_dump寫入Docker 容器內的文件,然后將其復制到主機:

正確的傾銷程序:

docker exec -ti my_postgres_container bash -c 'pg_dump -Fc -U postgres > /db.dump'
docker cp my_postgres_container:/db.dump db.dump

正確的恢復過程:

docker cp db.dump my_postgres_container:/db.dump
docker exec -ti my_postgres_container pg_restore -U postgres -c -d postgres db.dump

對於像我這樣具有損壞轉儲且無法遵循公認答案的人,我在這里找到了解決方法

使用 vim 打開時,轉儲文件的格式為 DOS,
如果您將其更改為 unix ( :set ff=unix ) 並保存,
分段錯誤將 go 消失

這確實有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM