Impor MySQL Database Lambat dengan mysqldump dan GUNAKAN .. SUMBER

8

Saya memiliki sekitar 12 tabel di MySQL innoDB, salah satunya memiliki 11 juta catatan di dalamnya.

Saya menggunakan perintah ini untuk mendukung semuanya:

mysqldump -u [USERNAME] -p [DBNAME] | gzip > [/path_to_file/DBNAME].sql.gz

Dan perintah ini untuk mengimpor sesuatu di server baru:

USE [DBNAME];
SOURCE [/path_to_file/DBNAME].sql;

Inilah rasa sakit yang saya derita (waktu akan naik dengan setiap pertanyaan!):

masukkan deskripsi gambar di sini

Apa yang bisa saya lakukan untuk mempercepat? Apakah ada yang salah dengan perintah mysqldump saya?

Kirk Ouimet
sumber

Jawaban:

5

Untuk perintah dump Anda, Anda bisa menggunakan yang berikut ini

mysqldump --single-transaction --extended-insert -u [USERNAME] -p [DBNAME] | gzip > [/path_to_file/DBNAME].sql.gz

Sisipan yang diperluas lebih baik.

http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_single-transaction Opsi Transaksi Tunggal lebih baik untuk membuang tabel InnoDB.

Di file my.cnf Anda , buat perubahan berikut untuk sementara

http://dev.mysql.com/doc/refman/5.0/id/innodb-parameters.html#sysvar_innodb_doublewrite

innodb_doublewrite = 0

dan juga

http://dev.mysql.com/doc/refman/5.0/id/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit

innodb_flush_log_at_trx_commit = 2

Restart MySQL dan kemudian hapus opsi ini setelah impor Anda dan restart MySQL lagi.

Tabel Memori

Jika seluruh database Anda dapat masuk ke dalam memori, Anda dapat mengubah ENGINE = InnoDB menjadi ENGINE = MEMORY dalam file sql dump Anda untuk setiap tabel atau hanya tabel yang membutuhkan waktu paling lama untuk diimpor, impor file dump kembali ke database Anda dan kemudian ganti mesin kembali ke innodb.

ALTER TABLE name_of_table ENGINE = InnoDB;

perintah mysqlimport

http://linux.die.net/man/1/mysqlimport

Saya telah menggunakan mysqlimport untuk mengimpor data yang dicadangkan menggunakan opsi format tab di mysqldump. Ini telah terbukti lebih cepat daripada mengimpor melalui perintah mysql.

Buang database menggunakan mysqldump

mysqldump --tab = / some_directory / -u [USERNAME] -p [DBNAME] [TABLENAME]

Impor data ke dalam basis data Anda.

mysqlimport -u [USERNAME] -p [DBNAME] /some_directory/tablename.sql

Craig Efrein
sumber
5

Memuat InnoDB secara massal bisa sangat menakutkan jika InnoDB Anda tidak disetel dengan benar.

Berikut adalah pengaturan yang perlu Anda perhatikan:

Hingga setengah dari Buffer Pool dapat digunakan untuk sisipan massal. Ini mendorong keluar data yang di-cache. Saat memuat ulang mysqldump ke tabel InnoDB, Buffer Pool menjadi zona perang terbuka antara data InnoDB yang baru dimuat dan perubahan indeks sekunder. Dalam terang ini, meningkat innodb_buffer_pool_sizedan innodb_log_file_sizesangat penting dan penting.

Juga, pastikan ini sudah dimatikan. Sebuah mysqldump harus memiliki variabel-variabel ini diatur ke 0.

UNIQUE_CHECKS=0;
FOREIGN_KEY_CHECKS=0;

Anda dapat memeriksanya dengan sederhana head -20di file mysqldump.

Ada satu lagi aspek impor: innodb_change_buffering

Menurut Dokumentasi MySQL , Anda dapat menentukan apa yang mendapat buffered selama operasi DML. Untuk klarifikasi lengkap tentang ini, lihat Mengontrol Buffering Perubahan InnoDB .

Saya merekomendasikan pengaturan berikut:

[mysqld]
innodb_buffer_pool_size=2G
innodb_log_file_size=512M
innodb_read_io_threads=64
innodb_write_io_threads=64
innodb_io_capacity=5000
innodb_thread_concurrency=0
RolandoMySQLDBA
sumber