Edit 2016: kami baru saja (Agustus 2016) merilis gh-ost
, memodifikasi jawaban saya untuk mencerminkannya.
Saat ini ada beberapa alat yang memungkinkan Anda melakukan perubahan tabel online untuk MySQL. Ini adalah:
- edit 2016: gh-ost :Alat migrasi skema tanpa pemicu GitHub (penafian:Saya penulis alat ini)
- oak-online- tabel ubah , sebagai bagian dari openark-kit (penafian:Saya adalah pembuat alat ini)
- pt-online-schema- ubah , sebagai bagian dari Percona Toolkit
- Facebook perubahan skema online untuk MySQL
Mari kita pertimbangkan `ALTER TABLE` "normal":
Tabel besar akan memakan waktu lama untuk ALTER
. innodb_buffer_pool_size
adalah penting, dan begitu juga variabel lainnya, tetapi pada tabel yang sangat besar semuanya dapat diabaikan. Hanya butuh waktu.
Apa yang dilakukan MySQL untuk ALTER
tabel adalah membuat tabel baru dengan format baru, salin semua baris, lalu alihkan. Selama waktu ini meja terkunci sepenuhnya.
Pertimbangkan saran Anda sendiri:
Ini kemungkinan besar akan melakukan yang terburuk dari semua opsi. Mengapa demikian? Karena Anda menggunakan tabel InnoDB, INSERT INTO tablename_tmp SELECT * FROM tablename
melakukan transaksi. sebuah besar transaksi. Ini akan membuat lebih banyak beban daripada ALTER TABLE
normal .
Selain itu, Anda harus mematikan aplikasi Anda pada saat itu agar tidak menulis (INSERT
, DELETE
, UPDATE
) ke meja Anda. Jika ya - seluruh transaksi Anda tidak ada gunanya.
Apa yang disediakan alat online
Alat tidak semua bekerja sama. Namun, dasar-dasarnya dibagi:
- Mereka membuat tabel "bayangan" dengan skema yang diubah
- Mereka membuat dan menggunakan pemicu untuk menyebarkan perubahan dari tabel asli ke tabel hantu
- Mereka perlahan salin semua baris dari tabel Anda ke tabel bayangan. Mereka melakukannya dalam potongan:katakanlah, 1.000 baris sekaligus.
- Mereka melakukan semua hal di atas saat Anda masih dapat mengakses dan memanipulasi tabel asli.
- Setelah puas, mereka menukar keduanya, menggunakan
RENAME
.
openark-kit alat telah digunakan selama 3,5 tahun sekarang. Alat Percona berumur beberapa bulan, tetapi mungkin lebih teruji daripada yang pertama. Alat Facebook dikatakan bekerja dengan baik untuk Facebook, tetapi tidak memberikan solusi umum untuk rata-rata pengguna. Saya sendiri belum pernah menggunakannya.
Edit 2016: gh-ost
adalah solusi tanpa pemicu, yang secara signifikan mengurangi beban tulis master pada master, memisahkan beban tulis migrasi dari beban normal. Itu dapat diaudit, dapat dikontrol, dapat diuji. Kami telah mengembangkannya secara internal di GitHub dan merilisnya sebagai open source; kami melakukan semua migrasi produksi kami melalui gh-ost
hari ini. Lihat lebih banyak di sini
.
Setiap alat memiliki batasannya sendiri, perhatikan dokumentasi dengan cermat.
Cara konservatif
Cara konservatif adalah dengan menggunakan replikasi Master-Master Aktif-Pasif, lakukan ALTER
pada server standby (pasif), lalu berganti peran dan lakukan ALTER
lagi yang dulunya server aktif, sekarang berubah pasif. Ini juga merupakan opsi yang bagus, tetapi membutuhkan server tambahan, dan pengetahuan replikasi yang lebih dalam.