docker中postgresql的备份和还原
2022-05-10 13:02 abce 阅读(3851) 评论(0) 编辑 收藏 举报1.备份
本地主机在docker容器内部执行命令的格式:
docker exec <container_name> <your_command>
docker容器都是假设所有的文件是在容器卷中的,如果文件不在docker容器中,你需要在本地主机和容器之间传输。
备份容器中的某个数据库
docker exec -it <container_name> /usr/bin/pg_dump \
-U <postgresq_user> <postgresql_database> > postgres_backup.sql
远程备份需要指定-h <postgresql_host>
开启备份压缩
docker exec -it <container_name> /usr/bin/pg_dump \
-U <postgresql_user> <postgresql_database> | gzip -9 > postgres-backup.sql.gz
备份容器中的所有的数据库
docker exec -it <container_name> /usr/bin/pg_dumpall \
-U <postgresql_user> > postgres-backup.sql
带有密码的备份
将密码作为环境变量
docker exec -i -e PGPASSWORD=<postgresql_password> <container_name> /usr/bin/pg_dump \
-U <postgresql_user> <postgresql_database> | gzip -9 > postgres-backup.sql.gz
在容器内部备份
docker exec <postgresql_container> /bin/bash \
-c "/usr/bin/pg_dump -U <postgresql_user> <postgresql_database>" \
| gzip -9 > postgres-backup.sql.gz
带有密码的备份
docker exec <postgresql_container> /bin/bash \
-c "export PGPASSWORD=<postgresql_password> \
&& /usr/bin/pg_dump -U <postgresql_user> <postgresql_database>" \
| gzip -9 > postgres-backup.sql.gz
2.使用pg_store还原
还原之前,要确认容器的卷和卷的大小
docker ps
docker inspect -f '{{ json .Mounts }}' <container_id> | python -m json.tool
比如:
[
{
"Type": "volume",
"Name": "my_postgres_backup_local",
"Source": "/var/lib/docker/volumes/my_postgres_backup_local/_data",
"Destination": "/backups",
"Driver": "local",
"Mode": "rw",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "my_postgres_data_local",
"Source": "/var/lib/docker/volumes/my_postgres_data_local/_data",
"Destination": "/var/lib/postgresql/data",
"Driver": "local",
"Mode": "rw",
"RW": true,
"Propagation": ""
}
]
这里的卷路径是/backups和/var/lib/postgresql/data
得到卷的信息后,就需要将dump文件拷贝到指定的卷路径了:
docker cp </path/to/dump/in/host> <container_name>:<path_to_volume>
然后执行还原:还原之前要确保指定的数据库是已经存在的了
使用数据库用户进行还原
pg_restore -U <database_owner> -d <database_name> <path_to_dump>
也可以使用docker命令:
docker exec <container_name> <some_command>
3.找出数据库的owner
docker exec <container_name> psql -U postgres -l
或者
psql -U postgres -l
示例:
$ psql -U postgres -l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+------------+------------+-----------------------
postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres +
| | | | | postgres=CTc/postgres
abce | postgres | UTF8 | en_US.utf8 | en_US.utf8 |
(4 rows)
4.使用docker还原数据库
docker exec <container_name> pg_restore -U postgres -d some_database /backups/postgres-backup.sql
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)