[英]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.