web-dev-qa-db-ja.com

MySQLダンプから復元するためにMySQLを調整する方法は?

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
4
Alex R

Mysqldumpの前に これらの数値を計算する ができるはずです。

質問で与えた設定については、

innodb_log_file_size=1G

この設定は大きすぎます!!!

innodb_log_file_sizeinnodb_buffer_pool_size の25%であると想定されています

innodb_log_file_size = 128M

これを/etc/my.cnfで設定したら、次の手順を実行してInnoDBログファイルのサイズを変更する必要があります。

  1. service mysql stop
  2. rm -f /var/lib/mysql/ib_logfile[01]
  3. service mysql start

その他の設定は

innodb_log_buffer_size=1G

特にmysqldumpのリロードや大量のトランザクションCOMMITの場合、InnoDBログファイルに送信する前に大量のデータをここにキャッシュする必要はありません。は1桁小さい必要があります。

innodb_log_buffer_size=32M

ところで、リロードする前にバイナリロギングを無効にする必要があります。それ以外の場合は、すべてのデータがバイナリログに記録されます。次のいずれかを実行してください。

  1. これを-> SET SQL_LOG_BIN=0;mysqldumpファイルの最初の行にします。
  2. MySQLコマンドラインから、SET SQL_LOG_BIN=0;を実行してから、source < mysqldumpfile >を実行します。
  3. /etc/my.cnfからlog-binをコメントアウトし、MySQL 5.1を再起動し、mysqldumpファイルをロードし、log-binのコメントを解除して、MySQLを再起動します。

更新2011-07-2420:30

Mysqldumpファイル/root/MyData.sqlがある場合でも、次のようなコマンドを実行できます。

SET SQL_LOG_BIN=0;
source /root/MyData.sql

これはオプション2に該当します。

4
RolandoMySQLDBA

ダンプの復元に時間がかかりすぎるという同様の状況に直面しました。私の場合、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スクリプトについては、 私のリポジトリ を確認してください。

0
Denis Kokorin