PostgreSQLデータベースのバックアップを自動化する最良の方法は何ですか?


22

毎週データベースをバックアップするのは面倒です。また、毎週のバックアップを毎日のバックアップに変えるべきだと思います。私がそれをしなければならなかった場合、私は手動でそれをしたくありません。PostgreSQLデータベースのバックアップを毎日自動化する最良の方法は何ですか?


小さなメモ:dbをダンプすると、パフォーマンスが低下し、クラスターが使用され、非アクティブノードでダンプされる可能性があります。
ニュートリヌス

あなたはこの無料のツールの助けを借りて、スケジュールされたバックアップを作成することができますpostgresql-backup.com
Olekニルソン

次の質問:あなたはどのくらいの大きさで、どのような一般的なバックアップメカニズムを備えていますか。たとえば、手動で何かをバックアップすることはありません。バックアップシステムのエージェントをインストールし、UIでバックアップする要素を選択し、バックアップをスケジュールします(データベースの場合、5分ごと)。...終了しました。しかし、それは適切なシステムをインストールするのが理にかなっていることを前提としています。
トムトム

postgresql-backup.comを「無料の」ソリューションとは呼びません。それは... @OlekNilson最初の2つのデータベースのための唯一の自由である
エイダン・メレン

回答:


40

自動化できる他の繰り返しタスクの場合と同じです。バックアップを実行するスクリプトを作成し、それを実行するためにcronジョブをセットアップします。

たとえば、次のようなスクリプト:

(注:postgresユーザー、または同じ特権を持つ他のユーザーとして実行する必要があります)

#! /bin/bash

# backup-postgresql.sh
# by Craig Sanders <cas@taz.net.au>
# This script is public domain.  feel free to use or modify
# as you like.

DUMPALL='/usr/bin/pg_dumpall'
PGDUMP='/usr/bin/pg_dump'
PSQL='/usr/bin/psql'

# directory to save backups in, must be rwx by postgres user
BASE_DIR='/var/backups/postgres'
YMD=$(date "+%Y-%m-%d")
DIR="$BASE_DIR/$YMD"
mkdir -p "$DIR"
cd "$DIR"

# get list of databases in system , exclude the tempate dbs
DBS=( $($PSQL --list --tuples-only |
          awk '!/template[01]/ && $1 != "|" {print $1}') )

# first dump entire postgres database, including pg_shadow etc.
$DUMPALL --column-inserts | gzip -9 > "$DIR/db.out.gz"

# next dump globals (roles and tablespaces) only
$DUMPALL --globals-only | gzip -9 > "$DIR/globals.gz"

# now loop through each individual database and backup the
# schema and data separately
for database in "${DBS[@]}" ; do
    SCHEMA="$DIR/$database.schema.gz"
    DATA="$DIR/$database.data.gz"
    INSERTS="$DIR/$database.inserts.gz"

    # export data from postgres databases to plain text:

    # dump schema
    $PGDUMP --create --clean --schema-only "$database" |
        gzip -9 > "$SCHEMA"

    # dump data
    $PGDUMP --disable-triggers --data-only "$database" |
        gzip -9 > "$DATA"

    # dump data as column inserts for a last resort backup
    $PGDUMP --disable-triggers --data-only --column-inserts \
        "$database" | gzip -9 > "$INSERTS"

done

# delete backup files older than 30 days
echo deleting old backup files:
find "$BASE_DIR/" -mindepth 1 -type d -mtime +30 -print0 |
    xargs -0r rm -rfv

編集:
pg_dumpall -Dスイッチ(27行目)は廃止され、https://wiki.postgresql.org/wiki/Deprecated_Featuresに置き換えられました--column-inserts


10
すばらしいスクリプトの+1
rkthkr 2009

backuppcは複数のコピーを保持するため、パスに日付をエンコードしないことを除き、backuppcにはPreDumpCmdに非常に似たものを使用します。
デビッドパシュリー

2
すばらしいスクリプトですが、データベース名としてパイプと空白行が含まれないように正規表現を微調整する必要があることがわかりました。 DBS=$($PSQL -l -t | egrep -v 'template[01]' | awk '{print $1}' | egrep -v '^\|' | egrep -v '^$')
s29

@ s29 DBS =($($ {PSQL} -t -A -c "select datname from pg_database where not datname not in( 'template0'、 ' template1 ') "))
PolyTekPatrick

素晴らしいスクリプト-これはClusterControlのようなサービスと比較してどうですか?
カーン

7
pg_dump dbname | gzip > filename.gz

でリロード

createdb dbname
gunzip -c filename.gz | psql dbname

または

cat filename.gz | gunzip | psql dbname

を使用しsplitます。このsplitコマンドを使用すると、出力を、基礎となるファイルシステムに受け入れられるサイズに分割できます。たとえば、1メガバイトのチャンクを作成するには:

pg_dump dbname | split -b 1m - filename

でリロード

createdb dbname
cat filename* | psql dbname

あなたはそれらのうちの1つを投げることができます /etc/cron.hourly

http://www.postgresql.org/docs/8.1/interactive/backup.html#BACKUP-DUMP-ALLから入手


ファイルの分割は素晴らしいアイデアです。split -C行を分割しないように、を使用してダンプを分割することをお勧めします。失敗した復元のデバッグは簡単です。
ジャンルカデラヴェドバ14

3

「手動」で発行するコマンドは何でも-スクリプトにコマンドを記述し、このスクリプトへの呼び出しをcronまたは使用するスケジューラーに入れます。

もちろん、スクリプトをより洗練させることもできますが、一般的には、そこにたどり着くと思います-簡単に始めて、後で改良します。

最も簡単なスクリプト:

#!/bin/bash
/usr/local/pgsql/bin/pg_dumpall -U postgres -f /var/backups/backup.dump

/home/randell/bin/backup.shとして保存し、cronに追加します。

0 0 * * 0 /home/randell/bin/backup.sh

pg_dumpallを使用している場合、そこから単一のテーブルを復元できますか、それとも一度にすべて復元しますか?dumpallを使用して作成された単一のテーブルを復元するためのスクリプトを共有してください
Ashish Karpe

0

最小限のシステム負荷でクラスター全体をバックアップする場合は、postgresqlクラスターのルートディレクトリを単純にtarすることができます。例えば:

echo "select pg_start_backup('full backup - `date`');" | psql
/usr/bin/rdiff-backup --force --remove-older-than 7D $BACKUP_TARGET
/usr/bin/rdiff-backup --include '/etc/postgresql' --include $PGDATA --exclude '/*' / $BACKUP_TARGET
/bin/tar -cjf /mnt/tmp/$SERVER_NAME.tbz2 $BACKUP_TARGET 2>&1
echo "select pg_stop_backup();" | psql

これがバックアップスクリプトの大部分です。


1
いいえ、WALアーカイブも有効にしていない場合、これは機能しません。
ピーターアイゼントラウト

0

誰かがcygwinなどの助けを借りずにWindowsマシンでpostgresをバックアップしなければならない場合に備えて、バッチファイルがあります。

これにより、データベースが毎日独自のディレクトリ内の個々のファイルにバックアップされます

set dtnm=%date:~-4,4%%date:~-7,2%%date:~0,2%
set bdir=D:\backup\%dtnm%
mkdir %bdir%

FOR /F "tokens=1,2 delims=|" %%a IN ('psql -l -t -A -U postgres') DO (
    IF %%b EQU postgres pg_dump -U postgres -f %bdir%\%%a.sql.gz -Z 9 -i %%a
)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.