Saya sedang mencari cara mengubah cadangan dilakukan dan saya bertanya-tanya apakah ada cara untuk menentukan database mana dalam cluster postgreql yang belum diubah baru-baru ini?
Alih-alih menggunakan pg_dumpall, saya ingin menggunakan pg_dump dan hanya membuang database yang telah berubah sejak cadangan terakhir (beberapa database tidak sering diperbarui) - gagasannya adalah jika tidak ada yang berubah maka cadangan saat ini harus tetap baik.
Adakah yang tahu cara menentukan kapan database tertentu terakhir diperbarui / diubah?
Terima kasih...
Memperbarui:
Saya berharap tidak harus menulis pemicu di semua tempat karena saya tidak memiliki kendali atas pembuatan database dalam satu cluster tertentu (apalagi penciptaan objek db dalam database).
Menggali lebih jauh, sepertinya ada korelasi antara isi file $ PGDATA / global / pg_database (khususnya bidang kedua) dan nama direktori di bawah $ PGDATA / base.
Akan mengambil risiko, saya kira bidang kedua dari file pg_database adalah database oid dan bahwa setiap database memiliki subdirektori sendiri di bawah $ PGDATA / base (dengan oid untuk nama subdirektori). Apakah itu benar? Jika demikian, apakah masuk akal untuk menggunakan cap waktu file dari file di bawah $ PGDATA / base / * sebagai pemicu untuk memerlukan cadangan?
... atau ada cara yang lebih baik?
Terima kasih lagi...
sumber
Jawaban:
Sementara menggunakan
select datname, xact_commit from pg_stat_database;
seperti yang disarankan oleh @Jack Douglas tidak cukup bekerja (tampaknya karena autovacuum),select datname, tup_inserted, tup_updated, tup_deleted from pg_stat_database
tampaknya berfungsi. Perubahan DML dan DDL akan mengubah nilai kolom tup_ * sementara avacuum
tidak (vacuum analyze
di sisi lain ...).Jika hal ini bermanfaat bagi orang lain, saya menyertakan skrip cadangan yang telah saya tempatkan. Ini berfungsi untuk Pg 8.4.x tetapi tidak untuk 8.2.x-- YMMV tergantung pada versi Pg yang digunakan.
Pembaruan: skrip telah diletakkan di github di sini .
sumber
Sepertinya Anda dapat menggunakan
pg_stat_database
untuk mendapatkan jumlah transaksi dan memeriksa apakah ini berubah dari satu pencadangan ke yang berikutnya:Jika seseorang menelepon
pg_stat_reset
Anda, Anda tidak dapat memastikan apakah db telah berubah atau tidak, tetapi Anda mungkin menganggapnya tidak cukup bahwa itu akan terjadi, diikuti dengan jumlah transaksi yang tepat untuk mencocokkan pembacaan terakhir Anda.--EDIT
lihat pertanyaan SO ini mengapa ini tidak berhasil. Tidak yakin mengapa ini bisa terjadi tetapi mengaktifkan logging mungkin memberi sedikit cahaya ....
sumber
pg_stat_reset
maka probabilitas nilai xact_commit yang cocok dengan yang sebelumnya akan sangat rendah, bukan? Jadi yang pasti terlihat menangkap adanya perubahan DML. Sekarang yang saya butuhkan adalah menangkap jika ada perubahan DDL.create table ...
tes cepat tampaknya menambah xact_commit.Dari menggali di sekitar postgres doc dan newsgroup:
txid_current()
akan memberi Anda yang baruxid
- jika Anda memanggil fungsi lagi di kemudian hari, jika Anda mendapatkan yangxid
lebih tinggi, Anda tahu bahwa tidak ada transaksi yang dilakukan antara kedua panggilan. Anda mungkin mendapatkan hasil positif palsu - misalnya jika orang lain menelepontxid_current()
sumber
Ingat stempel waktu pada file Anda yang berisi data-DB dan lihat apakah sudah berubah. Jika mereka melakukannya ada tulisan.
Sunting setelah WAL-hint: Anda harus melakukan ini hanya setelah menyiram tulisan yang beredar.
sumber
Postgresql 9.5 mari kita lacak timestamp terakhir yang dimodifikasi untuk memeriksa tautan ini https://thirumal-opensource.blogspot.in/2017/03/to-track-last-modified-commit-or-get.html
sumber