it-swarm.asia

Apakah mungkin untuk dengan cepat membuat / mengembalikan snapshot basis data dengan PostgreSQL?

Pertama-tama, saya seorang pengembang, bukan DBA atau sysadmin; harap lembut :)

Saya sedang mengerjakan alur kerja aplikasi di mana tindakan pengguna tunggal akan memicu perubahan kompleks dalam database - membuat ratusan catatan di beberapa tabel, memperbarui ratusan catatan di yang lain, dll. Semua dalam semua, sekitar 12 tabel (dari ~ 100 ) tersentuh oleh tindakan ini. Karena kerumitannya, sangat sulit bagi saya untuk secara manual mengembalikan semua perubahan sebelum saya dapat menjalankan tes lain. Selama sebagian besar waktu pengembangan saya, saya cukup menyisipkan pernyataan "ROLLBACK" di dekat akhir alur kerja, tetapi ketika saya hampir melakukan perubahan, saya perlu menguji hal yang sebenarnya.

Saya memiliki salinan lokal dari basis data produksi untuk dikerjakan. Dalam kasus saya, membuang dan memulihkan antar tes lebih cepat daripada menulis skrip untuk membatalkan semua perubahan. Ini lebih cepat, tetapi masih banyak memperlambat saya (pemulihan membutuhkan sekitar 20 menit pada laptop saya yang sudah tua). Apakah ada cara saya dapat menyimpan snapshot dari kondisi database saat ini, dan kemudian segera mengembalikannya?

Saya dijamin menjadi satu-satunya pengguna di sistem, dan saya memiliki akses root. Database dump ~ 100MB ketika tar'ed dan gzip'ed. Versi PostgreSQL adalah 8.3.

Terima kasih sebelumnya atas ide-ide yang bermanfaat.

54
Zilk

Anda dapat menggunakan snapshot tingkat sistem file, tetapi itu seringkali cukup rumit, membutuhkan sistem file khusus, dan tidak selalu tersedia, terutama pada laptop yang sudah tua. ;-)

Bagaimana kalau Anda membuat status dasar Anda sebagai basis data, dan kemudian membuat basis data baru darinya untuk percobaan Anda, menggunakan CREATE DATABASE ... TEMPLATE Kegunaan. Setelah tes, Anda membuang database itu. Maka batasan kecepatan Anda pada dasarnya hanya waktu untuk cp -R direktori basis data. Itu tentang secepat Anda akan dapatkan tanpa sihir snapshot sistem file.

36
Peter Eisentraut

Gunakan Stellar , itu seperti git untuk basis data:

Stellar memungkinkan Anda memulihkan database dengan cepat saat Anda mis. menulis migrasi basis data, beralih cabang atau mengacaukan SQL. PostgreSQL dan MySQL (sebagian) didukung.

12
David Portabella

Jika basis data Anda berjalan Virtualbox , Anda dapat dengan mudah menyimpan snapshot dan mengembalikan snapshot dari keadaan basis data dan OS itu sendiri dalam beberapa detik (atau 1-2 menit jika Anda benar-benar memiliki banyak data dalam database atau OS atau sangat sedikit memori yang dialokasikan ke mesin virtual) secara gratis.

Dalam kasus Anda/kebanyakan, akan lebih baik untuk menginstal linux ringan (dari server Windows) untuk menjalankan mesin virtual di mana database dihosting mengingat Anda menyebutkan Anda memiliki sedikit sumber daya yang tersedia di laptop Anda.


Di situs produksi, saya menggunakan MediaTemple backup snapshot untuk mencapai hasil yang sama (tapi $ 20 per slot cadangan dan khusus untuk layanan webhosting, sehingga mungkin tidak cocok untuk Anda).

5
wildpeaks

Mungkin bukan jawaban yang Anda harapkan, tetapi apakah Anda sudah mempertimbangkan beberapa level snapshotting yang lebih rendah - LVM misalnya?

Menemukan pertanyaan ini ketika mencoba melakukan hal yang sama dan akhirnya menggunakan git pada direktori data postgresql. Membuang perubahan semudah:

git reset --hard
2
user92843

Meskipun saya harus mengatakan Stellar dan git reset --hard adalah solusi yang menarik, saya akan memiliki masalah dengan database dan tes yang lebih besar, dan saya memang menggunakan solusi Virtualbox dll., bagaimanapun, dalam tes yang lebih besar, ini menjadi sedikit lebih "bermasalah" ketika Anda menggunakan solusi bare metal dll.

Jadi saya HARUS menyebutkan ZFS sebagai sistem file untuk dipertimbangkan di masa depan karena alasan berikut yang juga disebutkan oleh @Peter Eisentraut:

  1. Snapshots - terutama ketika Anda melakukan replikasi dari Prod ke QA/DR, Anda dapat menggunakan "filesystem" yang sama untuk pengujian:
#On a replication node, rather stop, snap, restore for a "consistent" backup ;)
su -l -c "/usr/bin/m2ee stop" acw_qa
pg_ctlcluster ${=QA} stop --force
zfs destroy -R $SNAPSHOT
pg_ctlcluster ${=REPLICATION} stop --force
zfs snapshot $SNAPSHOT
pg_ctlcluster ${=REPLICATION} start

zfs destroy $CLONE
zfs clone -o mountpoint=$CLONEDIR $SNAPSHOT $CLONE
rm $CLONEDIR/$CLUSTER/recovery.conf
pg_ctlcluster ${=QA} start
su -l -c "/usr/bin/m2ee start" acw_qa
  1. untuk melakukan tes, tepat sebelum tes lakukan postgresql berhenti seperti di atas, zfs snapshot $SNAPSHOT mulai postgresql, lalu untuk kembalikan, hentikan postgresql, dan hanya zfs rollback $SNAPSHOT

  2. Kompresi - Postgresql mendapatkan kompresi 3: 1 pada basis data saya, sehingga Anda dapat melakukan lebih banyak pengujian;)

0
Hvisage

Namun pilihan lain yang bisa dicoba adalah menyimpan salinan direktori data postgresql, kemudian hanya menulis ulang direktori yang ada dengan salinan ketika Anda ingin mengembalikannya. Ini akan membutuhkan lebih banyak ruang di disk, tetapi pasti akan lebih cepat daripada memulihkan dari cadangan. Saya tidak yakin apakah ini akan lebih cepat daripada metode templat, jadi itu ide yang baik untuk melakukan beberapa tes, pertama.

0
Haroldo_OK