Jaga agar latihan pertama sengaja kecil
Latihan ini membuat basis data catatan mainan dan satu lampiran, menangkap keduanya, lalu memulihkannya ke basis data dan direktori baru. Gunakan mesin Linux sekali pakai dengan server PostgreSQL 17 dan utilitas klien yang cocok, Bash dan GNU coreutils. Mesin tersebut tidak boleh berisi data produksi dan tidak memiliki koneksi ke aplikasi produksi, email keluar, atau tugas terjadwal. Gunakan hanya arsip yang dibuat dalam latihan ini.
Perintah mengasumsikan peran basis data non-superuser yang telah dikonfigurasi bernama restore_lab, diizinkan untuk membuat basis data pengujian, dan login OS dengan nama yang sama yang dapat mengautentikasi secara lokal. Socket PostgreSQL adalah /var/run/postgresql pada port 5432. Minta administrator menyiapkan akun tersebut di lingkungan sekali pakai; panduan ini tidak mengubah aturan akses basis data. Periksa endpoint sebelum membuat apa pun:
psql -h /var/run/postgresql -p 5432 -U restore_lab -d postgres -c '\conninfo' &&
pg_dump --version &&
pg_restore --version
Berhenti jika host, akun, atau versi tidak terduga. Jaga klien dan server pada versi major yang sama untuk latihan pertama ini. pg_dump tidak dapat melakukan dump pada server yang lebih baru dari versi major-nya sendiri, dan target pemulihan yang lebih lama umumnya tidak dijamin kompatibel. Lihat batas versi pg_dump. Jalankan setiap blok secara terpisah dan berhenti pada kesalahan. Penjaga && mencegah perintah selanjutnya dalam blok yang ditempel berjalan setelah kegagalan; jangan pernah melanjutkan ke blok berikutnya setelah pembuatan basis data atau direktori gagal.
Buat catatan dan file yang cocok
Nama-nama offvps_restore_source dan offvps_restore_target harus belum digunakan. Basis data yang sudah ada adalah alasan untuk berhenti dan memilih latihan terisolasi baru, bukan alasan untuk menghapusnya. Buat ruang kerja filesystem baru dan basis data sumber:
umask 077 &&
lab=$(mktemp -d "$PWD/offvps-restore.XXXXXX") &&
mkdir "$lab/source" "$lab/source/uploads" "$lab/bundle" "$lab/restore" &&
createdb -h /var/run/postgresql -p 5432 -U restore_lab \
--template=template0 offvps_restore_source
Ruang kerja baru menghindari penulisan ke direktori yang ada. mktemp membuat direktori unik; createdb membuat basis data baru dari templat yang dipilih. Simpan dua penanda ini:
psql -X -v ON_ERROR_STOP=1 -h /var/run/postgresql -p 5432 \
-U restore_lab -d offvps_restore_source \
-c "CREATE TABLE notes (
id integer PRIMARY KEY,
body text NOT NULL,
attachment text NOT NULL
);
INSERT INTO notes VALUES (1, 'restore-marker-01', 'marker.txt');" &&
printf '%s\n' 'restore-marker-01' > "$lab/source/uploads/marker.txt"
Catatan menunjukkan file mana yang menjadi milik catatan, dan keduanya berisi penanda yang sama. Ini membuat lampiran yang hilang atau salinan yang tidak cocok terlihat. -X menghindari pengaturan awal psql pribadi dan ON_ERROR_STOP berhenti pada kesalahan SQL; lihat opsi pembuatan skrip psql. Tidak ada aplikasi yang menulis ke dataset mainan ini.
Tangkap basis data dan file sebagai satu set pemulihan
pg_dump -h /var/run/postgresql -p 5432 -U restore_lab \
--format=custom --file="$lab/bundle/notes.dump" offvps_restore_source &&
cp -a "$lab/source/uploads" "$lab/bundle/uploads" &&
pg_restore --list "$lab/bundle/notes.dump"
Arsip format kustom dibaca oleh pg_restore; dump SQL biasa mengikuti prosedur pemulihan yang berbeda. Mencantumkan arsip membantu mengonfirmasi bahwa tabel dan entri data yang diharapkan ada. Dump basis data yang konsisten tidak secara otomatis menyinkronkan unggahan eksternal. Untuk aplikasi nyata, gunakan prosedur pemeliharaan atau jeda tulis yang didokumentasikan sehingga pohon file dan basis data menggambarkan titik waktu yang sama. Latihan mainan sudah tenang.
Catat versi basis data, rilis aplikasi, awal/akhir penangkapan, dan jalur file di samping bundel. Simpan kredensial nyata secara terpisah di bawah kontrol akses yang sesuai. Dump per basis data tidak menangkap peran global dan tablespace; rencana pemulihan nyata harus memperhitungkannya juga. Cakupannya dijelaskan dalam Panduan dump SQL PostgreSQL.
Pulihkan ke target baru tanpa membersihkan target yang ada
createdb -h /var/run/postgresql -p 5432 -U restore_lab \
--template=template0 offvps_restore_target &&
pg_restore -h /var/run/postgresql -p 5432 -U restore_lab \
--dbname=offvps_restore_target --no-owner --no-acl \
--single-transaction "$lab/bundle/notes.dump" &&
mkdir "$lab/restore/uploads" &&
cp -a "$lab/bundle/uploads/." "$lab/restore/uploads/"
Basis data target dibuat kosong. Pemulihan sengaja menghilangkan --clean, yang dapat menghapus objek yang ada. --single-transaction membuat pemulihan basis data kecil ini berhasil sebagai satu kesatuan atau berhenti tanpa menerapkan perubahan parsialnya; tidak dapat digabungkan dengan pekerjaan paralel. --no-owner dan --no-acl menyederhanakan kepemilikan untuk peran pengujian ini, sehingga latihan ini tidak memvalidasi peran atau izin produksi aplikasi. Lihat pg_restore.
Salinan file menargetkan direktori pemulihan baru, membiarkan sumber tetap utuh. GNU cp -a mencoba mempertahankan atribut file; periksa kepemilikan dan akses untuk akun yang akan menjalankan aplikasi nyata. Menyalin byte bukanlah pengujian izin aplikasi. Lihat opsi arsip cp.
Periksa hubungan, bukan hanya kode keluar
psql -X -h /var/run/postgresql -p 5432 -U restore_lab \
-d offvps_restore_target -c "SELECT id, body, attachment FROM notes;" &&
cat "$lab/restore/uploads/marker.txt"
Hasil yang diharapkan adalah satu baris dengan ID 1, isi restore-marker-01 dan lampiran marker.txt, plus file yang berisi restore-marker-01. Periksa bahwa sumber masih berisi baris dan file aslinya. Untuk aplikasi nyata Anda, arahkan juga instance terisolasi ke basis data dan direktori unggahan yang dipulihkan, buka catatan perwakilan, ambil lampiran, dan uji izin login yang dimaksudkan. Jaga callback, email, dan tugas tetap terkendali saat melakukannya.
Catat apa yang Anda buktikan dan apa yang tersisa
| Catatan | Apa yang harus ditangkap |
|---|---|
| Titik pemulihan | Waktu penangkapan dan catatan terbaru yang diharapkan |
| Durasi pemulihan | Waktu mulai/akhir dan langkah manual |
| Pemeriksaan | Baris basis data, konten lampiran, dan pemeriksaan aplikasi |
| Pengecualian | Peran, izin, konfigurasi, atau dependensi yang hilang |
| Latihan berikutnya | Pemicu seperti perubahan skema, penyimpanan, atau penerapan |
Output yang diharapkan di atas adalah kriteria latihan, bukan hasil yang sudah diamati oleh OffVPS. Karena latihan pertama menyimpan semua file di satu mesin, ini tidak memberikan perlindungan dari kehilangan mesin tersebut. Rencana nyata memerlukan salinan terlindungi di domain kegagalan terpisah, kunci dekripsi yang dapat digunakan, retensi, dan jalur pengambilan yang teruji. Tinjau nama basis data sekali pakai dan direktori yang tepat sebelum pembersihan nanti; jaga produksi di luar proses itu.
Ulangi latihan setelah perubahan penting dan catat kegagalan sebaik keberhasilan. Layanan cadangan opsional tidak membuktikan waktu pemulihan aplikasi Anda. Lanjutkan dengan merencanakan tugas terjadwal saat Anda siap mengotomatiskan penangkapan, sambil mempertahankan latihan pemulihan terpisah.
Dokumentasi yang digunakan
Referensi utama untuk halaman ini. Periksa dokumentasi untuk versi yang terpasang di lingkungan Anda sendiri.