2009-05-12 7 views
11

tôi có thể chạy lệnh như vacuumdb, pg_dump, và psql tốt trong một kịch bản nếu tôi mở đầu họ như vậy:Làm cách nào để sao lưu Cơ sở dữ liệu PostgreSQL của tôi bằng Cron?

/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 

Những chạy ở dòng lệnh trên Redhat khi tôi sudo để nhổ tận gốc và sau đó khi bạn thấy trong các lệnh trên tôi làm một sudo -u để postgres.

Nhưng khi tôi cố gắng khởi động điều này từ cron, Tôi nhận được 0 byte trong tất cả các tệp - nghĩa là nó không chạy đúng cách. Và tôi không nhận được manh mối trong nhật ký mà tôi có thể thấy.

file/etc/crontab của tôi có cụm từ này ở dưới cùng

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

Và vâng, /etc/db_backup.cron là chmod ug + x, sở hữu bởi root, và phía trên cùng của tập tin nói " #!/bin/bash "(trừ dấu hai chấm).

Bất cứ ai biết điều gì mang lại?

+0

ít nhất trên redhat,% ký hiệu cần phải được thoát. không thoát nó sẽ dẫn đến cron cố gắng thực thi lệnh của bạn chỉ cho đến khi%. Xem - http://fahdshariff.blogspot.com/2009/05/percent-sign-in-crontab.html – chrismarx

Trả lời

9

Vì bạn dường như có quyền superuser dù sao, bạn có thể đặt những lệnh vào crontab của người sử dụng postgres như vậy:

sudo su postgres 
crontab -e 

và sau đó đặt pg_dump/vacuumdb lệnh đó.

+1

Đây là những gì tôi cuối cùng đã kết thúc làm và nó làm việc tốt chỉ khi tôi đã làm chown postgres.root/opt/postgresql (nơi các tập tin đã đi). – Volomike

+7

'' sudo su postgres '' Thật điên rồ! Hãy thử '' sudo -u postgres ''. Thiết lập một thông số sudo, nó an toàn hơn nhiều. –

+0

Bạn (postgres) không được phép truy cập (crontab) do cấu hình pam. –

4

Biến môi trường của bạn có thể không được đặt trong cron.

Trong phiên bình thường của bạn, có lẽ bạn đã xác định các biến:

PG_PORT 
PG_HOST 
PG_DATABASE 
PG_USERNAME 
PG_PASSWORD 

Thêm một "env" vào kịch bản yout.

+0

Tôi cần trợ giúp nhiều hơn tôi nghĩ. Tôi đặt 'env' trong đó trước khi các lệnh và sau #!/Bin/bash và tất cả những gì nó đã làm là loại bỏ môi trường ra tệp nhật ký (vì bây giờ tôi đang đổ kết xuất vào một logfile khi nó chạy). – Volomike

+0

Cách đặt các biến này sẽ là 'xuất PG_PORT = 5432', v.v. – jhwist

+1

Đó không phải là các biến được sử dụng bởi pg_dump và vacuumdb. Bạn có thể xem danh sách đầy đủ tại đây: http://www.postgresql.org/docs/8.4/static/libpq-envars.html – liviucmg

11

Tôi có tập lệnh bash động sao lưu tất cả cơ sở dữ liệu trên máy chủ. Nó nhận được một danh sách tất cả các cơ sở dữ liệu và sau đó hút từng DB trước khi thực hiện sao lưu. Tất cả các bản ghi được ghi vào một tệp và sau đó nhật ký đó được gửi qua email cho tôi. Đây là một cái gì đó bạn có thể sử dụng nếu bạn muốn.

Sao chép mã bên dưới vào tệp và thêm tệp vào crontab của bạn. Tôi đã thiết lập pg_hba.conf của mình để tin tưởng các kết nối cục bộ.

#!/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] 
+1

Bạn có thể thêm '--analyze' vào lệnh/usr/bin/vacuumdb để thực hiện phân tích. –

+5

Đây là một tập lệnh hay khác: http://wiki.postgresql.org/wiki/Automated_Backup_on_Linux –

+2

@Imraan Parker cách bạn quản lý bỏ qua bằng mật khẩu? Tôi muốn sao lưu như tài khoản quản trị của cơ sở dữ liệu không phải là người sử dụng gốc postgres làm thế nào tôi có thể làm điều đó? –

1

bạn có thể có xác thực "ident" trong tệp pg_hba.conf cho người dùng postgres của mình. Tùy chọn "-u postgres" không thành công khi đúng như vậy. hoặc thay đổi người dùng thành postgres trong tập lệnh sao lưu của bạn hoặc định cấu hình phương thức xác thực khác.

0

Thay vì lệnh sau: cơ sở dữ liệu = 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'}

Bạn có thể sử dụng dưới đây: cơ sở dữ liệu = psql -t -c "select datname from pg_database where datname not like 'template%';" | grep -v '^$'

Một sự trở lại đầu tiên '|' cho cơ sở dữ liệu mẫu và một dòng trống.

Loại thứ hai sạch hơn.

0

cơ sở dữ liệu = psql -h localhost -U postgres -q -x -t -c "\l" | grep 'Name' | sed 's/ //g' | sed 's/Name|//g'

0

phiên bản khác để có được danh sách các cơ sở dữ liệu:
psql -lqt | grep -vE '^ +(template[0-9]+|postgres)? *\|' | cut -d'|' -f1| sed -e 's/ //g' -e '/^$/d'

Khi sản lượng psql -lqt của tôi là:

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 | 
2

tôi đã thiết lập cron của tôi như thế này. Mỗi 59 phút kể từ Thứ Hai đến Thứ Sáu

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

Các kịch bản để chạy backup là bên trong back_my_bd.sh tập tin và nội dung là:

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

Và tôi tạo ra các tập tin .pgpass bên trong thư mục chính để cho phép không có bản sao lưu chỉ định người dùng và mật khẩu

localhost:5432:DATABASENAME:USER:PASSWORD 

Xin lỗi, tiếng anh của tôi không tốt!