为什么 pg_restore 在 Docker 中出现段错误?
Why is pg_restore segfaulting in Docker?
我正在 docker 容器中为我的 postgres 数据库测试一个 backup/restore 过程。
我这样转储我的数据库:
$ 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
命令returns没有输出或错误,但没有任何反应。
因此,我尝试像这样手动恢复它:
$ 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
传递,然后重定向到主机上的文件中。途中某处,non-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
我正在 docker 容器中为我的 postgres 数据库测试一个 backup/restore 过程。
我这样转储我的数据库:
$ 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
命令returns没有输出或错误,但没有任何反应。
因此,我尝试像这样手动恢复它:
$ 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
传递,然后重定向到主机上的文件中。途中某处,non-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