1. 程式人生 > 其它 >docker中postgresql的備份和還原

docker中postgresql的備份和還原

 

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