Saya mencoba untuk membuat cronjob untuk membuat cadangan basis data saya setiap malam sebelum sesuatu bencana terjadi. Sepertinya perintah ini harus memenuhi kebutuhan saya:
0 3 * * * pg_dump dbname | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz
Kecuali setelah menjalankan itu, saya mengharapkan untuk mengetikkan kata sandi. Saya tidak bisa melakukan itu jika saya menjalankannya dari cron. Bagaimana saya bisa memasukkan satu secara otomatis?
bash
postgresql
shell
crontab
Mpen
sumber
sumber
Jawaban:
Buat
.pgpass
file di direktori home dari akun yangpg_dump
akan dijalankan sebagai. Lihat dokumentasi Postgresql libpq-pgpass untuk rincian format (termasuk paragraf terakhir yang menjelaskannya akan diabaikan jika Anda tidak mengatur mode ke0600
).sumber
sudo su postgres
: bahwa pengguna Unix belum tentu ada. Tidak perlu. Tetapi pengguna DB harus.Atau Anda dapat mengatur crontab untuk menjalankan skrip. Di dalam skrip itu Anda dapat mengatur variabel lingkungan seperti ini:
export PGPASSWORD="$put_here_the_password"
Dengan cara ini jika Anda memiliki banyak perintah yang memerlukan kata sandi, Anda dapat memasukkan semuanya ke dalam skrip. Jika kata sandi berubah, Anda hanya perlu mengubahnya di satu tempat (skrip).
Dan saya setuju dengan Joshua, menggunakan
pg_dump -Fc
menghasilkan format ekspor paling fleksibel dan sudah dikompresi. Untuk info lebih lanjut, lihat: dokumentasi pg_dumpMisalnya
sumber
.pgpass
akan membuat semuanya tetap di satu tempat juga, tanpa menambahkan lapisan tipuan tambahan. ditambah, jika semua yang ingin saya lakukan dengan mengekspor variabel, saya akan melakukannya di.bashrc
file saya , atau apa pun itu..pgpass
file tersebut menjadi solusi yang lebih baik. Saya hanya memberikan alternatif, tidak yakin apakah itu layak untuk downvote :)Jika Anda ingin melakukannya dalam satu perintah:
sumber
postgres://
sintaks. Tidak mencoba.pgpass
karena pengguna postgress saya tidak memiliki direktori home.Untuk one-liner, seperti memigrasikan basis data yang dapat Anda gunakan
--dbname
diikuti oleh koneksi string (termasuk kata sandi) seperti yang dinyatakan dalam manual pg_dumpIntinya.
pg_dump --dbname=postgresql://username:[email protected]:5432/mydatabase
Catatan: Pastikan Anda menggunakan opsi
--dbname
alih-alih yang lebih pendek-d
dan menggunakan awalan URI yang valid,postgresql://
ataupostgres://
.Bentuk URI umum adalah:
postgresql://[user[:password]@][netloc][:port][/dbname][?param1=value1&...]
Praktik terbaik dalam kasus Anda (tugas berulang di cron) ini tidak boleh dilakukan karena masalah keamanan. Jika bukan karena
.pgpass
file saya akan menyimpan string koneksi sebagai variabel lingkungan.export MYDB=postgresql://username:[email protected]:5432/mydatabase
kemudian miliki di crontab Anda
0 3 * * * pg_dump --dbname=$MYDB | gzip > ~/backup/db/$(date +%Y-%m-%d).psql.gz
sumber
sumber
Liner satu ini membantu saya saat membuat dump dari satu basis data.
sumber
@Josue Alexander Ibarra menjawab berfungsi pada centos 7 dan versi 9.5 jika --dbname tidak disahkan.
sumber
--dbname
Perhatikan bahwa, di windows,
pgpass.conf
file tersebut harus berada di folder berikut:jika tidak ada
postgresql
folder di dalam%APPDATA%
folder, buatlah.yang
pgpass.conf
isi file adalah sesuatu seperti:Bersulang
sumber
Perbaiki saya jika saya salah, tetapi jika pengguna sistem sama dengan pengguna basis data, PostgreSQL tidak akan meminta kata sandi - itu bergantung pada sistem untuk otentikasi. Ini mungkin masalah konfigurasi.
Jadi, ketika saya ingin pemilik database
postgres
untuk backup database-nya setiap malam, saya bisa membuat crontab untuk itu:crontab -e -u postgres
. Tentu saja,postgres
perlu diizinkan untuk menjalankan pekerjaan cron; karena itu harus terdaftar dalam/etc/cron.allow
, atau/etc/cron.deny
harus kosong.sumber
Cadangkan lewat ssh dengan kata sandi menggunakan kredensial .pgpass sementara dan tekan ke S3:
Ganti saja beberapa baris konfigurasi pertama dengan apa pun yang Anda butuhkan - jelas. Bagi mereka yang tidak tertarik pada bagian cadangan S3, keluarkan - jelas.
Script ini menghapus kredensial
.pgpass
setelahnya karena di beberapa lingkungan, pengguna SSH default dapat sudo tanpa kata sandi, misalnya instance EC2 denganubuntu
pengguna, jadi menggunakan.pgpass
dengan akun host yang berbeda untuk mengamankan kredensial tersebut, mungkin tidak ada gunanya.sumber
history
dengan cara ini, bukan?history -c
. Saat menggunakan dengan Jenkins, gunakanInject passwords to the build as environment variables
opsi sehingga kata sandi ditutupSebagaimana dirinci dalam posting blog ini , ada dua cara untuk secara nonaktif memberikan kata sandi ke utilitas PostgreSQL seperti perintah "pg_dump": menggunakan file ".pgpass" atau menggunakan variabel lingkungan "PGPASSWORD" .
sumber
Cara lain (mungkin tidak aman) untuk memasukkan kata sandi adalah menggunakan pengalihan input yaitu menelepon
pg_dump [params] < [path to file containing password]
sumber
Anda dapat mengirimkan kata sandi ke pg_dump secara langsung dengan menggunakan yang berikut:
sumber
cara termudah menurut saya, ini: Anda mengedit file konfigurasi postgres utama Anda: pg_hba.conf di sana Anda harus menambahkan baris berikut:
host <you_db_name> <you_db_owner> 127.0.0.1/32 trust
dan setelah ini, Anda perlu memulai Anda cron demikian:
pg_dump -h 127.0.0.1 -U <you_db_user> <you_db_name> | gzip > /backup/db/$(date +%Y-%m-%d).psql.gz
dan itu bekerja tanpa kata sandi
sumber