Saya memiliki tabel besar dengan kolom VARCHAR (20), dan saya perlu mengubahnya menjadi kolom VARCHAR (50). Biasanya, melakukan ALTER TABLE (menambahkan TINYINT) pada tabel khusus ini membutuhkan waktu sekitar 90-120 menit untuk diselesaikan, jadi saya benar-benar hanya dapat melakukannya pada Sabtu atau Minggu malam untuk menghindari memengaruhi pengguna database. Jika memungkinkan saya ingin melakukan modifikasi ini sebelum itu.
Kolom juga diindeks, yang saya anggap akan membuat ALTER TABLE lebih lambat, karena harus membangun kembali indeks setelah memodifikasi panjang kolom.
Aplikasi web diatur dalam lingkungan replikasi MySQL (26 budak dan satu master). Saya ingat sekali membaca di suatu tempat bahwa salah satu metode adalah pertama-tama melakukan ALTER TABLE pada setiap budak (meminimalkan dampak pada pengguna), kemudian lakukan ini pada Master, tetapi bukankah itu kemudian mencoba untuk mereplikasi perintah ALTER TABLE ke budak?
Jadi pertanyaan saya adalah: apa cara terbaik bagi saya untuk memodifikasi tabel ini dengan gangguan minimum bagi pengguna saya?
Sunting: tabelnya adalah InnoDB.
sumber
Jawaban:
Jika Anda sedikit suka berpetualang, Anda bisa membawa masalah ke tangan Anda dengan melakukan ALTER TABLE dalam tahapan yang bisa Anda lihat. Misalkan tabel yang ingin Anda ubah disebut WorkingTable. Anda bisa melakukan perubahan secara bertahap seperti ini:
Anda dapat melakukan ini pada semua budak. Bagaimana dengan tuannya ??? Bagaimana Anda mencegah ini dari replikasi ke budak. Sederhana: Jangan mengirim SQL ke log biner master. Cukup matikan biner logging di sesi sebelum melakukan hal-hal ALTER TABLE:
Tapi tunggu !!! Bagaimana dengan data baru yang masuk saat memproses perintah ini ??? Mengganti nama tabel di awal operasi harus melakukan trik. Biarkan sedikit perubahan kode ini untuk mencegah memasukkan data baru dalam hal itu:
Cobalah !!!
sumber
Dugaan saya dari dokumentasi adalah bahwa hanya menambah batasan panjang pada a
varchar
tidak akan menyebabkan masalah yang sama dengan menambahkan kolom:Tetapi hal itu sepertinya bertentangan dalam komentar di SO ini pertanyaan .
EDIT
Setidaknya pada 5.0, saya pikir saya dapat mengkonfirmasi bahwa menambah panjang memang membutuhkan tabel sementara (atau operasi lain yang sama-sama mahal):
testbed:
hasil:
sumber
Saya pikir, saya akan menyebutkan itu sejak
ENGINE=INNODB
Jika Anda memiliki batasan kunci asing, Anda tidak dapat mengubah dan mengganti nama tanpa batasan yang menunjuk ke tabel lama (sekarang diganti nama). Anda harus mengubah sesudahnya atau menghapus batasan selama durasi.
sumber