我正在 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
该命令返回时没有输出或错误,但什么也没有发生。
因此,我尝试像这样手动恢复它:
$ 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 字节被损坏。
解决方案:
Let 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)