Saya memiliki sekitar 40 juta baris dalam tabel MySQL dan saya ingin menyalin tabel ini ke tabel lain dalam database yang sama. Apa cara paling efisien untuk melakukan ini? Berapa lama waktu yang dibutuhkan (kurang-lebih)?
mysql
insert
bulk-insert
Devashish Dixit
sumber
sumber
Jawaban:
Misalkan Anda memiliki
mydb.mytb
dan ingin membuatmydb.mytbcopy
Saya memiliki lima (5) pendekatan untuk melakukan salinan ini
PENDEKATAN # 1
Di
mysql
klien, jalankan yang berikut iniPENDEKATAN # 2
PENDEKATAN # 3
PENDEKATAN # 4
PENDEKATAN # 5
ANALISIS
Jika Anda ingin menyalin
mydb.mytb
ke tabel yang sudah adamydb.mytbcopy
, dan kedua tabel memiliki struktur yang identik:PENDEKATAN # 6
Seperti #APPROACH 1 , #APPROACH 6 akan memiliki satu transaksi 40 juta baris
PENDEKATAN # 7
Pendekatan ini tidak menjatuhkan tabel. Ini hanya menghasilkan INSERT
EPILOG
Saya tidak bisa memberi Anda perkiraan waktu karena saya tidak tahu susunan DB Server, struktur tabel, tata letak indeks, dan hal-hal seperti ini.
COBALAH !!!
sumber
Tabel InnoDB, tidak seperti MyISAM *, tidak dapat "disalin begitu saja", sebagai bagian dari kamus datanya (dan berpotensi struktur lain yang bergantung pada tabel, seperti buffer gabungan) terletak di memori (jika server sedang berjalan) dan di tablespace umum / utama, alias file besar yang disebut
ibdata1
.Jika Anda menggunakan Percona Server> = 5.1 atau MySQL> = 5.6, ada dukungan untuk tablespace yang dapat diangkut, yang memungkinkan Anda untuk mengekspor dan mengimpor tabel secara langsung dari sistem file. Ini dia metode untuk MySQL dan untuk Percona . Dalam kedua kasus, Anda harus membuat tabel dengan
innodb_file_per_table
opsi dan melibatkan penggunaanDISCARD TABLESPACE/IMPORT TABLESPACE
dan / atau Percona Xtrabakup (jika Anda ingin ekspor dilakukan secara online). Harap dicatat bahwa Percona Server atau Xtrabakup tidak tersedia untuk Windows.Metode ini akan, secara umum, secepat menyalin file menggunakan perintah filesystem (cp, rsync).
Walaupun mungkin ada beberapa kasus bahwa ini bisa bekerja di MySQL <5.6 (dengan cara hacky) untuk mengembalikan, itu tidak akan berfungsi untuk salinan tabel. Dalam kasus tersebut, salah satu cara untuk melakukannya adalah dengan menggunakan SQL :
Ini akan secepat yang InnoDB dapat jalankan
Handler_read_rnd_next
danHandler_write
, sekali per baris. Jika Anda menggunakan metode ini, pastikan bahwa Anda menonaktifkan, setidaknya untuk sementara, opsi daya tahan dan Anda memiliki kumpulan buffer besar dan log transaksi. Dalam keadaan seperti itu, ini dapat mengurangi waktu impor, tetapi pasti tidak akan masuk ke memori sepenuhnya, jadi harap banyak waktu. Selain itu, Anda mencoba mengimpor 40 juta baris dalam satu transaksi, yang dapat menyebabkan masalah.Rekomendasi saya yang sebenarnya, dalam kasus kedua ini, adalah menggunakan sesuatu seperti pt-archiver , karena akan melakukan operasi yang mirip dengan yang saya sebutkan, tetapi akan dilakukan dalam "bongkahan", menghindari overhead transaksional (mungkin overhead tidak lebih cepat, tetapi dalam kasus kegagalan, itu tidak akan mencoba untuk mengembalikan seluruh tabel, mengambil selamanya). Untuk ukuran data yang Anda sebutkan, ini mungkin cara terbaik untuk melakukannya.
Opsi terakhir adalah mengekspor dan mengimpor menggunakan format CSV (atau TSV) , dengan kombinasi SELECT INTO OUTFILE / mysqldump dan LOAD DATA / mysqlimport. Ini adalah pilihan yang sangat umum jika Anda membutuhkan konkurensi dalam versi lama mysql, karena menggunakan sql membuat kunci lebih besar (tidak benar lagi jika dilakukan dengan benar). Karena mysqldump / import hanya berfungsi secara serial, saya akan merekomendasikan Anda untuk meneliti opsi untuk memparalelkannya, sangat berguna untuk tabel besar.
Bagaimanapun, cobalah untuk menghindari beberapa kalimat SQL, karena itu akan menjadi hambatan Anda yang paling penting jika Anda menjalankan banyak pertanyaan yang berbeda (yang harus dieksekusi, diuraikan dan dioptimalkan secara individual).
* Struktur MyISAM tidak dapat disalin dengan cara yang panas, tetapi sangat mudah untuk menyinkronkannya sementara ke disk dengan
FTWRL
.sumber
untuk Memindahkan data dari satu tabel ke tabel lainnya dalam skema
create table your_table_name select * from old_schema_table;
sumber