docker中postgresql的备份和还原


 

1.备份

本地主机在docker容器内部执行命令的格式:

docker exec  

docker容器都是假设所有的文件是在容器卷中的,如果文件不在docker容器中,你需要在本地主机和容器之间传输。

备份容器中的某个数据库

docker exec -it  /usr/bin/pg_dump \
-U > postgres_backup.sql

远程备份需要指定-h

 

开启备份压缩

docker exec -it  /usr/bin/pg_dump \
-U | gzip -9 > postgres-backup.sql.gz

 

备份容器中的所有的数据库

docker exec -it  /usr/bin/pg_dumpall  \
-U > postgres-backup.sql

 

带有密码的备份

将密码作为环境变量

docker exec -i -e PGPASSWORD=   /usr/bin/pg_dump \
-U | gzip -9 > postgres-backup.sql.gz

 

在容器内部备份

docker exec  /bin/bash \
-c "/usr/bin/pg_dump -U " \
| gzip -9 > postgres-backup.sql.gz

 

带有密码的备份

docker exec  /bin/bash \
-c "export PGPASSWORD= \
    && /usr/bin/pg_dump -U " \
| gzip -9 > postgres-backup.sql.gz

 

2.使用pg_store还原

还原之前,要确认容器的卷和卷的大小

docker ps
docker inspect -f '{{ json .Mounts }}' | 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  : 

然后执行还原:还原之前要确保指定的数据库是已经存在的了

使用数据库用户进行还原

pg_restore -U  -d   

也可以使用docker命令:

docker exec   

3.找出数据库的owner

docker exec  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  pg_restore -U postgres -d some_database /backups/postgres-backup.sql