programer データの復旧時やslaveの追加時のセットアップ用にdumpファイルをリストアする際に
なるべく時間をかけずにやれる方法です!m9( ゚Д゚) ドーン!

リストアの性能を上げるために次の項目を一時的に無効化します。
・一般クエリログの無効化
・バイナリーログの無効化
・Double Writeの無効化
・コミット時のディスクフラッシュの無効化


vi /etc/my.cnf
#ダブルライトバッファの無効化
skip_innodb_doublewrite
#slaveでバイナリーログを出力している場合には設定をコメントアウトして無効化にする
#log_slave_updates
 
# /etc/init.d/mysqld restart
Stopping mysqld:                                           [  OK  ]
Starting mysqld:                                           [  OK  ]



■一般ログの無効化

mysql> SHOW GLOBAL VARIABLES LIKE '%general_log%';
+------------------+---------------------------+
| Variable_name    | Value                     |
+------------------+---------------------------+
| general_log      | ON                        |
| general_log_file | /data/mysql-log/mysql.log |
+------------------+---------------------------+
2 rows in set (0.02 sec)
 
mysql> SELECT @@general_log;
+---------------+
| @@general_log |
+---------------+
|             1 |
+---------------+
1 row in set (0.01 sec)
 
#general_logを0にする(再起動するとmy.cnfの値に戻る)
mysql> SET GLOBAL general_log = 0;
Query OK, 0 rows affected (0.06 sec)
 
mysql> SELECT @@general_log;
+---------------+
| @@general_log |
+---------------+
|             0 |
+---------------+
1 row in set (0.00 sec)


■バイナリーログの無効化

mysql> SHOW VARIABLES LIKE '%log_bin%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| log_bin                         | ON    |
| log_bin_trust_function_creators | OFF   |
| sql_log_bin                     | ON    |
+---------------------------------+-------+
3 rows in set (0.00 sec)
 
#sql_log_binを0にする(再起動するとmy.cnfの値に戻る)
mysql> SET sql_log_bin = 0;
Query OK, 0 rows affected (0.00 sec)
 
mysql> SHOW VARIABLES LIKE '%log_bin%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| log_bin                         | ON    |
| log_bin_trust_function_creators | OFF   |
| sql_log_bin                     | OFF   |
+---------------------------------+-------+
3 rows in set (0.00 sec)

■コミットと同時にログファイルの内容をディスクへフラッシュを無効化



mysql> SELECT @@innodb_flush_log_at_trx_commit;
+----------------------------------+
| @@innodb_flush_log_at_trx_commit |
+----------------------------------+
|                                1 |
+----------------------------------+
1 row in set (0.00 sec)
 
#innodb_flush_log_at_trx_commitを2にする(再起動するとmy.cnfの値に戻る)
mysql> SET GLOBAL innodb_flush_log_at_trx_commit = 2;
Query OK, 0 rows affected (0.00 sec)
 
mysql> SELECT @@innodb_flush_log_at_trx_commit;
+----------------------------------+
| @@innodb_flush_log_at_trx_commit |
+----------------------------------+
|                                2 |
+----------------------------------+
1 row in set (0.00 sec)


■ダンプファイルが大きい場合には次のようなエラーが出る場合があります。

$ mysql -u root -p --default-character-set=utf8 データベース名 < /home/admin/データベース名.2012-11-04_18-00-01.sql
Enter password:
ERROR 2006 (HY000) at line 7944: MySQL server has gone away


■その場合には、次の設定値を大きくしてから試してみてください。

#起動中のまま32MBに設定を変更する場合(再起動するとmy.cnfの値に戻る)
mysql> SET GLOBAL max_allowed_packe=32*1024*1024;
 
#my.cnfの設定で行う場合
#[mysqld]セクションのmax_allowed_packetのサイズを大きくする。
max_allowed_packet = 32M


リストアが終わったら各項目を元に戻すこと。
クラッシュ時にデータが破損してしまう可能性が高い設定になってしまっているため

他にも高速化の方法として、ログファイルサイズの調整、自動拡張の抑制、パーティショニング、
更新のサイズ、CSVストレージエンジンの活用などを行うと高速化することができるそうです。
下記参考URLから確認してみてください!(`・ω・´)ゞビシッ!!

この記事を書いた人

nakajima
nakajima
企画開発部のエンジニアです。プログラム、サーバーもどっちも楽しくて好きですが最近はサーバーの方がメインになってる気がします。