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.
sumber
Jawaban:
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 ... TEMPLATE
fungsi. Setelah tes, Anda membuang database itu. Maka batasan kecepatan Anda pada dasarnya hanya waktu kecp -R
direktori database. Itu tentang secepat Anda akan dapatkan tanpa sihir snapshot sistem file.sumber
Gunakan Stellar , itu seperti git untuk database:
sumber
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).
sumber
Mungkin bukan jawaban yang Anda harapkan, tetapi apakah Anda sudah mempertimbangkan beberapa level snapshotting yang lebih rendah - LVM misalnya?
sumber
Menemukan pertanyaan ini ketika mencoba melakukan hal yang sama dan akhirnya menggunakan git pada direktori data postgresql. Membuang perubahan semudah:
sumber
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.
sumber
Meskipun saya harus mengatakan ini
Stellar
dangit reset --hard
merupakan solusi yang menarik, saya akan memiliki masalah dengan database dan tes yang lebih besar, dan saya memang menggunakanVirtualbox
solusi dll. Namun, 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 mempertimbangkan ini di masa depan karena alasan berikut yang @Peter Eisentraut juga sebutkan:untuk melakukan tes, tepat sebelum tes lakukan postgresql berhenti seperti di atas,
zfs snapshot $SNAPSHOT
mulai postgresql, lalu untuk kembalikan, hentikan postgresql, dan hanyazfs rollback $SNAPSHOT
Kompresi - Postgresql mendapatkan kompresi 3: 1 pada basis data saya, sehingga Anda dapat melakukan lebih banyak pengujian;)
sumber