ダンプファイルからのMySQLリストアを高速化するにはどうすればよいですか?


28

mysqldumpファイルから30 GBのデータベースを新しいサーバーの空のデータベースに復元しています。ダンプファイルからSQLを実行すると、復元が非常に迅速に開始され、その後徐々に遅くなります。個々の挿入には15秒以上かかります。テーブルの大部分はMyISAMで、小さなInnoDBが1つあります。サーバーには他のアクティブな接続がありません。SHOW PROCESSLIST;復元からの挿入のみを表示します(およびshow processlist自体)。

劇的な減速を引き起こしている可能性のあるアイデアはありますか?

進行中の復元を高速化するために変更できるMySQL変数はありますか?


テーブルの種類を修正するために編集
デイブフォーガック

回答:


26

プロセスを遅くしている可能性のあるものの1つは、インデックスブロックに使用されるバッファのサイズであるkey_buffer_sizeです。これをRAMの少なくとも30%に調整します。そうしないと、インデックスの再作成プロセスが遅すぎる可能性があります。

あなたはInnoDBテーブルと外部キーを使用していた場合には参考のために、あなたも無効に外部キーをチェックし、(使用して最後にそれを再有効化できSET FOREIGN_KEY_CHECKS=0及びSET FOREIGN_KEY_CHECKS=1)。


1
私は2つのことを発見しました。key_buffer_sizeを8MBに設定し、外部キーとのミックスに1つのInnoDBテーブルがありました。key_buffer_sizeを1GBに増やし、外部キーチェックを一時的にオフにしました。復元は5分で完了しました。ありがとう!
デイブフォーガック

うわー!それが助けてくれてうれしかったです:)
マルコラモス

2
「5」分と入力したことがわかりました。私はそれが50分以上であったが、それでもかなり合理的だったと確信しています
;

5
key_buffer_sizeはMYISAM用です。
フェルナンドファブレティ

@FernandoFabreti-これは多くの読者にとって重要なポイントですが、OPはほとんどがMyISAMであると明記していました
mc0e

22

このリンクは、復元プロセスを高速化するためにできることを示しています。

http://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb-bulk-data-loading.html

ダンプファイルの先頭にコマンドを置くことができます

SET @OLD_AUTOCOMMIT=@@AUTOCOMMIT, AUTOCOMMIT = 0;
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS = 0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS = 0;

そして、これらのステートメントをダンプファイルの最後に配置します

SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
SET AUTOCOMMIT = @OLD_AUTOCOMMIT;
COMMIT;

これは私のために働いた。幸せな復元:-)


8
これはかなり役立ちました。むしろ編集ファイルよりも、私は上記のスニペットからpre.sqlとpost.sqlを作成し、DB復元することを使用:cat pre.sql dump.sql post.sql | mysql ...
ジェイソンR.クームス

1

復元が徐々に遅くなる理由を想像できる唯一の理由は、インデックス作成です。最後までインデックス作成をオフにしてから、一度に全体を実行できるようにします。


1

ダンプファイル(DBディレクトリ)の物理コピーがある場合、新しいサーバーのMySQLバージョンが同じであれば、それを新しいサーバーにコピーするだけで問題なく動作します。これはMyISAMでうまく機能し、私にとっては、論理SQLダンプファイルに基づいてデータを復元するよりも良いと思います。


0

複数のテーブルがある可能性がある場合、mk-parallel-restoreの恩恵を受ける可能性があります。


これは現在では非推奨であり、実際のバックアップを復元するためではなく、テストデータを復元するためにのみ使用する必要があります。
svandragt

0

これにより:

mysql --init-command = "SET SESSION FOREIGN_KEY_CHECKS = 0; SET UNIQUE_CHECKS = 0;" -u root -p <Backup_Database.mysql


-1

私はあなたに提案しました、

  1. テーブルを確認してください:トリガーがありますか?すべてのトリガーをクリア
  2. SET:、、AUTOCOMMIT=0そしてUNIQUE_CHECKS=0この変更をロールバックするのを忘れないでくださいFOREIGN_KEY_CHECKS=0
  3. コマンドラインのように使用する mysql -u root -pPasss requests < mydb.sql
  4. データベースファイルサイズを確認する

がんばろう

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