pgroll adalah alat baris perintah open source yang menawarkan migrasi skema yang aman dan reversibel untuk PostgreSQL dengan melayani beberapa versi skema secara bersamaan. Ini menangani operasi migrasi yang kompleks untuk memastikan bahwa aplikasi klien terus bekerja saat skema basis data sedang diperbarui. Ini termasuk memastikan perubahan diterapkan tanpa mengunci database, dan bahwa versi skema lama dan baru bekerja secara bersamaan (bahkan ketika perubahan perubahan sedang dilakukan!). Ini menghilangkan risiko yang terkait dengan migrasi skema, dan sangat menyederhanakan peluncuran aplikasi klien, juga memungkinkan rollback instan.
Lihat posting blog pengantar untuk lebih lanjut tentang masalah yang diselesaikan oleh pgroll .
pgroll bekerja dengan membuat skema virtual dengan menggunakan tampilan di atas tabel fisik. Ini memungkinkan untuk melakukan semua perubahan yang diperlukan untuk migrasi tanpa mempengaruhi klien yang ada.

pgroll mengikuti alur kerja memperluas/kontrak. Pada awal migrasi, itu akan melakukan semua perubahan aditif (buat tabel, tambahkan kolom, dll) dalam skema fisik, tanpa memecahkannya.
Ketika perubahan yang dipecahkan diperlukan pada kolom, itu akan membuat kolom baru dalam skema fisik, dan lomba kembali dari kolom lama. Juga, konfigurasikan pemicu untuk memastikan semua menulis ke kolom lama/baru disebarkan ke mitranya selama seluruh periode migrasi aktif. Kolom baru kemudian akan diekspos dalam versi baru skema.
Setelah fase mulai selesai, versi skema baru siap, memetakan semua tampilan ke tabel & kolom yang tepat. Aplikasi klien kemudian dapat mengakses versi skema baru, sedangkan yang lama masih tersedia. Ini adalah momen untuk mulai meluncurkan versi baru dari aplikasi klien.

Ketika tidak ada lagi aplikasi klien menggunakan versi skema lama, migrasi dapat diselesaikan. Ini akan menghapus skema lama, dan yang baru akan menjadi satu -satunya yang tersedia. Tabel & kolom yang diperlukan tidak lagi akan dihapus (tidak ada klien yang menggunakan ini pada titik ini), dan yang baru akan diubah namanya menjadi nama akhir mereka. Aplikasi klien masih berfungsi selama fase ini, karena tampilan masih memetakan ke tabel & kolom yang tepat.
Binari tersedia untuk Linux, MacOS & Windows, periksa rilis kami.
Untuk menginstal pgroll dari sumbernya, jalankan perintah berikut:
go install github.com/xataio/pgroll@latestCatatan: Membutuhkan GO 1.23 atau lebih baru.
Untuk menginstal pgroll dengan homebrew, jalankan perintah berikut:
# macOS or Linux
brew tap xataio/pgroll
brew install pgroll Ikuti langkah -langkah ini untuk melakukan migrasi skema pertama Anda menggunakan pgroll :
pgroll perlu menyimpan beberapa keadaan internal dalam database. Tabel dibuat untuk melacak versi skema saat ini dan menyimpan riwayat versi. Untuk menyiapkan database, jalankan perintah berikut:
pgroll init --postgres-url postgres://user:password@host:port/dbname Buat file migrasi. Anda dapat memeriksa folder contoh untuk beberapa contoh. Misalnya, gunakan file migrasi ini untuk membuat tabel customers baru:
{
"name" : " initial_migration " ,
"operations" : [
{
"create_table" : {
"name" : " customers " ,
"columns" : [
{
"name" : " id " ,
"type" : " integer " ,
"pk" : true
},
{
"name" : " name " ,
"type" : " varchar(255) " ,
"unique" : true
},
{
"name" : " bio " ,
"type" : " text " ,
"nullable" : true
}
]
}
}
]
}Kemudian jalankan perintah berikut untuk memulai migrasi:
pgroll --postgres-url postgres://user:password@host:port/dbname start initial_migration.jsonIni akan membuat versi skema baru dalam database, dan menerapkan operasi migrasi (Buat tabel). Setelah perintah ini selesai, baik versi lama skema (tanpa tabel pelanggan) dan yang baru (dengan tabel pelanggan) akan dapat diakses secara bersamaan.
Setelah memulai migrasi, aplikasi klien dapat mulai menggunakan versi skema baru. Untuk melakukannya, mereka perlu dikonfigurasi untuk mengaksesnya. Ini dapat dilakukan dengan mengatur search_path ke nama versi skema baru (disediakan oleh pgroll start output), misalnya:
SET search_path TO ' public_initial_migration ' ;Setelah tidak ada lagi aplikasi klien menggunakan versi skema lama, migrasi dapat diselesaikan. Ini akan menghapus skema lama. Untuk menyelesaikan migrasi, jalankan perintah berikut:
pgroll --postgres-url postgres://user:password@host:port/dbname completeDi titik mana pun selama migrasi, dapat digulung kembali ke versi sebelumnya. Ini akan menghapus skema baru dan meninggalkan yang lama seperti sebelum migrasi dimulai. Untuk mengembalikan migrasi, jalankan perintah berikut:
pgroll --postgres-url postgres://user:password@host:port/dbname rollbackUntuk penggunaan, tutorial, dan opsi terperinci lebih lanjut, lihat panduan dan referensi dalam dokumentasi.
Beberapa tolok ukur kinerja dijalankan pada setiap komit ke main untuk melacak kinerja dari waktu ke waktu. Setiap patokan dijalankan melawan Postgres 14.8, 15.3, 16.4, 17.0 dan "Terbaru". Setiap baris pada bagan mewakili jumlah baris yang dijalankan oleh tolok ukur, saat ini 10K, 100K dan 300K baris.
Backfill: Baris/s untuk mengulang kolom teks dengan placeholder nilai. Kami menggunakan strategi batching default kami 10k baris per batch tanpa backoff.WriteAmplification/NoTrigger: Baris awal/s Saat menulis data ke tabel tanpa pemicu pgroll .WriteAmplification/WithTrigger: Baris/s Saat menulis data ke tabel ketika pemicu pgroll telah diatur.ReadSchema: Memeriksa jumlah eksekusi per detik dari fungsi read_schema yang merupakan fungsi inti sering dieksekusi selama migrasi.Mereka bisa dilihat di sini.
Kami menyambut kontribusi dari komunitas! Jika Anda ingin berkontribusi pada pgroll , silakan ikuti panduan ini:
Untuk proyek ini, kami berjanji untuk bertindak dan berinteraksi dengan cara yang berkontribusi pada komunitas yang terbuka, ramah, beragam, inklusif, dan sehat.
Ini adalah daftar proyek dan artikel yang membantu sebagai inspirasi, atau serupa dengan pgroll :
Proyek ini dilisensikan di bawah Lisensi Apache 2.0 - lihat file lisensi untuk detailnya.
Jika Anda memiliki pertanyaan, menemukan masalah, atau memerlukan bantuan, buka masalah dalam repositori ini bergabunglah dengan perselisihan kami, dan komunitas kami akan dengan senang hati membantu.
Dibuat dengan ❤️ oleh Xata?