17

次のように序文を付ければ、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」(二重引用符を引いたもの)と表示されます。

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

4

8 に答える 8

17

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

sudo su postgres
crontab -e

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

于 2009-05-12T18:48:35.787 に答える
14

サーバー上のすべてのデータベースをバックアップする動的な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 youremail@domain.com
于 2009-06-05T21:20:20.153 に答える
7

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

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

于 2016-02-02T19:01:05.630 に答える
4

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

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

PG_PORT
PG_HOST
PG_DATABASE
PG_USERNAME
PG_PASSWORD

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

于 2009-05-12T18:47:45.087 に答える
1

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

于 2011-06-19T11:30:15.937 に答える
0

次のコマンドの代わりに: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つ目はよりきれいです。

于 2013-02-20T13:14:05.927 に答える
0

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

于 2013-03-15T06:26:00.463 に答える
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 | 
于 2013-04-04T21:08:53.333 に答える