Cara mendapatkan cadangan dan tes PostgreSQL DB yang berfungsi dan lengkap

45

Saya berharap saya bisa mendapatkan jawaban yang jelas tentang cara memastikan mengambil cadangan Postgres lengkap seperti yang Anda dapatkan dengan MS SQL Server, dan kemudian mengurus pengguna yatim.

Dari apa yang saya baca, dan bisa saja salah, menemukan blog PostgreSQL yang bagus telah menjadi tantangan, jadi jangan ragu untuk merekomendasikan beberapa kepada saya, saya perlu mencari tahu bagaimana aplikasi ini bekerja sehingga saya dapat memiliki kepercayaan pada backup dan Slony saya. replikasi. Saya meminta pengembang mengembalikan cadangan yang saya ambil dari PgadminIII via custom,, directorydan tarmemformat ketika memilih OIDtetapi dia mengatakan dua dari mereka tidak memuat, tartetapi hanya direktori, bukan data. Saya benar-benar bingung sekarang.

  1. Saya menggunakan PGAdminIII, ia memiliki opsi pg_dumpdan pg_dumpall. Saya ingin mencadangkan semuanya yang harus saya uji untuk memulihkan database ini di suatu tempat dan memverifikasi bahwa ya, semua data yang kami butuhkan dan cadangan kami baik. Akhirnya saya ingin menulis skrip pemulihan otomatis tetapi satu hari setiap kali.

pg_dumpalltampaknya memiliki -globalsopsi yang seharusnya mencadangkan segalanya, tetapi bantuan untuk pg_dumpallmenunjukkan -g, --globals-only dump only global objects, no databases, bukan --globalsopsi.

Saya pikir pg_dumpallsetidaknya akan membuat cadangan kunci asing, tetapi bahkan itu tampaknya menjadi 'opsi'. Menurut dokumentasi , bahkan dengan pg_dumpallsaya perlu menggunakan -oopsi untuk membuat cadangan kunci asing, saya tidak bisa membayangkan ketika saya tidak ingin membuat cadangan kunci asing dan ini akan lebih masuk akal sebagai opsi default.

  1. Bagaimana saya merawat pengguna yatim dan memvalidasi saya memiliki segalanya? Saya benar-benar ingin mengembalikan file cadangan saya di server lain dan memverifikasi semuanya berfungsi. Jika ada yang punya saran tentang cara mengambil cadangan nyata di PostgreSQL dan memulihkan, saya akan sangat berterima kasih.

Saya memiliki server PostgreSQL tetapi saya masih belum dapat memahami mengapa aplikasi tidak akan mencadangkan OIDsecara default! Sepertinya 99,9% dari waktu yang Anda inginkan itu.

PEMBARUAN 1:

Dokumentasi Postgres menyebutkan bahwa globalsopsi yang saya cari tampaknya menjadi opsi default pada versi ini, tetapi masih membutuhkan -oopsi. Jika seseorang dapat memverifikasi atau memberi saya contoh perintah untuk memulihkan satu database di tempat lain dengan semua yang dibutuhkan, saya akan menghargainya.

Sunting: ditanya oleh situs untuk menunjukkan keunikan pertanyaan ini dengan mengedit pertanyaan saya. Pertanyaan ini menimbulkan masalah dan mendapatkan kejelasan tentang OID dalam cadangan, perbedaan antara global dan non global, serta pengujian mengembalikan rekomendasi untuk memastikan cadangan itu baik, bukan hanya cadangan. Karena jawaban yang saya dapat backup, mencari global / oids, dan memulai proses tes pemulihan setiap malam di Postgres menggunakan pekerjaan cron. Terima kasih untuk bantuannya!

Ali Razeghi
sumber
Kemungkinan duplikat Pencadangan Database Lengkap PostgreSQL
raphael

Jawaban:

58

Anda dapat membuang seluruh cluster PostgreSQL dengan pg_dumpall. Itu semua database dan semua global untuk satu cluster. Dari baris perintah di server, saya akan melakukan sesuatu seperti ini. (Tambang mendengarkan pada port 5433, bukan pada port default.) Anda mungkin atau mungkin tidak memerlukan opsi --clean.

$ pg_dumpall -U postgres -h localhost -p 5433 --clean --file=dump.sql

Ini termasuk global - informasi tentang pengguna dan grup, tablespace, dan sebagainya.

Jika saya akan membuat cadangan satu database dan memindahkannya ke server awal , saya akan membuang database dengan pg_dump, dan membuang global dengan

  • pg_dumpall --globals-only, atau
  • pg_dumpall --roles-only (jika Anda hanya membutuhkan peran)

seperti ini.

$ pg_dump -U postgres -h localhost -p 5433 --clean --file=sandbox.sql sandbox
$ pg_dumpall -U postgres -h localhost -p 5433 --clean --globals-only --file=globals.sql

Keluaran hanyalah file teks.

Setelah Anda memindahkan file-file ini ke server yang berbeda, muat global terlebih dahulu, lalu buang database.

$ psql -U postgres -h localhost -p 5433 < globals.sql
$ psql -U postgres -h localhost -p 5433 < sandbox.sql

Saya pikir pg_dumpall setidaknya akan membuat cadangan kunci asing, tetapi bahkan itu tampaknya menjadi 'opsi'. Menurut: http://www.postgresql.org/docs/9.1/static/app-pg-dumpall.html bahkan dengan pg_dumpall saya harus menggunakan opsi -o untuk membuat cadangan kunci asing

Tidak, referensi itu mengatakan "Gunakan opsi ini jika aplikasi Anda mereferensikan kolom OID dengan cara tertentu (misalnya, dalam batasan kunci asing). Jika tidak, opsi ini tidak boleh digunakan." (Penekanan ditambahkan.) Saya pikir aplikasi Anda tidak mereferensikan kolom OID. Anda tidak perlu menggunakan opsi ini untuk "membuat cadangan kunci asing". (Baca file dump di editor atau penampil file Anda.)

Mike Sherrill 'Cat Recall'
sumber
3
Bukankah nama database hilang dari baris tempat sandbox.sql sedang diimpor? psql -U postgres -h localhost -p 5433 sandbox < sandbox.sql
SebK
Itu melihat bahwa pg_dumpall, versi 9.5, tidak bekerja dengan benar dengan NULLnilai - nilai saat menggunakan COPY. Saya mendapatkan banyak kesalahan seperti ini: psql:/tmp/dumpall.sql:4133559: invalid command \N psql:/tmp/dumpall.sql:4133560: invalid command \.Ketika mengimpor kembali ke Postgres 10 menggunakanpsql -f /tmp/dumpall.sql
piotrekkr