Saya secara berkala perlu membuat perubahan pada tabel di mysql 5.1, kebanyakan menambahkan kolom. Sangat sederhana dengan perintah alter table. Tapi meja saya memiliki hingga 40 juta baris sekarang dan mereka tumbuh cepat ... Jadi perintah-perintah perubahan tabel itu memakan waktu beberapa jam. Dalam beberapa bulan mereka akan membutuhkan berhari-hari.
Karena saya menggunakan amazon RDS, saya tidak bisa memiliki server pendukung untuk bermain dan kemudian mempromosikannya menjadi master. Jadi pertanyaan saya adalah apakah ada cara untuk melakukan ini dengan downtime minimal? Saya tidak keberatan operasi memakan waktu berjam-jam atau bahkan berhari-hari jika pengguna masih dapat menggunakan db tentu saja ... Bisakah mereka setidaknya membaca ketika kolom sedang ditambahkan? Apa yang terjadi jika aplikasi saya mencoba menulis? Sisipkan atau perbarui? Jika gagal segera itu sebenarnya tidak terlalu buruk, jika hanya hang dan menyebabkan masalah untuk server db itu masalah besar ..
Ini harus menjadi masalah penskalaan yang cukup umum, semua orang perlu menambahkan kolom .. Apa yang biasanya dilakukan pada db produksi? Budak -> migrasi master?
Perbarui - Saya lupa menyebutkan saya menggunakan mesin penyimpanan innodb
Jawaban:
Jangan. Tidak benar-benar. Hanya saja, jangan. Ini harus menjadi kesempatan yang sangat langka ketika ini pernah diperlukan.
Dengan asumsi data Anda benar-benar dinormalisasi untuk memulai, cara yang tepat untuk menyelesaikan masalah adalah dengan menambahkan tabel baru dengan hubungan 1: 1 ke tabel dasar (tidak wajib pada tabel baru).
Harus menambahkan kolom secara teratur biasanya merupakan indikator dari database yang tidak dinormalisasi - jika skema Anda tidak dinormalisasi maka itu masalah yang perlu Anda perbaiki.
Akhirnya, jika skema Anda benar-benar dinormalisasi dan Anda benar-benar harus terus menambahkan kolom, maka:
sumber
Saya hanya harus melakukan ini baru-baru ini. Apa yang direkomendasikan Amazon adalah menggunakan Perangkat Percona. Saya mengunduhnya dan dapat menjalankan sesuatu seperti:
dan itu bekerja dengan baik. Ini memberi tahu Anda berapa banyak waktu yang tersisa dalam proses.
Ini benar-benar membuat tabel baru dengan kolom baru dan kemudian menyalin data yang sudah ada. Lebih lanjut, ini menciptakan pemicu sehingga data baru juga didorong ke tabel baru. Itu kemudian mengubah nama tabel secara otomatis, menjatuhkan tabel lama dan Anda bangun dan berjalan dengan kolom baru dan tidak ada downtime saat Anda menunggu pembaruan.
sumber
symcbean memberikan beberapa rekomendasi yang solid .
Untuk menjawab pertanyaan Anda, cara termudah dan terbaik untuk mengurangi dampak adalah dengan memiliki beberapa basis data yang direplikasi. Master ganda dengan prosedur failover yang tepat menghentikan replikasi pada aktif, yang memungkinkan perubahan pada tidak aktif tanpa berdampak aktif.
Anda dapat berpotensi melakukan ini pada database langsung tunggal dan meminimalkan dampak dengan menggunakan prosedur yang mirip dengan yang saya jelaskan dalam jawaban ini . Diakui, ini mirip dengan apa yang dijelaskan symcbean tetapi mencakup rincian teknis. Anda bisa menggunakan bidang auto_increment juga dan bukan hanya cap waktu.
Pada akhirnya, jika kumpulan data Anda tumbuh sangat besar, Anda juga harus mempertimbangkan pengarsipan antara database OLTP dan OLAP . Kumpulan data transaksi Anda tidak perlu terlalu besar, jika Anda mendesain dengan tepat.
sumber
Dari manual: http://dev.mysql.com/doc/refman/5.1/en/alter-table.html
Jadi, membaca akan bekerja dengan baik. Menulis akan terhenti, tetapi dieksekusi setelah itu. Jika Anda ingin mencegah ini, Anda harus memodifikasi perangkat lunak Anda.
sumber
Saya dalam situasi yang sama di mana saya harus mengubah 1 dari tabel transaksi saya yang hampir 65GB. Saya mendengar 2 solusi
sumber