markdown```
はじめに (対象読者・この記事でわかること)
MySQL 8.0をインストールしたものの、my.cnfの数多くの項目が何をやっているのかさっぱり分からない、という方を対象にしています。
この記事では、最低限設定すべきパラメーターを絞り、それぞれの役割と推奨値を解説します。
また、変更した値が本当に効いているかを簡単に検証する手順も紕介するため、チューニングの第一歩として即実践できます。
筆者も本番導入時にデフォルト値のまま運用してメモリ不足でOOM Killerに殺された経験があるため、同じ轍を踏まないよう知見を共有します。
前提知識
- Linux(Ubuntu 22.04以降推奨)でMySQL 8.0がインストール済みであること
sudo systemctl restart mysqlでサービスを再起動できること- エディタ(nano/vim)でファイル編集ができること
MySQL 8.0のデフォルト設定がもたらす落とし穴
MySQL 8.0ではmy.cnfが存在しない場合、ほぼ全ての値がコンパイル時のデフォルトに fallback されます。
例えばinnodb_buffer_pool_sizeは、デフォルトで128 MiBのままです。
EC2のt3.small(2 GiB)でも128 MiBでは明らかに小さすぎますし、逆にR5.large(16 GiB)でも同じ値のままではメモリを有効活用できません。
このように「何も設定しなくても動く」が故に、本番稼働後に「遅い」「メモリを食い尽くす」といった問題が表面化します。
my.cnfを意識的に管理することで、こうした問題の8割は未然に防げます。
最低限見直すべき5パラメーターと検証手順
以下の5項目だけでも見直すことで、レスポンスタイムが半減・メモリ効率が向上する事例が多数報告されています。
なお、値は「物理メモリの50 %程度」を目安に設定し、徐々に増やす戦略が最も安全です。
ステップ1:my.cnfの場所とバックアップを取る
-
設定ファイルの場所を特定
bash $ sudo mysql --help | grep -A1 'Default options'典型的には/etc/mysql/mysql.conf.d/mysqld.cnfまたは/etc/my.cnfです。 -
バックアップを取っておく
bash $ sudo cp /etc/mysql/mysql.conf.d/mysqld.cnf{,.bak.$(date +%Y%m%d)} -
エディタで開き、以下の5行を[mysqld]セクションに追加・修正します。
innodb_buffer_pool_size = 1G # 物理メモリ50 %想定(8 GiBマシン例) innodb_log_file_size = 256M max_connections = 100 table_open_cache = 2000 query_cache_size = 0 # 8.0では機能削除済みだが明示的に0
ステップ2:設定の再読み込みと検証
-
サービスを再起動
bash $ sudo systemctl restart mysql -
値が反映されたかSQLで確認
sql mysql> SHOW VARIABLES WHERE Variable_name IN ( 'innodb_buffer_pool_size', 'innodb_log_file_size', 'max_connections', 'table_open_cache' ); +-------------------------+-----------+ | Variable_name | Value | +-------------------------+-----------+ | innodb_buffer_pool_size | 1073741824| # 1 GiB | innodb_log_file_size | 268435456 | # 256 MiB ... -
ベンチマークで効果を測定(オプション)
Sysbenchを使えば1分で効果が可視化できます。
bash $ sudo sysbench oltp_read_write --mysql-user=root \ --mysql-password=**** --tables=10 --table-size=100000 \ --threads=16 --time=60 run設定前後でTPS(transaction per second)が20〜40 %向上することが多いです。
ハマった点:「The server quit without updating PID file」
innodb_log_file_sizeを変更した直後にMySQLが起動しないケースがあります。
これは既存のib_logfile0とサイズが合わないためです。
解決策
-
一旦MySQLを止める
bash $ sudo systemctl stop mysql -
古いログファイルを退避
bash $ sudo mv /var/lib/mysql/ib_logfile{0,1} /tmp/ -
再度起動すると、指定サイズで新規に作られ正常に起動します。
bash $ sudo systemctl start mysql
まとめ
本記事では、MySQL 8.0でmy.cnfを放置するとどうなるか、そして最低限見直すべき5つのパラメーターとその検証手順を紹介しました。
innodb_buffer_pool_sizeは物理メモリの50 %程度から始めると安全innodb_log_file_size変更時は既存ログファイルを退避するSHOW VARIABLESで即座に反映を確認できる- Sysbenchで効果を1分で可視化できる
正確な値はアプリケーション要件やデータサイズに依存しますが、記事の手順を踏めば「デフォルトのまま」という最悪の状態は避けられます。
次回は、スロークエリログとEXPLAINを使ったインデックスチューニングについて掘り下げる予定です。
参考資料
- MySQL 8.0 Reference Manual / 5.1.8 Server System Variables https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html
- スリーロック 成田耕二『MySQL 8.0 パフォーマンス・チューニング』技術評論社、2022
- Oracle Docs / InnoDB Startup Options and System Variables https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/innodb-parameters.html
