postgres - pg_dump 备份的方法、注意点 pg_restore, docker
访问量: 1457
本地使用
用法很简单
$ pg_dump --username=postgres --dbname=resumehack_production --host=localhost > your_file.sql
postgres 9.x :
$ pg_dump -U prd_user --host=remote_db_ip_or_domain --compress=1 --schema=public -Fc -o my_db_name > my_db_backup.dump
postgres 11以后,格式变了, 不用 -o, 而是直接 -d my_db_name
$ pg_dump -U prd_user --host=remote_db_ip_or_domain --compress=1 --schema=public -Fc -d my_db_name > my_db_backup.dump
--host=localhost 是不能省略的 。 具体原因看man.
压缩的话, 10分钟 (总共分成9级。9级最慢, 就是这个时间)
不压缩的话,3 分钟
不要压缩,直接 --compress=1
记得在 home_目录下,增加文件:.pgpass
hostname:port:database:username:password
然后 chmod 600 .pgpass
就可以了。
导出远程postgres的数据:
参考:https://stackoverflow.com/questions/29648309/pg-dump-postgres-database-from-remote-server-when-port-5432-is-blocked?rq=1
pg_dump -h 67.8.78.10 -Fc -o -U myuser mydb > mydb_backup.dump
把数据导入到docker postgres
参考:https://simkimsia.com/how-to-restore-database-dumps-for-postgres-in-docker-container/
1. 找到本地docker使用的文件系统。
docker ps 找到对应的container id
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1e5e9fba8562 postgres:9.5 "docker-entrypoint.s…" 3 hours ago Up 21 minutes 0.0.0.0:5433->5432/tcp my_pg_db
然后再看一下这个docker使用的docker文件与本地文件夹的对应关系
$ docker inspect 1e5e9fba8562 | grep estinat -B 3 -A 5 { "Type": "bind", "Source": "G:\\workspace\\banana\\multi_db", "Destination": "/docker-entrypoint-initdb.d", "Mode": "rw", "RW": true, "Propagation": "rprivate" }, { "Type": "bind", "Source": "G:\\workspace\\banana\\tmp\\db", "Destination": "/var/lib/postgresql/data", "Mode": "rw", "RW": true, "Propagation": "rprivate" } ],
可以看到, docker上的 Destination 就是docker file system, host机器上(宿主机)的叫 Source.
所以我们可以使用 '/var/lib/postgresql/data' ,把导出的 dmp文件放进去
docker cp mydb_backup.dump my_pg_db:/var/lib/postgresql/data
然后导入:
pg_restore -U admin -d your_db xx.dump # 完整格式 pg_restore --username=postgres --port=5436 --password --host=172.18.0.8 --dbname=xxx_explorer xxx_db.dump
导入SQL
https://stackoverflow.com/questions/6842393/import-sql-dump-into-postgresql-database
(如果是使用asdf postgres的话)
psql testdatabase < db-structure.sql (前提是 testdatabase要存在)
仅仅导出 数据库的结构
pg_dump -U postgres -s mother > mother_structure.sql
导入该数据库的结构
su postgres # 先切换到postgres 这个用户
psql mother_test < mother_structure.sql #