Too many connections error が出る時は、max connections を大きくする。
ただし、5_os
にしたがって「OS 側での connection, open file limit の設定の更新」をする必要がある(OS側で制限されてると、mysql 側ではその制限の範囲内でしか設定を変えれない)
# /etc/mysql/my.cnf
# /etc/mysql/mysql.conf.d/mysqld.cnf にあることが多い
[mysqld]
max_connections=10000 # <- connection の limit を更新
設定が反映されてるからは、mysql
client で繋げてから SHOW variables LIKE "%max_connection%";
で確認。
isucon@ip-172-31-17-45:~$ mysql -u isucon -p -e 'SHOW variables LIKE "%max_connections%";'
Enter password:
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 10000 |
+-----------------+-------+
尚、OS側でちゃんと open files limit が(例えば 65535 に)設定されてると、mysql 側でもそれが確認できる。
isucon@ip-172-31-17-45:~$ mysql -u isucon -p -e 'SHOW variables LIKE "%open_files_limit%";'
Enter password:
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| open_files_limit | 65535 |
+------------------+-------+
設定がうまくいってない時はmysql
の start 時のログにも出てるはずなので、見ると良い。
sudo journalctl -u mysql
long_query_timeを0にするとすべてのクエリを出力される
[mysqld]
slow_query_log
slow_query_log_file = /var/log/mysql-slow.sql
long_query_time = 5
http://www.slideshare.net/kazeburo/mysql-casual7isucon
innodb_buffer_pool_size = 1GB # ディスクイメージをメモリ上にバッファさせる値をきめる設定値
innodb_flush_log_at_trx_commit = 2 # 1に設定するとトランザクション単位でログを出力するが 2 を指定すると1秒間に1回ログファイルに出力するようになる
innodb_flush_method = O_DIRECT # データファイル、ログファイルの読み書き方式を指定する(実験する価値はある)
mysql2-cs-bind
gemを使うと扱いやすくなる
https://github.com/tagomoris/mysql2-cs-bind
ISUCONの勝ち方 YAPC::Asia Tokyo 2015より抜粋
# mysqlのコンソールにて
> set global slow_query_log = 1;
> set global long_query_time = 0;
> set global slow_query_log_file = "/tmp/slow.log";
# ベンチマーク実行
$ pt-query-digest /tmp/slow.log > /tmp/digest.txt
$ rm /tmp/slow.log
# 戻すときは
$ service mysqld restart
ダンプ作成
mysqldump -u user dbname | gzip > dbname.dump.gz
転送
scp [email protected]:~/isucon.dump.gz ~
ローカルにDB作成
$ mysql -uroot
mysql> create database isuconp;
リストア
gzcat isucon.dump.gz | mysql -u root isuconp