Parola pg_dump'a nasıl aktarılır?


294

Felaket bir şey olmadan önce her gece veritabanımı yedeklemek için bir cronjob oluşturmaya çalışıyorum. Bu komutun ihtiyaçlarımı karşılaması gerektiği anlaşılıyor:

0 3 * * * pg_dump dbname | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz

Bunu çalıştırdıktan sonra, bir şifre yazmamı bekliyor. Eğer cron'dan çalıştırırsam bunu yapamam. Nasıl otomatik olarak girebilirim?


muhtemelen yararlı yazı i pg_restore otomasyon yazdı! medium.com/@trinity/…
kittyminky

burada bir bağlantı dizesi kullanarak yanıtlayın: stackoverflow.com/a/29101292/1579667
Benj

Yanıtlar:


304

.pgpassHesabın giriş dizininde olarak pg_dumpçalışacak bir dosya oluşturun . Biçimin ayrıntıları için Postgresql belgeleri libpq-pgpass'a (modu ayarlamazsanız, yok sayıldığını açıkladığı son paragraf dahil 0600) bakın.


99
Localhost ile ~ / .pgpass oluşturun: 5432: mydbname: postgres: mypass Sonra chmod 600 ~ / .pgpass
Mircea Stanciu

6
Olası faydalı: Ubuntu'da, "postgres" kullanıcısına geçmek için "sudo su postgres" yazıp .pgpass dosyasını oluşturun ve dökümü yürütün.
fivedogit

1
Cevabınızı takip ettim ancak yine de yedek dosyamı başarıyla oluşturamıyorum. Lütfen bağlantımı görün: unix.stackexchange.com/questions/257898/… . Teşekkür ederim.
alyssaeliyah

9.6.2 üzerinde çalışıyor: o)
Andrew

2
Aşağıdakilere dikkat edin sudo su postgres: Unix kullanıcısının olması gerekmez. Buna gerek yok. Ancak DB kullanıcısı gerekir.
Fabien Haddadi

217

Veya bir komut dosyası çalıştırmak için crontab kurabilirsiniz. Bu komut dosyasının içinde şöyle bir ortam değişkeni ayarlayabilirsiniz: export PGPASSWORD="$put_here_the_password"

Bu şekilde parola gerektiren birden fazla komutunuz varsa hepsini komut dosyasına koyabilirsiniz. Parola değişirse, tek bir yerde (komut dosyası) değiştirmeniz gerekir.

Ve Joshua ile aynı fikirdeyim pg_dump -Fc, en esnek ihracat formatını kullanarak zaten sıkıştırılmış durumda. Daha fazla bilgi için bkz. Pg_dump belgeleri

Örneğin

# dump the database in custom-format archive
pg_dump -Fc mydb > db.dump

# restore the database
pg_restore -d newdb db.dump

3
bu ideal değil. içine atmak .pgpass, fazladan bir dolaylama katmanı eklemeden, her şeyi tek bir yerde tutacaktır. artı, tüm bir değişken ihracat ile yapmak istedim, ben benim .bashrcdosyasında ya da her ne olursa olsun.
01'de mpen

9
.pgpassDosyanın neden daha iyi bir çözüm olduğunu anlayabiliyorum. Ben sadece bir alternatif veriyordum, ama bir downvote hak edip etmediğinden emin değilim :)
Max

13
Ben inmedim. Bu başka biriydi; Ben de bir aşağı oy gerektirdiğini düşünmüyordu. Telafi etmek için + 1'leyin.
16'da mpen

7
Çok fazla nefret. Bu cevabı takdir ediyorum ve kendi başvurum için kabul ediyorum.
James T Snell

8
PGPASSWORD ortam değişkeninin ayarlanması, belgeler tarafından önerilen bir uygulama değildir ( postgresql.org/docs/current/static/libpq-envars.html ): Bazı işletim sistemleri, ps aracılığıyla işlem ortamı değişkenlerini görmek için root kullanıcıları; bunun yerine ~ / .pgpass dosyasını kullanmayı düşünün
bouchon

175

Bunu tek bir komutta yapmak istiyorsanız:

PGPASSWORD="mypass" pg_dump mydb > mydb.dump

27
PGPASSWORD ortam değişkeninin ayarlanması, belgeler tarafından önerilen bir uygulama değildir ( postgresql.org/docs/current/static/libpq-envars.html ): Bazı işletim sistemleri, ps aracılığıyla işlem ortamı değişkenlerini görmek için root kullanıcıları; bunun yerine ~ / .pgpass dosyasını kullanmayı düşünün
bouchon

18
Hala faydalı bir yorum. Bunun hala yararlı olduğu birçok dağıtım durumu var.
Iain Duncan

1
Her zaman 'Kullanıcı adı' kullanıcısı için akran kimlik doğrulaması başarısız oldu 'hatasını alıyorum. Çözüm şuydu: PGPASSWORD = "mypass" pg_dump -U kullanıcı adı -h localhost> mydb.dump
Martin Pabst

4
Kanımca, bilinen, şifrelenmemiş bir yerde olduğu gibi bir ortam değişkeni ( parolanızın nerede , nerede ve nasıl saklanacağı) kurmanın çok daha iyi olduğudur. Postgresql belgesinin bu bölümü hatalı ve bu cevap iyi.
peterh - Monica

1
Şifremde '@' vardı. Bu işe yaradı. postgres://Sözdizimi ile nasıl çalışacağını anlayamadım . .pgpassPostgress kullanıcımın giriş dizini olmadığı için denemedim .
jmathew

136

Bir veritabanını taşımak gibi bir astar için, pg_dump kılavuzunda--dbname belirtildiği gibi bir bağlantı dizesi (parola dahil) kullanabilirsiniz

Özünde.

pg_dump --dbname=postgresql://username:password@127.0.0.1:5432/mydatabase

Not: Seçeneği --dbnamedaha kısa yerine -dkullandığınızdan ve geçerli bir URI öneki kullandığınızdan emin olun postgresql://veya postgres://.

Genel URI formu:

postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]

Durumunuzdaki en iyi uygulama (cron'da tekrarlayan görev) bu, güvenlik sorunları nedeniyle yapılmamalıdır. O olmasaydı .pgpassdosyanın ben bir ortam değişkeni olarak bağlantı dizesini tasarruf sağlayacaktır.

export MYDB=postgresql://username:password@127.0.0.1:5432/mydatabase

o zaman crontab'ınızda

0 3 * * * pg_dump --dbname=$MYDB | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz


Postgre 9.1 sürümü, dbname için bilinmeyen bir seçenek çıktı
akohout

Bu, sırasıyla kemer ve RHEL'de 9.4 ve 9.3 sürümleriyle test edildi. bağlantı dizenizi gönderebilir misiniz? tabii anonim.
Josue Alexander Ibarra

Teşekkürler @JosueIbarra. PostgreSQL 9.3, Ubuntu 14.04'te başarıyla test edildi.
Cao Minh Tu

1
@EntryLevelR çıktıyı kaydetmek için bir dosyaya bağlamanız gerekir. bu ilgili soruya bakın askubuntu.com/questions/420981/…
Josue Alexander Ibarra

4
kabul edilen cevap bu olmalıdır. Bir astar, açık.
swdev

48
$ PGPASSWORD="mypass" pg_dump -i -h localhost -p 5432 -U username -F c -b -v -f dumpfilename.dump databasename

Güzel, ama ne yazık ki benim için çalışmıyor, "sorgu başarısız oldu: HATA: ilişki direction_lookup için izin verilmedi"
James T Snell

@ Pg kullanıcıya gerekli izinleri vermeyi denediniz mi?
Francisco Luz

33

Bu bir astar, tek bir veritabanının dökümünü oluştururken bana yardımcı oluyor.

PGPASSWORD="yourpassword" pg_dump -U postgres -h localhost mydb > mydb.pgsql

1
çok yardımcı oldu ... thnxxx
ronit

19

@Josue Alexander Ibarra yanıtı --dbname geçilmezse centos 7 ve sürüm 9.5 üzerinde çalışır.

pg_dump postgresql://username:password@127.0.0.1:5432/mydatabase 

1
Haklısın, böyle görünmesi gerekiyordu, sanırım birkaç yıl önce yanlış olan şey benim kabuk konfigürasyonumdu. Bu yüzden kullanmak benim için önemliydi--dbname
Josue Alexander Ibarra

7

Windows'da pgpass.confdosyanın aşağıdaki klasörde olması gerektiğini unutmayın:

%APPDATA%\postgresql\pgpass.conf

postgresqlklasörün içinde klasör yoksa %APPDATA%oluşturun.

pgpass.confDosya içeriği gibi bir şey:

localhost:5432:dbname:dbusername:dbpassword

şerefe


4

Yanılıyorsam beni düzeltin, ancak sistem kullanıcısı veritabanı kullanıcısıyla aynıysa, PostgreSQL parolayı istemez - kimlik doğrulaması için sisteme güvenir. Bu bir yapılandırma meselesi olabilir.

Böylece, veritabanı sahibinin postgresveritabanlarını her gece yedeklemesini istediğimde bunun için bir crontab oluşturabilirim crontab -e -u postgres. Tabii ki, postgrescron işleri yürütmesine izin verilmesi gerekir; bu nedenle listelenmeli /etc/cron.allowveya /etc/cron.denyboş olmalıdır.


Burada bir nevi haklısın. Varsayılan Postgres yapılandırması yerel sistem hesapları için GÜVEN kimlik doğrulamasını kullanır. Ancak, çoğu üretim kurulumu RDBMS'yi yükledikten hemen sonra bu bloktan kurtulur.
Jacek Prucia

4

Geçici .pgpass kimlik bilgilerini kullanarak şifre ile ssh üzerinden yedekleme yapın ve S3'e aktarın:

#!/usr/bin/env bash
cd "$(dirname "$0")"

DB_HOST="*******.*********.us-west-2.rds.amazonaws.com"
DB_USER="*******"
SSH_HOST="my_user@host.my_domain.com"
BUCKET_PATH="bucket_name/backup"

if [ $# -ne 2 ]; then
    echo "Error: 2 arguments required"
    echo "Usage:"
    echo "  my-backup-script.sh <DB-name> <password>"
    echo "  <DB-name> = The name of the DB to backup"
    echo "  <password> = The DB password, which is also used for GPG encryption of the backup file"
    echo "Example:"
    echo "  my-backup-script.sh my_db my_password"
    exit 1
fi

DATABASE=$1
PASSWORD=$2

echo "set remote PG password .."
echo "$DB_HOST:5432:$DATABASE:$DB_USER:$PASSWORD" | ssh "$SSH_HOST" "cat > ~/.pgpass; chmod 0600 ~/.pgpass"
echo "backup over SSH and gzip the backup .."
ssh "$SSH_HOST" "pg_dump -U $DB_USER -h $DB_HOST -C --column-inserts $DATABASE" | gzip > ./tmp.gz
echo "unset remote PG password .."
echo "*********" | ssh "$SSH_HOST" "cat > ~/.pgpass"
echo "encrypt the backup .."
gpg --batch --passphrase "$PASSWORD" --cipher-algo AES256 --compression-algo BZIP2 -co "$DATABASE.sql.gz.gpg" ./tmp.gz

# Backing up to AWS obviously requires having your credentials to be set locally
# EC2 instances can use instance permissions to push files to S3
DATETIME=`date "+%Y%m%d-%H%M%S"`
aws s3 cp ./"$DATABASE.sql.gz.gpg" s3://"$BUCKET_PATH"/"$DATABASE"/db/"$DATETIME".sql.gz.gpg
# s3 is cheap, so don't worry about a little temporary duplication here
# "latest" is always good to have because it makes it easier for dev-ops to use
aws s3 cp ./"$DATABASE.sql.gz.gpg" s3://"$BUCKET_PATH"/"$DATABASE"/db/latest.sql.gz.gpg

echo "local clean-up .."
rm ./tmp.gz
rm "$DATABASE.sql.gz.gpg"

echo "-----------------------"
echo "To decrypt and extract:"
echo "-----------------------"
echo "gpg -d ./$DATABASE.sql.gz.gpg | gunzip > tmp.sql"
echo

Açıkçası, ilk yapılandırma satırını ihtiyacınız olan her şeyle değiştirin. S3 yedek parçasıyla ilgilenmeyenler için, açıkça çıkarın.

Bu komut dosyası .pgpassdaha sonra kimlik bilgilerini siler, çünkü bazı ortamlarda, varsayılan SSH kullanıcısı parola olmadan, örneğin ubuntukullanıcıyla bir EC2 örneği olmadan sudo yapabilir , bu nedenle .pgpassbu kimlik bilgilerini güvence altına almak için farklı bir ana bilgisayar hesabıyla kullanmak anlamsız olabilir.


Şifre terminale historybu şekilde kaydedilecek , değil mi?
mpen

1
@mpen Yerel olarak, evet. Uzaktan, hayır. Benim durumumda yerel geçmişime sahip olmak sorun değil, çünkü uzaktan erişime izin vermeyen güvenli bir sanal makine. Sizin durumunuzda sorun yoksa, sadece yapın history -c. Jenkins ile kullanırken, Inject passwords to the build as environment variablesşifrenin maskelenmesi için bu seçeneği kullanın
MikeM

4

Bu blog yazısında ayrıntılı olarak açıklandığı gibi, PostgreSQL yardımcı programlarına "pg_dump" komutu gibi etkileşimli olmayan bir parola sağlamanın iki yolu vardır: ".pgpass" dosyasını kullanma veya "PGPASSWORD" ortam değişkenini kullanma.


-1

Parola geçirmenin başka bir (muhtemelen güvenli olmayan) yolu giriş yeniden yönlendirmesini kullanmaktır.

pg_dump [params] < [path to file containing password]


Güvenlikle ilgili olarak - bu dosyanın yalnızca hedeflenen kullanıcılar tarafından okunabilmesi gerekir; ancak, kök hakları olan herkes güvenlik ayarlarını değiştirebilir ve böylece şifrelenmemiş şifreyi okuyabilir. Evet, bu güvensiz ...
Tobias

3
@ Tobias başka bir alternatif var mı? Kök haklarına sahip olan herkes, şifreyi interaktif olarak girmek dışında hangi teknik olursa olsun şifreyi her zaman görebiliyor gibi görünüyor (ve soru cron ile ilgili). postgresql.org/docs/9.3/static/auth-methods.html#GSSAPI-AUTH tek oturum açmayı destekleyen GSSAPI'den bahsediyor, ancak etkileşimli olarak çalışmazsa bundan bahsetmiyoruz.
Ross Bradbury

4
Kök haklarına sahip herkes, önerilen yol olan .pgpass dosyasını da okuyabilir. Bu nedenle, root erişiminin bir güvenlik riski olduğunu düşünmem.
maks.

-1

Aşağıdakileri kullanarak doğrudan bir parola pg_dump dosyasına iletebilirsiniz:

pg_dump "host=localhost port=5432 dbname=mydb user=myuser password=mypass" > mydb_export.sql

Stack Overflow'a hoş geldiniz! Cevabınız işe yarasa da, bunun ciddi güvenlik etkileri vardır. Bir komutun argümanları ps (1) 'de görülebilir , bu nedenle bir işlem ps (1)' i izliyorsa parola tehlikeye girer.
Jonathan Rosa

-4

bence en kolay yolu, bu: size ana postgres yapılandırma dosyasını düzenleyin: pg_hba.conf orada aşağıdaki satırı eklemek zorunda:

host <you_db_name> <you_db_owner> 127.0.0.1/32 trust

ve bundan sonra cron'u başlatmanız gerekir:

pg_dump -h 127.0.0.1 -U <you_db_user> <you_db_name> | gzip > /backup/db/$(date +%Y-%m-%d).psql.gz

ve şifre olmadan çalıştı


Ve sadece sistem güvenliğini yok ettin. Bir dev kutusu için Tamam, ama başka bir şey.
Theodore R. Smith
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.