Bagaimana cara melakukan backup bertahap setiap jam di Postgres?

18

Mencoba melakukan pencadangan tambahan setiap jam dari satu server Postgres (Win7 64).

Saya memiliki pengaturan berikut di postgresql.conf:

max_wal_senders = 2
wal_level       = archive
archive_mode    = on
archive_command = 'copy "%p" "c:\\postgres\\foo\\%f"'

(mengulang kembali)

Saya melakukan backup dasar dengan pg_basebackup -U postgres -D ..\foo -F t -x

Yang membuat base.tarfile besar di foofolder dan menambahkan beberapa 16.384 file KB, yang saya anggap WAL.

Apa yang saya tidak mengerti adalah mengapa WAL di footidak berubah . WAL dalam data/pg_xlogperubahan. Apakah pg tidak seharusnya menyalinnya? Bagaimana cara memutuskan untuk melakukannya?

Mungkin saya perlu mengatur archive_timeout=3600?

Saya telah melihat beberapa situs (milis pg, halaman postgres bacula) yang mengatakan Anda perlu memanggil pg_start_backup () dan pg_stop_backup (), tetapi saya percaya bahwa itu tidak diperlukan. Benarkah itu?

Pertanyaan sekunder:

  1. Seberapa sering WALs data/pg_xlogditulis? Apa yang memicu penulisan?

    Tampaknya untuk memperbarui WAL jika saya melakukan DML maka \qdalam psql. Atau edit tabel di pgAdmin lalu tutup jendela. Saya pikir itu akan menulis di komit.

  2. Praktik terbaik? pg_basebackup seminggu sekali? Mengarsipkan WAL ke mesin yang sama dengan PG atau mesin jarak jauh?

Neil McGuigan
sumber

Jawaban:

5

Anda ingin melakukan cadangan tambahan dari folder arsip ke penyimpanan jarak jauh.

Jika Anda perlu memulihkan dari cadangan, skenario dasarnya adalah Anda memerlukan cadangan dasar sebagai titik awal, dan seluruh konten folder arsip untuk memutar ulang aktivitas transaksional yang terjadi antara titik awal dan kerusakan.

Juga untuk menghindari agar file-file di folder arsip tidak menumpuk selamanya, Anda ingin melakukan backup base baru dari waktu ke waktu dan menghapus file-file yang diarsipkan sebelum backup base baru.

Daniel Vérité
sumber
Terima kasih. Beberapa pertanyaan: 1. Apakah saya melakukan pg_start_backup (), menyalin data, lalu menjalankan pg_stop_backup (), atau pg_start_backup (); pg_stop_backup (), lalu salin?
Neil McGuigan
@Neil: 1. dan 2. tidak berlaku saat Anda menggunakannya pg_basebackup, ini sudah menangani ini. 3. postgres akan secara otomatis menghapus file WAL pg_logketika mereka tidak lagi diperlukan. Anda tidak boleh melakukan apa pun secara manual di pg_log. Jika tidak, lihat wal_keep_segmentsparameter
Daniel Vérité
menurut folder "arsip" yang Anda maksud pg_xlog, ya?
Neil McGuigan
@NeilMcGuigan: sama sekali tidak. Folder arsip adalah folder tujuan dari perintah arsip Anda, misalnya di sini "c: \ postgres \ foo". pg_xlogsepenuhnya dikelola secara otomatis oleh postgres, sedangkan folder arsip sepenuhnya dikelola oleh DBA.
Daniel Vérité
Saya kira saya bingung karena WALs di foo tidak pernah berubah setelah pg_basebackup awal
Neil McGuigan
8

Ada alat yang ada yang akan banyak membantu Anda, WAL-E . Ini memberikan archive_commanddan restore_commanduntuk PITR ke S3.

Tidak ada perintah untuk melakukan backup logis inkremental atau diferensial . pg_dumptidak dapat mengambil inkremental atau diferensial. Satu-satunya cara untuk melakukannya adalah melalui pengarsipan log.

Secara teori Anda bisa mengambil cadangan penuh baru, lakukan perbedaan biner di antara itu dan cadangan terakhir, dan unggah beda. Ini menurut saya sebagai cara yang rapuh dan tidak efisien untuk melakukan sesuatu, dan saya benar-benar tidak akan merekomendasikannya.

Selain itu, PgBarman mendukung integrasi dengan S3 melalui skrip kait, dan akan mengotomatisasi banyak rotasi dan manajemen cadangan untuk Anda. Sekali lagi, ini mungkin bukan opsi di Windows.

Craig Ringer
sumber