Mysqldumpを介してダンプするのに5分かかる私の小さな5GBデータベースは、復元するのに9時間かかります。幸いなことに、実際の緊急事態ではなく、テスト実行中にこれを発見しました。
これをスピードアップするために最適化するのに最適なパラメータは何ですか?
2GBのRAMを搭載したサーバーで次の設定を試しました。
innodb_buffer_pool_size=512M
innodb_additional_mem_pool_size=50M
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_flush_log_at_trx_commit=0
innodb_log_file_size=1G
innodb_log_buffer_size=1G
奇妙なことに、これらのaggresssize設定を使用しても、top
は、mysqldが割り当てられたメモリの一部をほとんど使用していないことを示しています。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4421 mysql 20 0 247m 76m 5992 S 91 3.7 4:09.33 mysqld
Mysqldumpの前に これらの数値を計算する ができるはずです。
質問で与えた設定については、
innodb_log_file_size=1G
この設定は大きすぎます!!!
innodb_log_file_size
は innodb_buffer_pool_size
の25%であると想定されています
innodb_log_file_size = 128M
これを/etc/my.cnf
で設定したら、次の手順を実行してInnoDBログファイルのサイズを変更する必要があります。
service mysql stop
rm -f /var/lib/mysql/ib_logfile[01]
service mysql start
その他の設定は
innodb_log_buffer_size=1G
特にmysqldumpのリロードや大量のトランザクションCOMMITの場合、InnoDBログファイルに送信する前に大量のデータをここにキャッシュする必要はありません。は1桁小さい必要があります。
innodb_log_buffer_size=32M
ところで、リロードする前にバイナリロギングを無効にする必要があります。それ以外の場合は、すべてのデータがバイナリログに記録されます。次のいずれかを実行してください。
SET SQL_LOG_BIN=0;
mysqldumpファイルの最初の行にします。SET SQL_LOG_BIN=0;
を実行してから、source < mysqldumpfile >
を実行します。/etc/my.cnf
からlog-binをコメントアウトし、MySQL 5.1を再起動し、mysqldumpファイルをロードし、log-binのコメントを解除して、MySQLを再起動します。Mysqldumpファイル/root/MyData.sql
がある場合でも、次のようなコマンドを実行できます。
SET SQL_LOG_BIN=0;
source /root/MyData.sql
これはオプション2に該当します。
ダンプの復元に時間がかかりすぎるという同様の状況に直面しました。私の場合、MySQLインデックスの作成を延期することで、復元を3〜10倍高速化することができました。
つまり、インデックスは挿入ごとに再計算されます。したがって、テーブル全体のインデックスを一度に計算することをお勧めします。
MySQLがデータをエクスポートする方法の例を次に示します。
CREATE TABLE `SOME_TABLE` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`SOME_COLUMN` varchar(255) NOT NULL,
`OTHER_COLUMN` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `UK_SOME_COLUMN` (`SOME_COLUMN`),
KEY `IDX_OTHER_COLUMN` (`OTHER_COLUMN`)
);
INSERT INTO `SOME_TABLE` (`id`, `SOME_COLUMN`, `OTHER_COLUMN`)
VALUES (...), (...), ... ;
インデックスのあるテーブルに数百万の行がある場合、挿入後にインデックスが適用されたかのように、はるかに長く復元されます。
挿入後にインデックス作成ステートメントを移動するだけで、インポート速度が向上します。
CREATE TABLE `SOME_TABLE` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`SOME_COLUMN` varchar(255) NOT NULL,
`OTHER_COLUMN` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `SOME_TABLE` (`id`, `SOME_COLUMN`, `OTHER_COLUMN`)
VALUES (...), (...), ... ;
ALTER TABLE `SOME_TABLE`
ADD UNIQUE KEY `UK_SOME_COLUMN` (`SOME_COLUMN`),
ADD KEY `IDX_OTHER_COLUMN` (`OTHER_COLUMN`);
上記の変換を行う単純なpythonスクリプトについては、 私のリポジトリ を確認してください。