Back

postgres - pg_dump 备份的方法、注意点 pg_restore, docker

发布时间: 2019-04-11 23:01:00

本地使用

用法很简单

$ 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   # 

Back