blu*_*ubb 5 postgresql backup database-backups docker
我正在 docker 容器内测试我的 postgres 数据库的备份/恢复过程。
我像这样转储我的数据库:
$ docker exec -ti my_postgres_container pg_dump -Fc -U postgres > db.dump
Run Code Online (Sandbox Code Playgroud)
之后,我尝试像这样恢复它:
$ docker cp db.dump my_postgres_container:/db.dump
$ docker exec -ti my_postgres_container pg_restore -U postgres -c -d postgres db.dump
Run Code Online (Sandbox Code Playgroud)
该命令返回时没有输出或错误,但没有任何反应。
因此,我尝试像这样手动恢复它:
$ 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)
Run Code Online (Sandbox Code Playgroud)
为什么在尝试读取我的数据库转储时 pg_restore 出现段错误?
分析:
该问题是由转储数据库时损坏引起的。pg_dump产生二进制输出。此输出首先通过 Docker 容器stdout,然后重定向到主机上的文件中。在途中的某个地方,非 ASCII 字节已损坏。
解决方案:
让我们pg_dump写一个泊坞窗容器内的文件,然后进行复制到主机:
正确的倾销程序:
docker exec -ti my_postgres_container bash -c 'pg_dump -Fc -U postgres > /db.dump'
docker cp my_postgres_container:/db.dump db.dump
Run Code Online (Sandbox Code Playgroud)
正确的恢复过程:
docker cp db.dump my_postgres_container:/db.dump
docker exec -ti my_postgres_container pg_restore -U postgres -c -d postgres db.dump
Run Code Online (Sandbox Code Playgroud)
总而言之:-t不必要时不应使用。
我认为对于您的 pg_dump,它-t正在破坏写入 db.dump 的数据。就此而言,-i也是多余的,因为 pg_dump 不需要从标准输入读取。
对于你的 pg_restore,你不需要这两个选项。如果您从容器外部重定向标准输入,那么您需要-i.
我遇到了同样的问题,并通过既不使用也不使用来解决-i它-t使用 pg_dump 解决了它。
我认为以下固定的 pg_dump 应该适合您的情况:
$ docker exec my_postgres_container pg_dump -Fc -U postgres -d postgress > db.dump
Run Code Online (Sandbox Code Playgroud)
顺便说一下,对于 pg_restore,您不需要将转储文件复制到容器中。您可以从主机上的转储文件重定向标准输入:
$ docker exec -i my_postgres_container pg_restore -Fc -c -U postgres -d postgres < db.dump
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
484 次 |
| 最近记录: |