Saya seorang pengembang PHP jadi jangan ketat. Saya punya meja besar ~ dump 5.5gb. PM kami memutuskan untuk membuat kolom baru di dalamnya untuk melakukan fitur baru. Tabel adalah InnoDB jadi apa yang saya coba:
Ubah tabel di layar dengan kunci meja. Butuh ~ 30 jam dan tidak ada. Jadi saya menghentikannya. Pertama saya melakukan kesalahan karena saya tidak mengakhiri semua transaksi tetapi yang kedua kalinya bukan multilock. Status tadinya
copy to tmp table
.Karena saya juga perlu menerapkan partisi untuk tabel ini, kami memutuskan untuk membuat dump, rename, dan membuat tabel dengan nama yang sama dan struktur baru. Tapi dump membuat salinan yang ketat (setidaknya saya tidak menemukan yang lain). Jadi saya menambahkan untuk membuang kolom baru dengan
sed
dan menanyakannya. Tetapi beberapa kesalahan aneh dimulai. Saya percaya itu disebabkan oleh charset. Tabel di utf-8 dan file menjadi as-ascii setelahnyased
. Jadi saya mendapat kesalahan (perintah tidak dikenal '\' ') pada 30% data. Jadi ini juga cara yang buruk.
Apa pilihan lain untuk mencapai ini dan mempercepat kinerja (saya bisa melakukannya dengan skrip php, tetapi akan memakan waktu lama). Apa yang akan menjadi kinerja INSERT SELECT
dalam hal ini.
Terima kasih atas kemajuannya.
SET NAMES utf8
danCOLLATION
. Tapi mengapa idh 30% dari data rusak setelahsed
. Saya pikir muatan curah akan menjadi yang tercepat, tetapi mungkin sesuatu yang lebih ada yang saya lewatkan. Terima kasih, MarkGagasan sed Anda adalah metode yang layak, tetapi tanpa kesalahan atau perintah yang Anda jalankan, kami tidak dapat membantu Anda.
Namun, metode yang terkenal untuk membuat perubahan online ke tabel besar adalah pt-online-schema-change . Pengabaian sederhana dari apa yang dilakukan alat ini disalin dari dokumentasi:
Metode ini mungkin juga perlu waktu untuk menyelesaikan, tetapi selama proses tabel asli akan sepenuhnya bisa digunakan.
sumber
'D\'agostini'
akan menyebabkan kesalahanunknown command '\''
. Namun tidak selalu, seperti pada 30% kasus. Itu aneh dan buggy. Sama datang bahkan dengan kesedihan hex-blob. Derek terima kasih.alter table add column, algorithm=inplace, lock=none
akan mengubah tabel MySQL 5.6 tanpa menyalin tabel dan tanpa dampak penguncian.Baru saja diuji kemarin, massa memasukkan baris 70K ke tabel partisi 7 baris 280K, baris 10K ke setiap partisi, dengan 5 detik tidur di antaranya untuk memungkinkan throughput lainnya.
Mulai sisipan massal, lalu di sesi terpisah mulai
alter
pernyataan online di atas di MySQL Workbench,alter
selesai sebelum sisipan, dua kolom baru ditambahkan, dan tidak ada baris yang dihasilkan dari perubahan yang berarti MySQL tidak menyalin baris apa pun.sumber
Saat ini, opsi terbaik untuk mengubah tabel besar mungkin adalah https://github.com/github/gh-ost
gh-ost adalah solusi migrasi skema online tanpa memicu untuk MySQL. Ini dapat diuji dan memberikan jeda, kontrol / konfigurasi ulang dinamis, audit, dan banyak fasilitas operasional.
gh-ost menghasilkan beban kerja ringan pada master sepanjang migrasi, dipisahkan dari beban kerja yang ada pada tabel yang dimigrasi.
Ini telah dirancang berdasarkan pengalaman bertahun-tahun dengan solusi yang ada, dan mengubah paradigma migrasi tabel.
sumber
Saya pikir Mydumper / Myloader adalah alat yang bagus untuk operasi seperti ini: Semakin baik setiap hari. Anda dapat menggunakan CPU Anda dan dapat memuat data secara paralel: http://www.percona.com/blog/2014/03/10/new-mydumper-0-6-1-release-offers-several-performance-and- kegunaan-fitur /
Saya telah berhasil memuat ratusan gigabytes tabel MySQL dalam hitungan jam.
Sekarang, ketika datang untuk menambahkan kolom baru, rumit karena MySQL menyalin seluruh tabel ke
TMP
area memori denganALTER TABLE...
Meskipun MySQL 5.6 mengatakan itu bisa melakukan perubahan skema online, saya belum berhasil melakukannya secara online untuk tabel besar tanpa kunci pertentangan belum.sumber
Saya baru saja mengalami masalah yang sama. Solusi kecil:
CREATE TABLE new_table SELECT * DARI oldtable;
HAPUS DARI new_table
ALTER TABLE new_table ADD COLUMN new_column int (11);
Sisipkan ke new_table pilih *, 0 dari old_table
drop table old_table; ganti nama tabel new_table menjadi old_table;
sumber