为什么pg_restore segfaulting在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

该命令返回时没有输出或错误,但是什么也没有发生。

因此,我改为尝试手动恢复它:

$ 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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...