web-dev-qa-db-ja.com

PostgreSQLデータベースをcronでバックアップするにはどうすればよいですか?

次のように前置きすれば、vacuumdb、pg_dump、psqlなどのコマンドをスクリプトで問題なく実行できます。

/usr/bin/Sudo -u postgres /usr/bin/pg_dump -Fc mydatabase > /opt/postgresql/prevac.gz
/usr/bin/Sudo -u postgres /usr/bin/vacuumdb --analyze mydatabase
/usr/bin/Sudo -u postgres /usr/bin/pg_dump -Fc mydatabase > /opt/postgresql/postvac.gz
SCHEMA_BACKUP="/opt/postgresql/$(date +%w).db.schema"
Sudo -u postgres /usr/bin/pg_dump -C -s mydatabase > $SCHEMA_BACKUP

これらは、私がrootに対してSudoであるときに、Redhatのコマンドラインで実行されます。次に、上記のコマンドに示されているように、postgresに対してSudo-uを実行します。

しかし、これをcronから開始しようとすると、すべてのファイルでゼロバイトが取得されます-正しく実行されなかったことを意味します。そして、ログに可能な手がかりが得られません。見る。

私の/ etc/crontabファイルの下部にこのエントリがあります

00 23 * * * root /etc/db_backup.cron

はい、/ etc /db_backup.cronはchmodug + xであり、rootが所有し、ファイルの先頭には「#!/ bin/bash」(二重引用符を引いたもの)と表示されます。

誰が何を与えるか知っていますか?

16
Volomike

とにかくスーパーユーザー権限を持っているように見えるので、次のようにこれらのコマンドをpostgresユーザーのcrontabに入れることができます。

Sudo su postgres
crontab -e

次に、pg_dump/vacuumdbコマンドをそこに配置します。

13
jhwist

サーバー上のすべてのデータベースをバックアップする動的bashスクリプトがあります。すべてのデータベースのリストを取得し、バックアップを実行する前に各DBをバキュームします。すべてのログがファイルに書き込まれ、そのログが電子メールで送信されます。これは、必要に応じて使用できるものです。

以下のコードをファイルにコピーし、そのファイルをcrontabに追加します。ローカル接続を信頼するようにpg_hba.confを設定しました。

#!/bin/bash
logfile="/backup/pgsql.log"
backup_dir="/backup"
touch $logfile
databases=`psql -h localhost -U postgres -q -c "\l" | sed -n 4,/\eof/p | grep -v rows\) | grep -v template0 | grep -v template1 | awk {'print $1'}`

echo "Starting backup of databases " >> $logfile
for i in $databases; do
        dateinfo=`date '+%Y-%m-%d %H:%M:%S'`
        timeslot=`date '+%Y%m%d%H%M'`
        /usr/bin/vacuumdb -z -h localhost -U postgres $i >/dev/null 2>&1
        /usr/bin/pg_dump -U postgres -i -F c -b $i -h 127.0.0.1 -f $backup_dir/$i-database-$timeslot.backup
        echo "Backup and Vacuum complete on $dateinfo for database: $i " >> $logfile
done
echo "Done backup of databases " >> $logfile

tail -15 /backup/pgsql.log | mailx [email protected]
14
Imraan Parker

Cronをこのように設定しました。月曜日から金曜日まで59分ごと

*/59 * * * 1-5 sh /home/my_user/scripts/back_my_bd.sh 

バックアップを実行するスクリプトはback_my_bd.shファイル内にあり、内容は次のとおりです。

pg_dump -U USERDATABASE DATABASENAME > /home/my_user/sql/mybackup.sql

そして、ユーザーとパスワードを指定せずにバックアップできるように、ホームディレクトリ内に.pgpassファイルを作成しました

localhost:5432:DATABASENAME:USER:PASSWORD

すみません、私の英語は上手ではありません!

6
daronwolff

環境変数がcronで設定されていない可能性があります。

通常のセッションでは、おそらく次の変数を定義しています。

PG_PORT
PG_Host
PG_DATABASE
PG_USERNAME
PG_PASSWORD

「env」をyoutスクリプトに追加します。

4
Luc M

おそらく、postgresユーザーのpg_hba.confに「ident」認証があります。その場合、オプション「-upostgres」は失敗します。バックアップスクリプトでユーザーをpostgresに変更するか、別の認証方法を構成します。

1
Floris

データベース= psql -h localhost -U postgres -q -x -t -c "\l" | grep 'Name' | sed 's/ //g' | sed 's/Name|//g'

0
user2172798

次のコマンドの代わりに:databases = psql -h localhost -U postgres -q -c "\l" | sed -n 4,/\eof/p | grep -v rows\) | grep -v template0 | grep -v template1 | awk {'print $1'}

以下を使用できます:databases = psql -t -c "select datname from pg_database where datname not like 'template%';" | grep -v '^$'

最初のものは '|'を返しますテンプレートデータベースと空の行の場合。

2つ目はよりきれいです。

0

データベースのリストを取得するための別のバージョン:
psql -lqt | grep -vE '^ +(template[0-9]+|postgres)? *\|' | cut -d'|' -f1| sed -e 's/ //g' -e '/^$/d'

私のようにpsql -lqt出力は次のとおりです。

 abcdefghij         | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 postgres           | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0          | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
                    |          |          |             |             | postgres=CTc/postgres
 template1          | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
                    |          |          |             |             | postgres=CTc/postgres
 abc                | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
0