mysqldumpとUSEを使用したMySQLデータベースのインポートが遅いSOURCE


8

MySQL innoDBには約12のテーブルがあり、そのうちの1つに1100万のレコードがあります。

私はこのコマンドを使用して物事をバックアップしました:

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

そして、次のコマンドで新しいサーバーにインポートします。

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

ここに私が苦しんでいる痛みがあります(時間は各クエリで上がっています!):

ここに画像の説明を入力してください

スピードアップするにはどうすればよいですか?mysqldumpコマンドに何か問題がありますか?

回答:


5

あなたのダンプコマンドのために、あなたは以下を使うことができます

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

拡張挿入の方が優れています。

http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_single-transaction シングルトランザクションオプションは、InnoDBテーブルのダンプに適しています。

あなたにmy.cnfのファイル、一時的に次のように変更します

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

innodb_doublewrite = 0

そしてまた

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

innodb_flush_log_at_trx_commit = 2

MySQLを再起動し、インポート後にこれらのオプションを削除して、MySQLを再起動します。

メモリテーブル

データベース全体がメモリに収まる可能性がある場合は、ダンプSQLファイルでENGINE = InnoDBをENGINE = MEMORYに変更して、すべてのテーブルまたはインポートに最も時間がかかっているテーブルのみをダンプデータベースにインポートします。そして、エンジンをinnodbに戻します。

ALTER TABLE name_of_table ENGINE = InnoDB;

mysqlimportコマンド

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

私はmysqlimportを使用して、mysqldumpのタブ形式オプションを使用してバックアップされたデータをインポートしました。mysqlコマンドによるインポートよりも高速であることが証明されています。

mysqldumpを使用してデータベースをダンプする

mysqldump --tab = / some_directory / -u [ユーザー名] -p [DB名] [テーブル名]

データをデータベースにインポートします。

mysqlimport -u [ユーザー名] -p [DBNAME] /some_directory/tablename.sql


5

InnoDBが適切に調整されていない場合、InnoDBのバルクロードは非常に困難な場合があります。

ここにあなたが関係する必要がある設定があります:

バッファプールの半分までを一括挿入に使用できます。これにより、キャッシュされたデータが押し出されます。mysqldumpをInnoDBテーブルにリロードする際、バッファプールは、新しくロードされたInnoDBデータとセカンダリインデックスの変更との間のオープンウォーゾーンになります。これを踏まえて、増加innodb_buffer_pool_sizeしてinnodb_log_file_size不可欠とが不可欠です。

また、これらがオフになっていることを確認してください。mysqldumpでは、これらの変数を0に設定する必要があります。

UNIQUE_CHECKS=0;
FOREIGN_KEY_CHECKS=0;

head -20mysqldumpファイルで簡単に確認できます。

インポートの側面がもう1つあります。innodb_change_buffering

MySQLのドキュメントによれば、DML操作中に何をバッファリングするかを指示できます。これに関する完全な説明については、InnoDB変更バッファリングの制御を参照してください。

次の設定をお勧めします。

[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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.