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

52

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.

Zilk
sumber
Anda mengatakan Anda memiliki dump database, bukankah itu cukup? Uji sistem Anda, jika ada kesalahan, gunakan dump untuk mengembalikan DB ke kondisi semula dan terus berkembang.
DrColossos
1
Apakah Anda memulihkan hanya tabel yang telah berubah?
Jack Douglas
1
@ Jack Douglas: Saya memulihkan DB lengkap dari dump. Tabel yang dimaksud adalah sekitar 2/3 dari data, dan saya masih harus khawatir tentang urutan pemulihan yang benar dan pengekangan kunci asing.
Zilk
1
@DrColossus: ya, kesedihan sudah cukup untuk memulihkan keadaan sebelumnya, tetapi membuat dan menerapkannya sangat lambat.
Zilk

Jawaban:

35

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 negara basis Anda sebagai database, dan kemudian membuat database baru dari itu untuk menjalankan tes Anda, menggunakan CREATE DATABASE ... TEMPLATEfungsi. Setelah tes, Anda membuang database itu. Maka batasan kecepatan Anda pada dasarnya hanya waktu ke cp -Rdirektori database. Itu tentang secepat Anda akan dapatkan tanpa sihir snapshot sistem file.

Peter Eisentraut
sumber
Itu ide yang sangat bagus. Saya tidak memikirkan template database sama sekali. Terima kasih!
Zilk
1
Ini adalah solusi yang bagus, 5x lebih cepat dari drop-restore tetapi memiliki satu kelemahan: Anda perlu memutuskan koneksi saat ini sebelum melakukan ini jika tidak maka gagal menjalankannya.
sorin
Pembaruan: ini tidak akan berfungsi dalam produksi karena basis data sumber akan memiliki koneksi ke sana. Kami membutuhkan solusi lain.
sorin
11

Gunakan Stellar , itu seperti git untuk database:

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

David Portabella
sumber
3
atau liquibase.org
David Portabella
liquibase tidak mendukungnya seperti Stellar, di mana Anda dapat bekerja dengan database (misalnya dalam tes unit) dan mungkin harus mengembalikan ke keadaan atau waktu yang ditandai sebelumnya.
Andreas Dietrich
Stellar terdengar seperti ide yang bagus, tetapi tidak berhasil untuk saya
Orlando
5

Jika database Anda berjalan di Virtualbox , Anda dapat dengan mudah menyimpan snapshot dan mengembalikan snapshot dari kedua keadaan database 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 cadangan snapshot MediaTemple untuk mencapai hasil yang sama (tapi $ 20 per slot cadangan dan khusus untuk layanan webhosting, sehingga mungkin tidak cocok untuk Anda).

wildpeaks
sumber
Ah nevermind, saya tidak melihat komentar Anda yang menyebutkan Anda sudah tahu tentang virtualbox.
wildpeaks
3

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

Jack Douglas
sumber
Ya, itu memang terlintas dalam pikiran. Sayangnya, snapshot sistem file tidak didukung oleh FS yang saya gunakan saat ini (ext3). Pilihan lain adalah mengatur VM seperti Virtualbox untuk menjalankan tes.
Zilk
2

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

git reset --hard
pengguna92843
sumber
6
Ini tidak ada gunanya untuk database besar. Plus, mengapa menyiksa git dengan file biner dengan ukuran yang bervariasi?
RolandoMySQLDBA
0

Namun pilihan lain yang bisa dicoba adalah menyimpan salinan direktori data postgresql, kemudian menulis ulang direktori yang ada dengan salinan itu 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 membuat beberapa tes, pertama.

Haroldo_OK
sumber
0

Meskipun saya harus mengatakan ini Stellardan git reset --hardmerupakan solusi yang menarik, saya akan memiliki masalah dengan database dan tes yang lebih besar, dan saya memang menggunakan Virtualboxsolusi dll. Namun, dalam tes yang lebih besar, ini menjadi sedikit lebih "bermasalah" ketika Anda menggunakan solusi bare metal dll.

Jadi saya HARUS menyebutkan ZFSsebagai sistem file untuk mempertimbangkan ini di masa depan karena alasan berikut yang @Peter Eisentraut juga sebutkan:

  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 $SNAPSHOTmulai postgresql, lalu untuk kembalikan, hentikan postgresql, dan hanyazfs rollback $SNAPSHOT

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

Keriangan
sumber