Bagaimana kebanyakan sistem basis data "populer" (MySQL, Postgres ...) menangani perubahan tabel pada basis data produksi langsung (seperti menambah, menghapus, atau mengubah jenis kolum)?
Saya tahu cara yang benar adalah untuk membuat cadangan semua jadwal downtime dan kemudian lakukan perubahan.
Tetapi ... apakah ada sistem basis data saat ini yang mendukung melakukan hal-hal ini "online" tanpa menghentikan apa pun? (mungkin hanya menunda kueri yang mereferensikan kolom yang baru saja diubah / dihapus)
Dan apa yang terjadi ketika saya hanya melakukan ALTER TABLE...
pada live database yang sedang berjalan? Apakah semuanya berhenti ketika ini terjadi? Bisakah data rusak? dll.
Sekali lagi, saya kebanyakan mengacu pada Postgres atau MySQL karena ini yang saya temui.
(Dan, ya, kapan saja saya harus melakukan ini sebelum saya melakukannya "dengan cara yang benar", membackup semuanya, menjadwalkan downtine dll ... tapi saya hanya ingin tahu apakah mungkin untuk melakukan hal-hal semacam ini dan hal-hal "cepat dan kotor "atau jika ada sistem DB yang benar-benar memiliki dukungan untuk perubahan skema" cepat, hidup dan kotor ")
Seseorang baru saja menyarankan Perubahan Skema Online untuk MySQL dari skrip Facebook (dengan tutorial di sini dan sumber di sini ) ... sepertinya cara yang bagus untuk mengotomatiskan serangkaian cara "hacky" untuk melakukannya ... adakah yang pernah menggunakannya dalam sesuatu yang menyerupai produksi?
sumber
pg_reorg
dapat membantu dengan skenario yang lebih sulit.Jawaban:
Ketika Anda mengeluarkan sebuah
ALTER TABLE
di PostgreSQL, ia akan mengambilACCESS EXCLUSIVE
kunci yang memblokir semuanya termasukSELECT
. Namun, kunci ini bisa sangat singkat jika tabel tidak memerlukan penulisan ulang, tidak ada yang baruUNIQUE
,CHECK
atauFOREIGN KEY
kendala membutuhkan pemindaian tabel penuh yang mahal untuk memverifikasi, dll.Jika ragu, umumnya Anda bisa mencobanya! Semua DDL di PostgreSQL bersifat transaksional, jadi cukup baik untuk membatalkan
ALTER TABLE
jika terlalu lama dan mulai menyimpan pertanyaan lain. Level kunci yang dibutuhkan oleh berbagai perintah didokumentasikan di halaman penguncian .Beberapa operasi yang biasanya lambat dapat dipercepat agar aman untuk dilakukan tanpa downtime. Misalnya, jika Anda memiliki meja
t
dan Anda ingin mengubah kolomcustomercode integer NOT NULL
untuktext
karena pelanggan telah memutuskan semua pelanggan kode sekarang harus dimulai denganX
, Anda bisa menulis:... tapi itu akan mengunci seluruh tabel untuk penulisan ulang. Begitu juga menambahkan kolom dengan a
DEFAULT
. Ini dapat dilakukan dalam beberapa langkah untuk menghindari kunci panjang, tetapi aplikasi harus mampu mengatasi duplikasi sementara:Hal ini hanya akan mencegah menulis untuk
t
selama proses tersebut; nama kunciEXCLUSIVE
agak menipu karena mengecualikan semuanya kecualiSELECT
; yangACCESS EXCLUSIVE
modus adalah satu-satunya yang tidak termasuk benar-benar everyting. Lihat mode kunci . Ada risiko bahwa operasi ini dapat mengalami kebuntuan-kembalikan karena peningkatan kunci yang diperlukan olehALTER TABLE
, tetapi paling buruk Anda hanya harus melakukannya lagi.Anda bahkan dapat menghindari kunci itu dan melakukan semuanya secara langsung dengan membuat fungsi pemicu pada
t
setiap kali adaINSERT
atauUPDATE
masuk, secara otomatiscustomercode_new
berasal daricustomercode
.Ada juga alat bawaan seperti
CREATE INDEX CONCURRENTLY
danALTER TABLE ... ADD table_constraint_using_index
yang dirancang untuk memungkinkan DBA mengurangi durasi penguncian eksklusif dengan melakukan pekerjaan lebih lambat dengan cara yang ramah konkurensi.The
pg_reorg
alat atau penggantinyapg_repack
dapat digunakan untuk beberapa meja operasi restrukturisasi juga.sumber
ALTER TABLE t ADD COLUMN i INT
adalah operasi cepat (biasanya <1ms) setelah kunci diperoleh. Namun, mendapatkan kunci dapat membuat antrian koneksi, jadi itu bukan "gratis" ... meskipun itu dunia lebih baik daripada apa yang harus Anda lakukan di MySQL. MenambahkanNOT NULL
kendala lebih sulit dan tidak untuk berpura-pura hati.pg_repack
merupakan penerus yang lebih baik daripg_reorg
.Percona telah hadir dengan alatnya sendiri untuk melakukan perubahan skema online
Alat ini disebut pt-online-schema-change
Ini melibatkan pemicu, jadi silakan baca dokumentasi dengan cermat.
Menurut Dokumentasi, operasi utama yang dilakukan adalah
sumber
Mematikan sistem dan melakukan semua perubahan sekaligus mungkin sangat berisiko. Jika terjadi kesalahan, dan sering kali terjadi, tidak ada jalan kembali yang mudah.
Sebagai pengembang Agile, kadang-kadang saya perlu memperbaiki tabel tanpa downtime sama sekali, karena tabel tersebut sedang dimodifikasi dan dibaca.
Pendekatan berikut memiliki risiko rendah, karena perubahan dilakukan dalam beberapa langkah berisiko rendah yang sangat mudah untuk dibatalkan:
Kami telah menggunakan pendekatan ini berkali-kali untuk mengubah tabel produksi langsung besar tanpa downtime, tanpa masalah sama sekali.
sumber
rollback
jika terjadi kesalahan.Ya, banyak database modern akan memungkinkan Anda untuk hanya menambahkan kolom atau mengubah karakteristik kolom, seperti menambah atau menghapus nullable.
Jika Anda menjatuhkan kolom, data akan hilang, tetapi tidak ada banyak ketakutan akan korupsi.
sumber
Alat Percona menggunakan pemicu untuk membantu mengubah, dan itu tidak berfungsi dengan baik jika meja Anda sudah memiliki pemicu yang ada. Saya akhirnya harus menulis yang benar-benar menangani pemicu yang ada dengan baik, karena mereka sangat penting untuk basis data kami https://github.com/StirlingMarketingGroup/smg-live-alter
sumber
Untuk menjawab pertanyaan tentang apa yang terjadi dengan
ALTER TABLE
pernyataan, itu tergantung pada sejauh mana perubahan Anda. Dalam kasus tertentu, jika Anda menambahkan kolom baru, setidaknya di MS SQL Server, mesin akan membuat salinan sementara dari tabel, sementara itu menciptakan definisi tabel baru, dan kemudian menyisipkan data kembali ke sana. Selama durasi perubahan, tabel tersebut karenanya tidak dapat diakses oleh pengguna.Contoh operasi spesifik untuk server MSSQL ada di sini: http://support.microsoft.com/kb/956176/en-us
Saya akan berasumsi bahwa RMDB lain memiliki metode yang serupa, meskipun implementasi yang tepat akan menjadi sesuatu yang harus Anda verifikasi dengan dokumentasi vendor.
sumber