postgresql – 在docker中恢复postgres
我遇到了一系列问题,试图使用docker exec和
postgresql psql实用程序来恢复在docker 1.3中运行的postgresql安装.我有一个备份运行OK通过docker exec mycontainer pg_dumpall –clean –user = postgres –no-password> /tmp/backup.sql.
我遇到了尝试恢复的问题,包括: > docker exec仅在容器运行时才起作用,但psql无法通过主动连接的客户端正确恢复 因此,假设postgresql容器正在运行并为应用程序提供活动连接,我该如何恢复它?寻找关于干净地停止,运行恢复,启动等的细节. Env是docker 1.3,postgresql 9.4,数据存在于容器中/ var / lib / postgresql / data中的数据卷中.我在docker主机文件系统上有一个有效的.sql备份文件. 更新:仅供参考我对任何有效的解决方案持开放态度,无论是否涉及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}"
如何正常启动和停止数据库?
①同一容器 如果我有一个将数据库捆绑在同一个容器中的设置,我会有一个容器启动脚本,它首先在后台启动PostgreSQL,然后执行该应用程序. 在这种情况下,很容易在应用程序的exec之前插入restore命令,关闭容器, ②分开容器 当然,正如您所说,将数据库服务与应用程序分离,总体上是最佳解决方案 – 毕竟它们是单独的服务. ③管理容器 您编写的应用程序具有“安装数据卷”的DB文件.在这种情况下,您可以创建一个管理容器,该容器也安装了这些文件,它们只启动PostgreSQL,恢复备份,然后再次退出.然后,关闭应用程序容器,在同一个数据库卷上启动还原容器,等待它退出,然后再次启动应用程序容器. ④主持人 同样,您可以在主机上的DB卷上运行PostgreSQL.这违反了隔离原则,并且需要在主机上设置DB,因此您可能不希望这样做. 我的个人建议 我首先选择②,然后选择①,然后(在您的设置中)③,然后按优先顺序选择④. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |