次のように前置きすれば、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」(二重引用符を引いたもの)と表示されます。
誰が何を与えるか知っていますか?
とにかくスーパーユーザー権限を持っているように見えるので、次のようにこれらのコマンドをpostgresユーザーのcrontabに入れることができます。
Sudo su postgres
crontab -e
次に、pg_dump/vacuumdbコマンドをそこに配置します。
サーバー上のすべてのデータベースをバックアップする動的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]
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
すみません、私の英語は上手ではありません!
環境変数がcronで設定されていない可能性があります。
通常のセッションでは、おそらく次の変数を定義しています。
PG_PORT
PG_Host
PG_DATABASE
PG_USERNAME
PG_PASSWORD
「env」をyoutスクリプトに追加します。
おそらく、postgresユーザーのpg_hba.confに「ident」認証があります。その場合、オプション「-upostgres」は失敗します。バックアップスクリプトでユーザーをpostgresに変更するか、別の認証方法を構成します。
データベース= psql -h localhost -U postgres -q -x -t -c "\l" | grep 'Name' | sed 's/ //g' | sed 's/Name|//g'
次のコマンドの代わりに: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つ目はよりきれいです。
データベースのリストを取得するための別のバージョン: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 |