首页 文章

在docker中恢复postgres

提问于
浏览
5

我遇到了一系列问题,试图使用 docker exec 和postgresql psql 实用程序来恢复在docker 1.3中运行的postgresql安装 . 我通过 docker exec mycontainer pg_dumpall --clean --user=postgres --no-password > /tmp/backup.sql 运行OK备份 .

我遇到了尝试恢复的问题,包括:

  • docker exec 仅在容器运行时有效但 psql 无法通过主动连接的客户端正确恢复

  • pg_ctl stop 将退出postgres服务器进程,该进程将停止主容器和您正在运行的 docker exec 进程 .

  • docker exec 以root身份运行,但 pg_ctl 必须以postgres身份运行(我试图使用pg_ctl来停止postgres,以便还原可以运行)

因此,假设postgresql容器正在运行并为应用程序提供活动连接,我该如何恢复它?寻找关于干净地停止,运行恢复,启动等的细节 .

Env是docker 1.3,postgresql 9.4,数据存在于容器中 /var/lib/postgresql/data 处安装的数据卷中 . 我在docker主机文件系统上有一个有效的 .sql 备份文件 .

Update: 仅供参考我对任何有效的解决方案持开放态度,无论是否涉及 docker exec . 如果我应该运行一个单独的容器并链接到主postgresql容器并通过TCP与它通信,例如,只要我得到一些可行的流程就可以了 .


这是我到目前为止所拥有的 . 建议欢迎 . 它是一个bash脚本(带有一些在构建过程中进行插值的胡子变量),旨在在docker主机上运行 .

#!/bin/bash
docker_sql() {
  docker exec \
    --interactive \
    --tty \
    "${container}" \
    psql --user="${user}" --no-password --file="$1"
}

export DOCKER_HOST=tcp://localhost:2375
container="{{appName}}_db"
user=postgres
backup_path="$1"
if [[ -z "${backup_path}" ]]; then
  echo "Provide a path to a backup file" 1>&2
  exit 1
fi
backup_file=$(basename "${backup_path}")

restore_file=$(echo "${backup_file}" | sed -e s/.\bz2//)
restore_path="/var/lib/postgresql/data/${restore_file}"
bunzip2 --stdout "${backup_path}" > "/var/local/"${container}/"${restore_file}"

terminate_path="/var/lib/postgresql/data/terminate.sql"
cat <<EOF > "/var/local/${container}/terminate.sql"
revoke connect on database {{appName}} from public;
alter database {{appName}} connection limit 0;
select pg_terminate_backend(pid)
  from pg_stat_activity
  where pid <> pg_backend_pid()
  and datname='{{appName}}';
EOF

docker_sql "${terminate_path}"
docker_sql "${restore_path}"

1 回答

  • 3

    如何正常启动和停止数据库?

    ①同一个容器

    如果我有一个将数据库捆绑在同一个容器中的设置,我会有一个容器启动脚本,首先在后台启动PostgreSQL,然后是应用程序的 exec .

    在这种情况下,很容易在应用程序的 exec 之前插入restore命令,关闭容器,

    ②单独的容器

    当然,正如您所说,将数据库服务与应用程序分离,总体上是最佳解决方案 - 毕竟它们是单独的服务 .

    ③管理容器

    您编写的应用程序具有“安装数据卷”的DB文件 . 在这种情况下,您可以创建一个管理容器,该容器也安装了这些文件,它们只启动PostgreSQL,恢复备份,然后再次退出 . 然后,关闭应用程序容器,在同一个数据库卷上启动还原容器,等待它退出,然后再次启动应用程序容器 .

    ④主持人

    同样,您可以在主机上的DB卷上运行PostgreSQL . 这违反了隔离原则,并且需要在主机上设置DB,因此您可能不希望这样做 .

    我的个人推荐

    我首先选择②,然后选择①,然后(在您的设置中)③,然后按优先顺序选择④ .

相关问题