Próbuję utworzyć cronjob do tworzenia kopii zapasowych mojej bazy danych każdej nocy, zanim wydarzy się coś katastrofalnego. Wygląda na to, że to polecenie powinno spełniać moje potrzeby:
0 3 * * * pg_dump dbname | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz
Z wyjątkiem tego, że po uruchomieniu tego wymaga ode mnie wpisania hasła. Nie mogę tego zrobić, jeśli uruchomię go z crona. Jak mogę przekazać je automatycznie?
bash
postgresql
shell
crontab
mpen
źródło
źródło
Odpowiedzi:
Utwórz
.pgpass
plik w katalogu głównym konta, którepg_dump
będzie działać jako. Zobacz dokumentację Postgresql libpq-pgpass, aby uzyskać szczegółowe informacje na temat formatu (w tym ostatni akapit, w którym wyjaśniono, że zostanie zignorowany, jeśli nie ustawisz trybu na0600
).źródło
sudo su postgres
: ten użytkownik systemu Unix niekoniecznie istnieje. Nie musi. Ale użytkownik DB powinien.Lub możesz skonfigurować crontab do uruchamiania skryptu. Wewnątrz tego skryptu możesz ustawić zmienną środowiskową taką jak ta:
export PGPASSWORD="$put_here_the_password"
W ten sposób, jeśli masz wiele poleceń wymagających hasła, możesz umieścić je wszystkie w skrypcie. Jeśli hasło się zmieni, musisz je zmienić tylko w jednym miejscu (skrypt).
I zgadzam się z Joshua, użycie
pg_dump -Fc
generuje najbardziej elastyczny format eksportu i jest już skompresowany. Aby uzyskać więcej informacji, zobacz: dokumentacja pg_dumpNa przykład
źródło
.pgpass
zatrzyma wszystko w jednym miejscu, bez dodawania dodatkowej warstwy pośredniej. ponadto, jeśli wszystko, co chciałem zrobić z eksportem zmiennej, zrobiłbym to w moim.bashrc
pliku lub czymkolwiek innym ..pgpass
plik byłby lepszym rozwiązaniem. Dałem tylko alternatywę, nie jestem pewien, czy zasługuje ona na głosowanie :)Jeśli chcesz to zrobić za pomocą jednego polecenia:
źródło
postgres://
składnią. Nie próbowałem,.pgpass
ponieważ mój użytkownik postgress nie ma katalogu domowego.W przypadku jednowierszowego, takiego jak migracja bazy danych, można użyć
--dbname
łańcucha połączenia (w tym hasła), zgodnie z instrukcją pg_dumpW istocie.
pg_dump --dbname=postgresql://username:[email protected]:5432/mydatabase
Uwaga: Upewnij się, że używasz opcji
--dbname
zamiast krótszej-d
i używasz poprawnego prefiksu URI,postgresql://
lubpostgres://
.Ogólny formularz URI to:
postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
Najlepsza praktyka w twoim przypadku (powtarzalne zadanie w cronie) nie powinno się tego robić z powodu problemów z bezpieczeństwem. Gdyby nie
.pgpass
plik, zapisałbym ciąg połączenia jako zmienną środowiskową.export MYDB=postgresql://username:[email protected]:5432/mydatabase
więc miejcie w swoim crontabie
0 3 * * * pg_dump --dbname=$MYDB | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz
źródło
źródło
Ta jedna linijka pomaga mi podczas tworzenia zrzutu pojedynczej bazy danych.
źródło
@Josue Alexander Ibarra odpowiedź działa na centos 7 i wersji 9.5, jeśli --dbname nie zostanie przekazane.
źródło
--dbname
Pamiętaj, że w systemie Windows
pgpass.conf
plik musi znajdować się w następującym folderze:jeśli w
postgresql
folderze nie ma%APPDATA%
folderu, utwórz go.pgpass.conf
zawartość pliku jest coś takiego:Twoje zdrowie
źródło
Popraw mnie, jeśli się mylę, ale jeśli użytkownik systemu jest taki sam jak użytkownik bazy danych, PostgreSQL nie poprosi o hasło - polega na systemie do uwierzytelnienia. Może to być kwestia konfiguracji.
Tak więc, gdy chciałem właściciela bazy danych
postgres
do tworzenia kopii zapasowych swoich bazach danych każdej nocy, mogę stworzyć crontab dla niego:crontab -e -u postgres
. Oczywiściepostgres
należałoby zezwolić na wykonywanie zadań crona; dlatego musi być wymieniony w/etc/cron.allow
lub/etc/cron.deny
musi być pusty.źródło
Wykonaj kopię zapasową przez ssh za pomocą hasła przy użyciu tymczasowych poświadczeń .pgpass i przekaż do S3:
Wystarczy zastąpić pierwszą parę linii konfiguracji tym, czego potrzebujesz - oczywiście. Dla tych, którzy nie są zainteresowani częścią zapasową S3, wyjmij ją - oczywiście.
Skrypt ten usuwa później poświadczenia,
.pgpass
ponieważ w niektórych środowiskach domyślny użytkownik SSH może sudo bez hasła, na przykład wystąpienie EC2 zubuntu
użytkownikiem, więc używanie.pgpass
innego konta hosta w celu zabezpieczenia tych poświadczeń może być bezcelowe.źródło
history
ten sposób, nie?history -c
. Korzystając z Jenkins, użyjInject passwords to the build as environment variables
opcji, aby hasło było maskowaneJak szczegółowo opisano w tym poście na blogu , istnieją dwa sposoby nieinteraktywnego podania hasła do narzędzi PostgreSQL, takich jak polecenie „pg_dump”: użycie pliku „.pgpass” lub użycie zmiennej środowiskowej „PGPASSWORD” .
źródło
Innym (prawdopodobnie nie bezpiecznym) sposobem na podanie hasła jest przekierowanie wejściowe, tj. Wywołanie
pg_dump [params] < [path to file containing password]
źródło
Możesz przekazać hasło bezpośrednio do pg_dump, używając następujących poleceń:
źródło
według mnie najłatwiejszy sposób: edytujesz główny plik konfiguracyjny postgres: pg_hba.conf tam musisz dodać następujący wiersz:
host <you_db_name> <you_db_owner> 127.0.0.1/32 trust
a potem musisz zacząć cron w ten sposób:
pg_dump -h 127.0.0.1 -U <you_db_user> <you_db_name> | gzip > /backup/db/$(date +%Y-%m-%d).psql.gz
i działało bez hasła
źródło