2009-05-12 13 views
11

मैं वैक्यूमडब, pg_dump, और psql जैसे आदेशों को चला सकता हूं, अगर मैं उन्हें ऐसा पेश करता हूं तो xpx25 मैं क्रॉन के साथ अपने PostgreSQL डेटाबेस बैकअप कैसे करूं?

/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 

रेडहाट पर कमांड लाइन पर चलाता है जब मैं रूट के लिए सूडो हूं और फिर जैसा कि आप देखते हैं उपरोक्त आदेश मैं पोस्टग्रेस के लिए एक सूडो -u करते हैं।

लेकिन जब मैं इसे क्रॉन से बाहर निकालने का प्रयास करता हूं, मुझे सभी फ़ाइलों में शून्य बाइट मिलता है - जिसका अर्थ है कि यह ठीक से नहीं चला। और मुझे लॉग में एक सुराग नहीं मिलता है जिसे मैं देख सकता हूं।

मेरी/etc/crontab फ़ाइल में यह प्रविष्टि नीचे

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

है और हां, /etc/db_backup.cron chmod ug + x है, जो रूट के स्वामित्व में है, और फ़ाइल के शीर्ष में " #!/बिन/बैश "(शून्य से दोहराव)।

कोई भी जानता है कि क्या देता है?

+0

कम से कम redhat पर,% प्रतीकों से बचने की जरूरत है। इससे बचने के परिणामस्वरूप क्रॉन आपके आदेश को केवल% तक निष्पादित करने का प्रयास करेगा। देखें - http://fahdshariff.blogspot.com/2009/05/percent-sign-in-crontab.html – chrismarx

उत्तर

9

के बाद से तुम वैसे भी सुपर उपयोगकर्ता अधिकार है लगता है, तो आप उन आदेशों postgres उपयोगकर्ता की crontab में इतनी तरह डाल सकता है:

sudo su postgres 
crontab -e 

और फिर pg_dump/vacuumdb वहाँ आदेश डाल दिया।

+1

यही वह है जो मैं अंततः समाप्त कर रहा था और यह ठीक काम करता था जब मैंने chown postgres.root/opt/postgresql (जहां फाइलें चल रही थीं)। – Volomike

+7

'' सुडो सु पोस्टग्रेस '' वह पागल है! 'सुडो-यू पोस्टग्रेस' 'आज़माएं। एक सूडो spec सेटअप, यह बहुत सुरक्षित है। –

+0

आप (पोस्टग्रेस) को पैम कॉन्फ़िगरेशन के कारण (crontab) तक पहुंचने की अनुमति नहीं है। –

4

आपके पर्यावरण चर शायद क्रॉन में सेट नहीं हैं।

अपने सामान्य सत्र में, आप शायद इन चरों को परिभाषित किया है:

PG_PORT 
PG_HOST 
PG_DATABASE 
PG_USERNAME 
PG_PASSWORD 

yout स्क्रिप्ट में एक "env" जोड़ें।

+0

मुझे लगता है कि मुझे थोड़ा और मदद चाहिए। मैंने आदेशों से पहले 'env' रखा था और #!/Bin/bash के बाद और यह सब कुछ लॉग फ़ाइल में पर्यावरण को डंप कर दिया गया था (क्योंकि अब मैं आउटपुट को लॉगफाइल पर डंप कर रहा हूं)। – Volomike

+0

इन चर सेट करने का तरीका 'निर्यात PG_PORT = 5432' आदि – jhwist

+1

वे वास्तव में pg_dump और vacuumdb द्वारा उपयोग किए जाने वाले चर नहीं हैं। आप यहां पूरी सूची देख सकते हैं: http://www.postgresql.org/docs/8.4/static/libpq-envars.html – liviucmg

11

मेरे पास एक गतिशील बैश स्क्रिप्ट है जो सर्वर पर सभी डेटाबेस का बैक अप लेती है। यह सभी डेटाबेस की एक सूची प्राप्त करता है और फिर बैकअप करने से पहले प्रत्येक डीबी वैक्यूम करता है। सभी लॉग एक फ़ाइल में लिखे गए हैं और फिर वह लॉग मुझे ईमेल किया गया है। यह ऐसा कुछ है जिसका आप उपयोग कर सकते हैं यदि आप चाहते हैं।

नीचे दिए गए कोड को एक फ़ाइल में कॉपी करें और फ़ाइल को अपने क्रॉन्टाब में जोड़ें। मैंने स्थानीय कनेक्शन पर भरोसा करने के लिए अपना 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] 
+1

आप विश्लेषण करने के लिए/usr/bin/vacuumdb कमांड में '--analyze' जोड़ सकते हैं। –

+5

यहां एक और अच्छी लिपि है: http://wiki.postgresql.org/wiki/Automated_Backup_on_Linux –

+2

@ इमरान पार्कर पासवर्ड का उपयोग करके आप कैसे छोड़ सकते हैं? मैं बैकअप करना चाहता हूं डेटाबेस के व्यवस्थापक खाते के रूप में रूट उपयोगकर्ता पोस्टग्रेज़ मैं यह कैसे कर सकता हूं? –

1

आपके पास शायद आपके पोस्टग्रेस उपयोगकर्ता के लिए आपके pg_hba.conf में "पहचान" प्रमाणीकरण है। विकल्प "-u पोस्टग्रेस" विफल होने पर विकल्प विफल रहता है। या तो उपयोगकर्ता को अपनी बैकअप स्क्रिप्ट में पोस्टग्रेस में बदलें या एक अलग प्रमाणीकरण विधि कॉन्फ़िगर करें।

0
निम्न आदेश के बजाय

: डेटाबेस = 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 -t -c "select datname from pg_database where datname not like 'template%';" | grep -v '^$'

पहले एक वापसी '|' टेम्पलेट डेटाबेस और एक खाली रेखा के लिए।

दूसरा क्लीनर है।

0

डेटाबेस = psql -h localhost -U postgres -q -x -t -c "\l" | grep 'Name' | sed 's/ //g' | sed 's/Name|//g'

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

मैं इस तरह मेरी क्रॉन निर्धारित किया है। हर 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 

क्षमा करें मेरी अंग्रेजी अच्छी नहीं है!

संबंधित मुद्दे