Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Mengubah Tabel InnoDB MySQL Besar

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:

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tidak dapat memuat plugin autentikasi 'caching_sha2_password'

  2. Cara mengisi tabel zona di database mysql di dalam ubuntu dengan xampp

  3. Cara Memperbaiki Database MySQL di cPanel

  4. Bagaimana menggabungkan GROUP BY, ORDER BY dan HAVING

  5. Kapan kami memilih DateTime daripada Timestamp