PGSQL のスケジュールされたリモート完全データベース バックアップ戦略

PGSQL のスケジュールされたリモート完全データベース バックアップ戦略

1.容器を準備する

リモート pg ライブラリに接続するための postgres コンテナ イメージを準備する

画像-20230331113350649

サンプル起動スクリプト

docker run -d --restart always --name postgres -p 5432:5432 -v /etc/localtime:/etc/localtime:ro -e POSTGRES_PASSWORD=123456-v /data/pg:/var/lib/postgresql/data mdillon/postgis:latest

ここでは、/data/pg ディレクトリを pgsql のデータ ディレクトリ領域にマウントしたことがわかります。

2. プロファイル環境変数を準備する

例:

上記はすべてデフォルトですが、ポイントはリモートでログインする必要がある pg ライブラリのパスワードを PGPASSWORD に入力することです。

# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

if [ "`id -u`" -eq 0 ]; then
  PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
  PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
fi
export PATH

if [ "${PS1-}" ]; then
  if [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi



export PGPASSWORD='123456'


サーバーの /data/pgfile ディレクトリにプロファイル ファイルを作成し、上記のファイルの内容を貼り付けます。

ここに画像の説明を挿入

docker cp コマンドを実行して、プロファイル環境構成をコンテナーにコピーします。

例: docker cp ローカル ディレクトリ コンテナ名: コンテナ ディレクトリ

docker cp /data/pgfile/profile postgres:/etc

環境変数がコンテナー ディレクトリにコピーされた後、コンテナーに入って表示できるようになります。

ここで、コンテナの /etc/profile が置き換えられたことがわかります。

ここに画像の説明を挿入

次に、コンテナ内のソース /etc/profile を使用します

注文の実行

 psql 172.19.52.5 -U postgres -p 5432 -d postgres

データベースへのリモート接続が成功していることがわかります。

画像-20230331120641051

3.backup.sh バックアップ スクリプトを準備します。

例:

#!/bin/bash

# 数据库信息
DB_HOST=172.19.52.5
DB_PORT=5432
DB_USER=postgres
DB_NAME=ry-cloud
#文备份文件夹目录
BACKUP_DIR=/var/lib/postgresql/data/backup

#备份文件名称
BACKUP_FILE=$BACKUP_DIR/ry-cloud-$(date +%Y%m%d%H%M%S).sql.gz


pg_dump -h $DB_HOST -p $DB_PORT -U $DB_USER -d  $DB_NAME   | gzip >$BACKUP_FILE 


#查找1天前的数据 删除
find $BACKUP_DIR -type f -name "*.gz" -mtime +1 -exec rm {
    
    } \;






/data/pg ディレクトリの下に mysh フォルダを作成します。 mysh フォルダの下に、backup.sh スクリプト ファイルを作成します。

/data/pg ディレクトリの下に、バックアップ データを保存するためのバックアップ フォルダーを作成します。

画像-20230331121110169

/data/pgに対応するコンテナマッピングディレクトリは/var/lib/postgresql/dataなので

したがって、/mysh/backup.sh はコンテナの /var/lib/postgresql/data ディレクトリに表示されます。

画像-20230331121251388

4. スクリプトテストを実行する

出口コンテナ

コマンドを実行してbackup.shが正常に実行できるか確認する

docker exec  postgres bash -c "source /etc/profile && /var/lib/postgresql/data/mysh/backup.sh"

画像-20230331121703564

コマンドを実行すると、/data/pg/backup ディレクトリにバックアップ ファイルがあることがわかります。これは、pg_dump からのデータベース圧縮パッケージ全体です。

5.Linux crontab タスクのタイミング実行を設定する

crontab -e を使用してスケジュールされたタスクを編集し、以下のバックアップ コマンドを追加すれば完了です

コマンドを使用して crontab タイミング タスクを編集する

crontab -e 

毎日午前2時にバックアップコマンドを実行します。

0 2 * * *  sudo docker exec  postgres bash -c "source /etc/profile && /var/lib/postgresql/data/mysh/backup.sh" >> /data/pg/mysh/my.log 2>&1

画像-20230331122041465

6. まとめ

1. コンテナの関連マッピング パスに注意します。

2. Docker コンテナの pgsql バージョンは、リモート サーバーのバージョンと一致している必要があります。

3. 最後のスクリプトはコンテナ内で実行されるため、backup.sh 内のバックアップ ディレクトリ アドレスはコンテナのディレクトリ アドレスであることに注意してください。

4. 他のコマンドは無効になっているため、backup.shのパラメータ設定とprofileのpgライブラリのパスワード設定に注意してください

おすすめ

転載: blog.csdn.net/qq_37349379/article/details/130088847