簡體   English   中英

如何使用Cron備份我的PostgreSQL數據庫?

[英]How Do I Backup My PostgreSQL Database with 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

這些在Redhat的命令行運行,當我sudo root時,然后你在上面的命令中看到我做了一個sudo -u到postgres。

但是當我試圖從cron中取消它時, 我在所有文件中得到零字節 - 這意味着它沒有正常運行。 我在日志中看不到任何線索。

我的/ etc / crontab文件底部有此條目

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

是的,/ etc / db_backup.cron是chmod ug + x,由root擁有,文件頂部顯示“#!/ bin / bash”(減去雙引號)。

誰知道什么給了?

我有一個動態bash腳本來備份服務器上的所有數據庫。 它獲取所有數據庫的列表,然后在執行備份之前清空每個數據庫。 所有日志都寫入文件,然后通過電子郵件將該日志發送給我。 如果你願意,這是你可以使用的東西。

將下面的代碼復制到一個文件中,並將該文件添加到您的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

既然您似乎擁有超級用戶權限,您可以將這些命令放入postgres用戶的crontab中,如下所示:

sudo su postgres
crontab -e

然后將pg_dump / vacuumdb命令放在那里。

我已經設置了這樣的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”。

您可能在pg_hba.conf中為postgres用戶進行了“ident”身份驗證。 在這種情況下,選項“-u postgres”將失敗。 要么在備份腳本中將用戶更改為postgres,要么配置其他身份驗證方法。

而不是以下命令: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'} 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 '^$' psql -t -c "select datname from pg_database where datname not like 'template%';" | grep -v '^$'

第一個返回'|' 用於模板數據庫和空行。

第二個更干凈。

databases = psql -h localhost -U postgres -q -x -t -c "\\l" | grep 'Name' | sed 's/ //g' | sed 's/Name|//g' psql -h localhost -U postgres -q -x -t -c "\\l" | grep 'Name' | sed 's/ //g' | sed 's/Name|//g'

獲取數據庫列表的另一個版本:
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 | 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM