1. 程式人生 > >PG:資料庫的備份與恢復

PG:資料庫的備份與恢復

一、傳統操作

建立資料庫 並允許備份

該命令為資料庫命令

CREATE DATABASE tutorial;

ALTER DATABASE tutorial SET timescaledb.restoring='on';

ALTER DATABASE tutorial SET timescaledb.restoring='off';

備份資料庫
該命令為終端命令 資料庫外使用
pg_dump命令解釋
錯誤處理

需要確認登陸使用者

pg_dump -U postgres -Fc -f tutorial.bak tutorial;

恢復資料庫

pg_restore -U postgres -Fc -d tutorial tutorial.bak

二、docker連續存檔和恢復

建立docker網路

docker network create timescaledb-net

然後使用新建立的網路啟動TimescaleDB並啟用存檔:

docker run  --network timescaledb-net     -e POSTGRES_PASSWORD=insecure     -e POSTGRES_INITDB_WALDIR=/var/lib/postgresql/data/pg_wal     -e PGDATA=/var/lib/postgresql/data/pg_data     timescale/timescaledb-postgis     -cwal_level=archive     -carchive_mode=on     -carchive_command="/usr/bin/wget wale/wal-push/%f -O -"     -carchive_timeout=600     -ccheckpoint_timeout=700     -cmax_wal_senders=1

要從備份存檔中恢復資料庫例項,請建立一個新的TimescaleDB容器:

docker create \
    --name timescaledb-recovered \
    --network timescaledb-net \
    -e POSTGRES_PASSWORD=insecure \
    -e POSTGRES_INITDB_WALDIR=/var/lib/postgresql/data/pg_wal \
    -e PGDATA=/var/lib/postgresql/data/pg_data \
    timescale/timescaledb:latest-pg10 postgres

現在從基本備份還原資料庫檔案:

docker run -it --rm \
    -v ~/backups:/backups \
    --volumes-from timescaledb-recovered \
    -e WALE_LOG_DESTINATION=stderr \
    -e WALE_FILE_PREFIX=file://localhost/backups \
    timescale/timescaledb-wale:latest \wal-e \
    backup-fetch /var/lib/postgresql/data/pg_data LATEST

重新建立一些配置檔案(通常,這些是舊資料庫例項中備份的配置檔案):

docker run -it --rm  \
    --volumes-from timescaledb-recovered \
    timescale/timescaledb:latest-pg10 \
    cp /usr/local/share/postgresql/pg_ident.conf.sample /var/lib/postgresql/data/pg_data/pg_ident.conf

docker run -it --rm  \
    --volumes-from timescaledb-recovered \
    timescale/timescaledb:latest-pg10 \
    cp /usr/local/share/postgresql/postgresql.conf.sample /var/lib/postgresql/data/pg_data/postgresql.conf

docker run -it --rm  \
    --volumes-from timescaledb-recovered \
    timescale/timescaledb:latest-pg10 \
    sh -c 'echo "local all postgres trust" > /var/lib/postgresql/data/pg_data/pg_hba.conf'

現在建立一個告訴PostgreSQL如何恢復:recovery.conf

docker run -it --rm  \
    --volumes-from timescaledb-recovered \
    timescale/timescaledb:latest-pg10 \
    sh -c 'echo "restore_command='\''/usr/bin/wget wale/wal-fetch/%f -O -'\''" > /var/lib/postgresql/data/pg_data/recovery.conf'

然後再次執行WAL-E邊車(您可能必須先拆除舊的邊車)。它將用於重放可能未在基本備份中反映的最後一個WAL段:

docker run \
    --name wale \
    --network timescaledb-net \
    -v ~/backups:/backups \
    --volumes-from timescaledb-recovered \
    -e WALE_LOG_DESTINATION=stderr \
    -e PGWAL=/var/lib/postgresql/data/pg_wal \
    -e PGDATA=/var/lib/postgresql/data/pg_data \
    -e PGHOST=timescaledb \
    -e PGPASSWORD=insecure \
    -e PGUSER=postgres \
    -e WALE_FILE_PREFIX=file://localhost/backups \
    timescale/timescaledb-wale:latest

最後,啟動TimescaleDB docker容器:

docker start timescaledb-recovered

驗證資料庫是否已成功啟動並恢復:

docker logs timescaledb-recovered

三、單從docker容器資料卷角度的恢復

1、df -h找到原容器資料掛載點

檔案系統                 容量  已用  可用 已用% 掛載點
/dev/mapper/centos-root   50G   17G   34G   34% /
devtmpfs                  16G     0   16G    0% /dev
tmpfs                     16G     0   16G    0% /dev/shm
tmpfs                     16G  1.6G   15G   11% /run
tmpfs                     16G     0   16G    0% /sys/fs/cgroup
/dev/sda1               1014M  142M  873M   14% /boot
/dev/mapper/centos-home  957G  156M  957G    1% /home
overlay                   50G   17G   34G   34% /var/lib/docker/overlay2/d2964b1812274496d6fd3e9602a4dd8eefd4b3b5e0afbfa6f1f6b4b1f37f5a1f/merged
shm                       64M  4.0K   64M    1% /var/lib/docker/containers/a27b18401e4cac04dd84fb5c51151a471c98f95f2dc61a9c6b4c244c47ce3cda/shm
tmpfs                    3.2G     0  3.2G    0% /run/user/0

宿主機目錄=掛載點 以內 , 例如: /home/data

2、掛載命令

docker run --name timescaledb2 -e POSTGRES_PASSWORD=postgres -e POSTGRES_USER=postgres  -v  /home/data:/var/lib/postgresql/data  -d -p 5555:5432  timescale/timescaledb-postgis

-v 宿主機目錄:容器目錄

3、將資料目錄拷貝,可用上述命令啟動一個完全一樣的資料庫