MySQL - 設定ファイル

提供: MochiuWiki : SUSE, EC, PCB

概要

MySQLの設定ファイルは、MySQLサーバの動作を制御する重要な設定を記述するファイルである。
Linuxでは my.cnf、Windowsでは my.ini という名前が一般的に使用される。

設定ファイルには、サーバの起動オプション、メモリ割り当て、接続数制限、ログ設定、文字コード、セキュリティ設定等を記述できる。
これらのパラメータは、データベースのパフォーマンス、安定性、セキュリティに大きな影響を与える。

MySQLは複数の場所から設定ファイルを読み込み、後から読み込まれた設定が優先される。
設定ファイルは [mysqld][client][mysql] 等のセクション (グループ) に分けて記述される。
各セクションは、特定のMySQLプログラムに対応する設定を含む。

設定は、設定ファイルへの記述による静的設定と、SET GLOBAL による動的設定の2つの方法がある。
MySQL 8.0以降では、SET PERSIST により動的設定を永続化することも可能である。

適切な設定により、システムのワークロード (OLTP、OLAP、混在型) に最適化されたパフォーマンスを実現できる。

設定の確認には、SHOW VARIABLES 文 や mysqld --verbose --help コマンドを使用する。


設定ファイルの場所

MySQLは、複数の場所から設定ファイルを順次読み込む。
後から読み込まれた設定ファイルの値が、先に読み込まれた値を上書きする。

Linuxでの設定ファイルの場所

Linuxでは、以下の順序で設定ファイルが読み込まれる。

Linux設定ファイル読み込み順序
順序 ファイルパス 説明
1 /etc/my.cnf システム全体の設定
2 /etc/mysql/my.cnf MySQL専用のシステム設定
3 SYSCONFDIR/my.cnf コンパイル時指定ディレクトリ
4 $MYSQL_HOME/my.cnf 環境変数で指定されたディレクトリ
5 defaults-extra-file --defaults-extra-fileで指定されたファイル
6 ~/.my.cnf ユーザ個別設定 (ホームディレクトリ)
7 ~/.mylogin.cnf 暗号化されたログイン情報


システム管理者は、通常 /etc/my.cnf または /etc/mysql/my.cnf にサーバ設定を記述する。
ユーザ個別設定は、~/.my.cnf に記述する。

環境変数 MYSQL_HOME を設定することにより、特定ディレクトリの設定ファイルを優先的に読み込むことができる。

Windowsでの設定ファイルの場所

Windowsでは、以下の順序で設定ファイルが読み込まれる。

Windows設定ファイル読み込み順序
順序 ファイルパス 説明
1 %PROGRAMDATA%\MySQL\MySQL Server X.Y\my.ini MySQL公式インストーラのデフォルト設定
2 %WINDIR%\my.ini Windowsディレクトリ (非推奨)
3 C:\my.ini Cドライブルート (非推奨)
4 BASEDIR\my.ini MySQLインストールディレクトリ
5 defaults-extra-file --defaults-extra-file で指定されたファイル


Windows環境では、%PROGRAMDATA%\MySQL\MySQL Server 8.0\my.ini が標準的な設定ファイルである。
MySQL公式インストーラは、インストール時にこのファイルを自動生成する。

%WINDIR% は、C:\WindowsBASEDIR は、C:\Program Files\MySQL\MySQL Server 8.0 である。

設定ファイルの読み込み順序の確認

現在のMySQL環境で実際に読み込まれる設定ファイルの順序を確認する方法を以下に示す。

mysqld --verbose --help | grep -A 1 "Default options"

# 出力例

Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf


実際に有効な設定値を確認するには、以下に示すコマンドを使用する。
このコマンドは、[mysqld] セクションで有効になっている全ての設定を表示する。

my_print_defaults mysqld


特定の設定ファイルのみを使用する場合は、--defaults-file オプションを使用する。

mysqld --defaults-file=/etc/mysql/my-custom.cnf


デフォルトの設定ファイルを無視する場合は、--no-defaults オプションを使用する。

mysqld --no-defaults


追加の設定ファイルを読み込む場合は、--defaults-extra-file オプションを使用する。

mysqld --defaults-extra-file=/etc/mysql/my-extra.cnf



設定ファイルの構造

MySQLの設定ファイルは、セクション (グループ) 単位で構成される。
各セクションは、[セクション名] で開始され、次のセクションまたはファイル末尾まで続く。

セクション (グループ)

下表に、MySQLの設定ファイルで使用される主要なセクションを示す。

設定ファイルのセクション
セクション名 適用対象 用途
[mysqld] mysqldサーバプロセス サーバの動作設定 (メモリ、接続数、ログ等)
[mysql] mysqlクライアント クライアントの動作設定 (プロンプト、文字コード等)
[client] 全てのMySQLクライアント 全クライアント共通設定 (接続先、パスワード等)
[mysqldump] mysqldumpコマンド バックアップ時の設定 (オプション等)
[mysqld_safe] mysqld_safe起動スクリプト MySQLサーバの安全起動設定
[mysqladmin] mysqladminコマンド 管理コマンドの設定
[mysqlbinlog] mysqlbinlogコマンド バイナリログ解析の設定
[mysqlimport] mysqlimportコマンド データインポートの設定


最も重要なセクションは、[mysqld] である。
このセクションには、MySQLサーバプロセスの動作を制御する全ての設定 を記述する。

[client] セクションは、全てのMySQLクライアントプログラム (mysql、mysqldump、mysqladmin等) に適用 される。

[mysql] セクションは、mysqlコマンドラインクライアントのみに適用 される。

設定の記述方法

設定ファイル内の各設定項目は、以下の形式で記述する。

基本的な記述形式を以下に示す。

  • キー=値
    パラメータに値を設定
  • キー
    ブール値パラメータを有効化 (ON と同じ)
  • # コメント または ; コメント
    コメント行


設定例を以下に示す。

 [mysqld]
 # サーバID設定
 server-id=1
 
 # ポート番号
 port=3306
 
 # バイナリログ有効化
 log-bin=mysql-bin
 
 # スロークエリログ有効化
 slow-query-log
 
 # スロークエリ閾値 (秒)
 long_query_time=2.0


変数名のハイフン (-) と アンダースコア (_) は互換性がある。
log-binlog_bin は同じ意味である。

不明なオプションを無視する場合は、loose- プレフィックスを使用する。

 [mysqld]
 # MySQL 8.0未満では無視される
 loose-innodb_redo_log_capacity=1G


他の設定ファイルをインクルードする場合は、!include または !includedir ディレクティブを使用する。

 [mysqld]
 !include /etc/mysql/conf.d/mysql-custom.cnf
 !includedir /etc/mysql/conf.d/


!includedir は、指定ディレクトリ内の.cnfファイル (Windowsでは、.ini および .cnf) を全て読み込む。

設定ファイルの優先順位

同じパラメータが複数の設定ファイルに記述されている場合、後から読み込まれた値が優先される。

例として、以下に示す2つの設定ファイルがある場合を考える。

 # /etc/my.cnfファイル
 
 [mysqld]
 max_connections=100


 # ~/.my.cnfファイル
 
 [mysqld]
 max_connections=500


この場合、~/.my.cnf が後から読み込まれるため、最終的な max_connections は500になる。

なお、コマンドライン引数は、設定ファイルより優先される。

mysqld --max-connections=1000


この場合、設定ファイルの値に関わらず、max_connections は1000になる。


主要パラメータ

接続関連

MySQLサーバへの接続に関連するパラメータを以下に示す。

接続関連パラメータ
パラメータ デフォルト 説明
port 3306 MySQLサーバのリスニングポート
bind-address * (全てのIP) サーバがバインドするIPアドレス
socket /var/lib/mysql/mysql.sock UnixソケットファイルのPATH
max_connections 151 最大同時接続数
max_connect_errors 100 接続エラー許容回数 (ホストブロック閾値)
wait_timeout 28800 (8時間) 非インタラクティブ接続のタイムアウト (秒)
interactive_timeout 28800 (8時間) インタラクティブ接続のタイムアウト (秒)
connect_timeout 10 接続確立時のタイムアウト (秒)
max_allowed_packet 64MB (8.0) 最大パケットサイズ
skip-name-resolve OFF DNS逆引きを無効化 (高速化)


接続関連の推奨設定例を以下に示す。

 [mysqld]
 # 接続設定
 port=3306
 bind-address=0.0.0.0
 max_connections=500
 max_connect_errors=1000000
 
 # タイムアウト設定
 wait_timeout=600
 interactive_timeout=600
 connect_timeout=10
 
 # パケットサイズ
 max_allowed_packet=256M
 
 # DNS逆引き無効化 (パフォーマンス向上)
 skip-name-resolve


ネットワーク・接続の主要なパラメータ
パラメータ 説明
bind-address 特定のIPアドレスからのみ接続を受け付ける場合に設定する。
0.0.0.0 は、全てのIPアドレスからの接続を許可する。
127.0.0.1 は、ローカルホストからのみ接続を許可する。
max_connections システムのメモリ量とワークロードに応じて設定する。
一般的なWebアプリケーションでは、100〜500 が適切である。
skip-name-resolve 有効にすると、DNS逆引きが無効化され、接続時のオーバーヘッドが削減される。
ただし、ホスト名ベースの権限管理 (GRANT 文でホスト名を使用) は使用できなくなることに注意する。


InnoDB関連

InnoDBストレージエンジンの動作を制御するパラメータを以下に示す。

InnoDB関連パラメータ
パラメータ デフォルト 説明
innodb_buffer_pool_size 128MB InnoDBバッファプールサイズ
innodb_buffer_pool_instances 8 (pool>1GBの場合) バッファプールのインスタンス数
innodb_log_file_size 48MB (8.0.30未満) REDOログファイルサイズ
innodb_redo_log_capacity 100MB (8.0.30以降) REDOログ容量
innodb_log_buffer_size 16MB ログバッファサイズ
innodb_flush_log_at_trx_commit 1 ログフラッシュ動作 (0/1/2)
innodb_flush_method fsync フラッシュ方式 (O_DIRECT推奨)
innodb_file_per_table ON テーブルごとに個別ファイル使用
innodb_io_capacity 200 I/O容量 (IOPS)
innodb_io_capacity_max 2 * innodb_io_capacity 最大I/O容量
innodb_read_io_threads 4 読み取りI/Oスレッド数
innodb_write_io_threads 4 書き込みI/Oスレッド数
innodb_thread_concurrency 0 (無制限) InnoDBスレッド同時実行数
innodb_autoinc_lock_mode 2 AUTO_INCREMENTロックモード


InnoDB関連の推奨設定例を以下に示す。

 [mysqld]
 # InnoDBバッファプール (物理メモリの70-80%を推奨)
 innodb_buffer_pool_size=8G
 innodb_buffer_pool_instances=8
 
 # REDOログ設定 (MySQL 8.0.30以降)
 innodb_redo_log_capacity=2G
 
 # REDOログ設定 (MySQL 8.0.30未満)
 # innodb_log_file_size=512M
 
 # ログバッファ
 innodb_log_buffer_size=64M
 
 # フラッシュ設定
 innodb_flush_log_at_trx_commit=1
 innodb_flush_method=O_DIRECT
 
 # I/O設定 (SSD環境)
 innodb_io_capacity=2000
 innodb_io_capacity_max=4000
 innodb_read_io_threads=8
 innodb_write_io_threads=8
 
 # その他
 innodb_file_per_table=ON
 innodb_autoinc_lock_mode=2


InnoDBの主要なパラメータ
パラメータ 説明
innodb_buffer_pool_size 最も重要なInnoDBパラメータである。
専用データベースサーバでは、物理メモリの70〜80[%]を割り当てることを推奨する。
例: 16[GB] メモリのサーバでは、12G〜13G が適切である。
innodb_buffer_pool_instances バッファプールを複数のインスタンスに分割する。
バッファプールサイズが1GB以上の場合、デフォルトで8インスタンスに分割される。
高負荷環境では、インスタンス数を増やすことで競合を軽減できる。
innodb_flush_log_at_trx_commit ログのディスク書き込み方式を指定する。
0 : ログを1秒ごとにディスクに書き込む (高速だがクラッシュ時にデータ損失の可能性)
1 : トランザクションごとにログをディスクに書き込む (最も安全、デフォルト)
2 : トランザクションごとにOSバッファに書き込み、1秒ごとにディスクに書き込む (折衷案)
innodb_flush_method ファイルI/Oの方式を指定する。
Linux環境では、O_DIRECT を推奨する。
O_DIRECT は、OSのページキャッシュをバイパスし、二重バッファリングを回避する。
innodb_io_capacity ストレージのIOPS性能に応じて設定する。
HDD環境では 200、SATA SSDでは 2000〜5000、NVMe SSDでは 10000 以上が適切である。


MySQL 8.0.30以降では、innodb_log_file_sizeinnodb_log_files_in_group が廃止され、innodb_redo_log_capacity に統合された。

クエリキャッシュ関連 (MySQL 5.7以前)

クエリキャッシュは、MySQL 8.0で完全に削除された機能である。
MySQL 5.7以前のバージョンでは、以下のパラメータを使用できる。

  • query_cache_type
    クエリキャッシュの有効化
    0: 無効、1: 有効、2: DEMAND
  • query_cache_size
    クエリキャッシュのサイズ (バイト)
  • query_cache_limit
    キャッシュ可能な最大クエリサイズ


MySQL 5.7以前の設定例を以下に示す。

 [mysqld]
 # MySQL 5.7以前のみ有効
 query_cache_type=1
 query_cache_size=256M
 query_cache_limit=2M


ただし、クエリキャッシュはスケーラビリティの問題により、高負荷環境ではパフォーマンスを低下させる。
MySQL 5.7以前でも、クエリキャッシュを無効化することを推奨する。

MySQL 8.0以降では、クエリキャッシュ機能は完全に削除されている。

ログ関連

下表に、MySQLの各種ログ機能を制御するパラメータを示す。

ログ関連パラメータ
パラメータ デフォルト 説明
log-error 標準エラー出力 エラーログのファイルPATH
general_log OFF 一般クエリログの有効化
general_log_file hostname.log 一般クエリログのファイルPATH
slow_query_log OFF スロークエリログの有効化
slow_query_log_file hostname-slow.log スロークエリログのファイルPATH
long_query_time 10.0 スロークエリ閾値 (秒)
log_queries_not_using_indexes OFF インデックス未使用クエリをログに記録
log-bin OFF バイナリログの有効化
binlog_format ROW バイナリログ形式 (ROW/STATEMENT/MIXED)
binlog_expire_logs_seconds 2592000 (30日) バイナリログの保持期間 (秒)
max_binlog_size 1GB バイナリログファイルの最大サイズ
sync_binlog 1 バイナリログの同期頻度


ログ関連の推奨設定例を以下に示す。

 [mysqld]
 # エラーログ
 log-error=/var/log/mysql/error.log
 
 # スロークエリログ
 slow_query_log=ON
 slow_query_log_file=/var/log/mysql/slow-query.log
 long_query_time=2.0
 log_queries_not_using_indexes=ON
 
 # バイナリログ (レプリケーション・PITR用)
 log-bin=/var/log/mysql/mysql-bin
 binlog_format=ROW
 binlog_expire_logs_seconds=604800
 max_binlog_size=500M
 sync_binlog=1
 
 # 一般クエリログ (デバッグ時のみ有効化、本番環境では無効推奨)
 # general_log=ON
 # general_log_file=/var/log/mysql/general.log


MySQLの主要なログ設定
設定項目 説明
log-error MySQLサーバの起動エラー、警告、重要なメッセージを記録する。
必ず有効化し、定期的に確認すること。
slow_query_log 実行時間が long_query_time を超えるクエリを記録する。
パフォーマンスチューニングの際に必須のログである。
log_queries_not_using_indexes 有効にすると、インデックスを使用しないクエリもスロークエリログに記録される。
インデックス不足によるパフォーマンス問題を早期に発見できる。
log-bin バイナリログを有効にする。
レプリケーション、ポイントインタイムリカバリ (PITR) に必須である。
binlog_format バイナリログの形式を指定する。
ROW : 行ベース (デフォルト、最も安全)
STATEMENT : SQL文ベース (ログサイズ小、非決定的関数で問題)
MIXED : 自動選択 (状況に応じてROW/STATEMENT切り替え)
sync_binlog バイナリログの同期頻度を指定する。
1 はトランザクションごとに同期 (最も安全)、0 はOSに任せる。(高速だが安全性低)
general_log 全てのクエリを記録するため、大量のディスクI/Oが発生する。
デバッグ時のみ有効化し、本番環境では無効にすることを強く推奨する。


文字コード関連

下表に、MySQLの文字コードと照合順序を制御するパラメータを示す。

文字コード・照合順序の主要なパラメータ
パラメータ 説明
character-set-server サーバのデフォルト文字コード
(デフォルト: utf8mb4 in 8.0)
collation-server サーバのデフォルト照合順序
(デフォルト: utf8mb4_0900_ai_ci in 8.0)
character-set-client クライアント接続の文字コード
character-set-connection 接続時の文字コード
character-set-results 結果セットの文字コード
init_connect 接続時に実行されるSQL文


文字コード関連の推奨設定例を以下に示す。

 [mysqld]
 # サーバ文字コード (UTF-8 4バイト対応)
 character-set-server=utf8mb4
 collation-server=utf8mb4_general_ci
 
 # クライアント接続時の文字コード設定
 init_connect='SET NAMES utf8mb4'
 
 [client]
 # クライアント側のデフォルト文字コード
 default-character-set=utf8mb4


utf8mb4 は、4バイトUTF-8文字 (絵文字等) をサポートする文字コードである。
MySQL 8.0以降では、utf8mb4 がデフォルトである。

utf8 (エイリアス: utf8mb3) は、最大3バイトまでのUTF-8文字のみをサポートする。
絵文字や一部の漢字が格納できないため、utf8mb4 の使用を推奨する。

照合順序は、文字列の比較・ソート方法を定義する。
主要な照合順序を以下に示す。

主要な照合順序
照合順序 説明
utf8mb4_general_ci 高速、大文字小文字を区別しない
utf8mb4_unicode_ci より正確な言語ルール、やや低速
utf8mb4_0900_ai_ci MySQL 8.0デフォルト、高速かつ正確
utf8mb4_bin バイナリ比較、大文字小文字を区別


文字コード設定の詳細については、MySQL - 文字コードと照合順序のページを参照すること。

セキュリティ関連

MySQLのセキュリティを強化するパラメータを以下に示す。

セキュリティ関連パラメータ
パラメータ デフォルト 説明
skip-networking OFF TCP/IP接続を無効化 (Unixソケットのみ)
local_infile OFF (8.0以降) LOAD DATA LOCAL INFILEの許可
secure_file_priv platform dependent ファイル入出力の許可ディレクトリ
sql_mode STRICT系有効 SQLモード (厳格性)
validate_password.policy MEDIUM (8.0) パスワードポリシー
default_password_lifetime 0 (無期限) パスワード有効期限 (日)
ssl_ca NULL SSL認証局証明書
ssl_cert NULL SSLサーバ証明書
ssl_key NULL SSLサーバ秘密鍵
require_secure_transport OFF SSL/Unixソケット接続を強制


セキュリティ関連の推奨設定例を以下に示す。

 [mysqld]
 # ファイル操作の制限
 local_infile=OFF
 secure_file_priv=/var/lib/mysql-files/
 
 # 厳格なSQLモード
 sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
 
 # パスワードポリシー
 validate_password.policy=MEDIUM
 validate_password.length=8
 validate_password.mixed_case_count=1
 validate_password.number_count=1
 validate_password.special_char_count=1
 
 # SSL/TLS設定
 ssl_ca=/etc/mysql/ssl/ca-cert.pem
 ssl_cert=/etc/mysql/ssl/server-cert.pem
 ssl_key=/etc/mysql/ssl/server-key.pem
 require_secure_transport=ON


セキュリティ関連の主要なパラメータ
パラメータ 説明
local_infile クライアント側のファイルをサーバに読み込む機能である。
セキュリティリスクがあるため、MySQL 8.0以降ではデフォルトで無効化されている。
secure_file_priv LOAD DATA INFILESELECT ... INTO OUTFILE が使用できるディレクトリを制限する。
空文字列を設定すると制限なし、NULL を設定すると完全無効化される。
sql_mode SQLの厳格性を制御する。
STRICT_TRANS_TABLES を含めることにより、不正なデータの挿入を防ぐことができる。
require_secure_transport 有効にすると、SSL/TLSまたはUNIXソケット経由の接続のみを許可する。
パブリックネットワーク経由の接続を受け付ける場合は、SSL/TLS設定と併用することを推奨する。


メモリ関連

MySQLのメモリ使用量を制御するパラメータを以下に示す。

メモリ関連パラメータ
パラメータ デフォルト スコープ 説明
innodb_buffer_pool_size 128MB グローバル InnoDBバッファプールサイズ (最重要)
max_connections 151 グローバル 最大接続数
table_open_cache 4000 グローバル オープンテーブルキャッシュ数
table_definition_cache 2000 グローバル テーブル定義キャッシュ数
thread_cache_size 自動 (8+max_connections/100) グローバル スレッドキャッシュサイズ
sort_buffer_size 256KB セッション ソート用バッファ
join_buffer_size 256KB セッション JOIN用バッファ
read_buffer_size 128KB セッション シーケンシャルスキャン用バッファ
read_rnd_buffer_size 256KB セッション ランダムスキャン用バッファ
tmp_table_size 16MB セッション 内部一時テーブルの最大サイズ
max_heap_table_size 16MB セッション MEMORYテーブルの最大サイズ


メモリパラメータは、グローバルスコープとセッションスコープに分類される。
グローバルスコープのパラメータは、サーバ全体で共有される。
セッションスコープのパラメータは、接続ごとに割り当てられる。

総メモリ使用量の概算式を以下に示す。

総メモリ使用量 ≈ innodb_buffer_pool_size
               + key_buffer_size
               + max_connections * (
                    sort_buffer_size
                  + read_buffer_size
                  + read_rnd_buffer_size
                  + join_buffer_size
                  + thread_stack
                 )
               + その他グローバルバッファ


例として、以下に示す設定の場合のメモリ使用量を計算する。

  • innodb_buffer_pool_size=8G
  • max_connections=500
  • sort_buffer_size=2M
  • read_buffer_size=2M
  • read_rnd_buffer_size=2M
  • join_buffer_size=2M
  • thread_stack=256K


計算式を以下に示す。

総メモリ = 8GB + 500 * (2MB + 2MB + 2MB + 2MB + 0.25MB)
        = 8GB + 500 * 8.25MB
        = 8GB + 4.125GB
        ≈ 12.1GB


セッションバッファは、実際には必要な時にのみ割り当てられるため、最大値を大きくしすぎないよう注意する。


パフォーマンスチューニング

MySQLのパフォーマンスは、設定ファイルのパラメータ調整により大きく改善できる。

チューニングの基本方針

パフォーマンスチューニングの基本方針を以下に示す。

  • 測定なしにチューニングしない
    SHOW STATUSSHOW VARIABLESMySQL - EXPLAIN で現状を把握する
  • 1つずつ変更して効果を測定
    複数のパラメータを同時に変更すると、効果の測定が困難になる
  • ワークロードに応じた設定
    OLTP、OLAP、混在型でチューニング方針は異なる
  • ハードウェアリソースを考慮
    メモリ、CPU、ストレージ性能に応じた設定が必要
  • スロークエリログを活用
    パフォーマンス問題の大半はクエリに起因する


パフォーマンスモニタリングのクエリ例を以下に示す。

 -- 接続状態の確認
 SHOW STATUS LIKE 'Threads%';
 SHOW STATUS LIKE 'Max_used_connections';
 
 -- バッファプール使用状況
 SHOW STATUS LIKE 'Innodb_buffer_pool%';
 
 -- テーブルキャッシュ効率
 SHOW STATUS LIKE 'Open%';
 
 -- スレッドキャッシュ効率
 SHOW STATUS LIKE 'Threads_created';
 SHOW STATUS LIKE 'Connections';
 
 -- 一時テーブル使用状況
 SHOW STATUS LIKE 'Created_tmp%';


OLTP向け推奨設定

OLTP (Online Transaction Processing) ワークロード向けの推奨設定を以下に示す。
OLTPでは、多数の小規模トランザクションを高速に処理することが求められる。

 [mysqld]
 # メモリ設定 (16GBメモリサーバを想定)
 innodb_buffer_pool_size=12G
 innodb_buffer_pool_instances=12
 innodb_log_buffer_size=64M
 
 # 接続設定
 max_connections=500
 thread_cache_size=100
 table_open_cache=4000
 table_definition_cache=2000
 
 # InnoDB設定
 innodb_flush_log_at_trx_commit=1
 innodb_flush_method=O_DIRECT
 innodb_file_per_table=ON
 innodb_autoinc_lock_mode=2
 
 # I/O設定 (SSD)
 innodb_io_capacity=2000
 innodb_io_capacity_max=4000
 innodb_read_io_threads=8
 innodb_write_io_threads=8
 
 # ログ設定 (MySQL 8.0.30以降)
 innodb_redo_log_capacity=2G
 
 # バイナリログ
 log-bin=mysql-bin
 binlog_format=ROW
 sync_binlog=1
 
 # スロークエリログ
 slow_query_log=ON
 long_query_time=1.0
 log_queries_not_using_indexes=ON


OLTP環境では、innodb_flush_log_at_trx_commit=1 を維持してデータ整合性を確保する。
ただし、パフォーマンスが重要でデータ損失許容可能な場合は、2 に設定することで高速化できる。

innodb_autoinc_lock_mode=2 は、AUTO_INCREMENT値の高速割り当てを有効にする。
レプリケーション環境でSTATEMENTベースのバイナリログを使用する場合は、1 に設定する必要がある。

大規模データ処理向け推奨設定

大規模データ処理 (バッチ処理、データウェアハウス) 向けの推奨設定を以下に示す。

 [mysqld]
 # メモリ設定 (32GBメモリサーバを想定)
 innodb_buffer_pool_size=24G
 innodb_buffer_pool_instances=16
 innodb_log_buffer_size=128M
 
 # セッションバッファ (大規模ソート・JOIN用)
 sort_buffer_size=4M
 join_buffer_size=4M
 read_buffer_size=2M
 read_rnd_buffer_size=4M
 
 # 一時テーブル
 tmp_table_size=256M
 max_heap_table_size=256M
 
 # InnoDB設定
 innodb_flush_log_at_trx_commit=2
 innodb_flush_method=O_DIRECT
 
 # I/O設定 (高速SSD)
 innodb_io_capacity=5000
 innodb_io_capacity_max=10000
 innodb_read_io_threads=16
 innodb_write_io_threads=16
 
 # ログ設定 (MySQL 8.0.30以降)
 innodb_redo_log_capacity=4G
 
 # バルクインサート最適化
 innodb_autoinc_lock_mode=2
 bulk_insert_buffer_size=64M
 
 # バイナリログ (不要な場合は無効化)
 # log-bin=mysql-bin
 # binlog_format=ROW


大規模データ処理では、innodb_flush_log_at_trx_commit=2 に設定して書き込み性能を向上させる。
処理完了後にデータの整合性を確認することで、データ損失リスクを軽減できる。

セッションバッファ (sort_buffer_sizejoin_buffer_size 等) を増やすことにより、大規模ソート・JOIN処理が高速化される。
ただし、これらは接続ごとに割り当てられるため、設定値を大きくしすぎるとメモリ不足になる可能性がある。

バルクインサート時は、innodb_autoinc_lock_mode=2bulk_insert_buffer_size を増やすことで高速化できる。

レプリケーションが不要な場合は、バイナリログを無効化することでI/Oオーバーヘッドを削減できる。


設定の確認・変更方法

MySQLの設定は、起動時の設定ファイル読み込みによる静的設定実行時の動的設定 の2種類がある。

SHOW VARIABLESでの確認

現在有効な設定値を確認するには、SHOW VARIABLES 文を使用する。

 -- 全ての設定変数を表示
 SHOW VARIABLES;
 
 -- 特定のパターンにマッチする変数を表示
 SHOW VARIABLES LIKE 'innodb_buffer%';
 
 -- 文字コード関連の変数を表示
 SHOW VARIABLES LIKE 'character%';
 
 -- タイムアウト関連の変数を表示
 SHOW VARIABLES LIKE '%timeout%';
 
 -- 特定の変数を表示
 SHOW VARIABLES WHERE Variable_name = 'max_connections';


グローバル変数のみを表示する場合は、SHOW GLOBAL VARIABLES を使用する。
セッション変数のみを表示する場合は、SHOW SESSION VARIABLES を使用する。

 -- グローバル変数を表示
 SHOW GLOBAL VARIABLES LIKE 'max_connections';
 
 -- セッション変数を表示
 SHOW SESSION VARIABLES LIKE 'sql_mode';


performance_schemaを使用して、変数情報を取得することもできる。

 SELECT * FROM performance_schema.global_variables
 WHERE VARIABLE_NAME LIKE 'innodb_buffer%';


SET GLOBALでの動的変更

MySQLの多くの設定は、サーバの再起動なしで動的に変更できる。
SET GLOBAL 文を使用して、グローバル変数を変更する。

 -- 最大接続数を変更
 SET GLOBAL max_connections = 1000;
 
 -- スロークエリログを有効化
 SET GLOBAL slow_query_log = ON;
 
 -- スロークエリ閾値を変更
 SET GLOBAL long_query_time = 1.0;
 
 -- InnoDBバッファプールサイズを変更 (動的変更可能)
 SET GLOBAL innodb_buffer_pool_size = 16 * 1024 * 1024 * 1024;


セッション変数を変更する場合は、SET SESSION または単に SET を使用する。

 -- 現在のセッションのSQLモードを変更
 SET SESSION sql_mode = 'STRICT_TRANS_TABLES';
 
 -- 現在のセッションのソートバッファを変更
 SET sort_buffer_size = 4 * 1024 * 1024;


ただし、SET GLOBAL で変更した値は、MySQLサーバを再起動すると元に戻る。
永続化するには、設定ファイルに記述するか、SET PERSIST を使用する。

また、一部の変数は動的変更できない。
例として、innodb_log_file_size (MySQL 8.0.30未満) は、サーバの再起動が必要である。

動的変更可能かどうかは、SHOW VARIABLES の出力または公式ドキュメントで確認できる。

SET PERSISTでの永続化 (MySQL 8.0)

MySQL 8.0以降では、SET PERSIST 文により設定変更を永続化できる。

 -- 設定を変更し、mysqld-auto.cnfに永続化
 SET PERSIST max_connections = 1000;
 
 -- 次回起動時のみ有効 (現在のセッションには影響しない)
 SET PERSIST_ONLY innodb_buffer_pool_size = 16 * 1024 * 1024 * 1024;


SET PERSIST で設定した値は、データディレクトリの mysqld-auto.cnfファイル に記録される。
このファイルは、設定ファイルより優先して読み込まれる。

SET PERSISTSET PERSIST_ONLY の違いを以下に示す。

SET PERSIST と SET PERSIST_ONLYの違い
構文 説明
SET PERSIST 即座に設定を適用し、mysqld-auto.cnfファイル に永続化
SET PERSIST_ONLY mysqld-auto.cnfファイル に永続化するが、現在のセッションには適用しない (次回起動時に有効)


永続化された設定を削除するには、RESET PERSIST を使用する。

 -- 特定の設定を削除
 RESET PERSIST max_connections;
 
 -- 全ての永続化設定を削除
 RESET PERSIST;


永続化された設定一覧を確認するには、performance_schema.persisted_variables テーブルを参照する。

 SELECT * FROM performance_schema.persisted_variables;


現在の設定ファイルの確認

MySQLサーバが実際に使用している設定ファイルを確認する方法を以下に示す。

 # 設定ファイルの読み込み順序を確認
 mysqld --verbose --help | grep -A 1 "Default options"
 
 # 実際に有効な設定を表示
 my_print_defaults mysqld
 
 # 特定の設定ファイルを指定して起動
 mysqld --defaults-file=/etc/mysql/my-custom.cnf
 
 # 設定ファイルを無視して起動
 mysqld --no-defaults


MySQLサーバが起動済みの場合、エラーログに読み込まれた設定ファイルが記録される。

 # エラーログを確認
 tail -100 /var/log/mysql/error.log



推奨設定例

開発環境向け設定

開発環境 (小規模、デバッグ重視) 向けの設定例を以下に示す。

 [mysqld]
 # 基本設定
 user=mysql
 pid-file=/var/run/mysqld/mysqld.pid
 socket=/var/lib/mysql/mysql.sock
 port=3306
 datadir=/var/lib/mysql
 
 # 文字コード
 character-set-server=utf8mb4
 collation-server=utf8mb4_general_ci
 
 # エラーログ
 log-error=/var/log/mysql/error.log
 
 # スロークエリログ (全クエリを記録)
 slow_query_log=ON
 slow_query_log_file=/var/log/mysql/slow-query.log
 long_query_time=0.5
 log_queries_not_using_indexes=ON
 
 # 一般クエリログ (開発環境のみ)
 general_log=ON
 general_log_file=/var/log/mysql/general.log
 
 # 接続設定
 max_connections=100
 skip-name-resolve
 
 # メモリ設定 (4[GB]メモリを想定)
 innodb_buffer_pool_size=2G
 innodb_log_buffer_size=16M
 
 # InnoDB設定
 innodb_flush_log_at_trx_commit=2
 innodb_flush_method=O_DIRECT
 innodb_file_per_table=ON
 
 # セキュリティ (開発環境では緩い設定)
 local_infile=OFF
 
 # SQLモード (厳格モード)
 sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
 
 [client]
 port=3306
 socket=/var/lib/mysql/mysql.sock
 default-character-set=utf8mb4


開発環境では、スロークエリログ一般クエリログ を有効にして、クエリのデバッグを容易にする。
long_query_time=0.5 により、0.5秒以上かかるクエリを全て記録する。

innodb_flush_log_at_trx_commit=2 により、書き込み性能を向上させている。
開発環境ではデータ損失リスクは許容できるため、この設定は問題ない。

本番環境向け設定

本番環境 (大規模、高可用性、セキュリティ重視) 向けの設定例を以下に示す。

 [mysqld]
 # 基本設定
 user=mysql
 pid-file=/var/run/mysqld/mysqld.pid
 socket=/var/lib/mysql/mysql.sock
 port=3306
 datadir=/var/lib/mysql
 
 # サーバID (レプリケーション環境では必須)
 server-id=1
 
 # 文字コード
 character-set-server=utf8mb4
 collation-server=utf8mb4_0900_ai_ci
 
 # エラーログ
 log-error=/var/log/mysql/error.log
 
 # スロークエリログ
 slow_query_log=ON
 slow_query_log_file=/var/log/mysql/slow-query.log
 long_query_time=2.0
 log_queries_not_using_indexes=ON
 
 # バイナリログ (レプリケーション・PITR用)
 log-bin=/var/log/mysql/mysql-bin
 binlog_format=ROW
 binlog_expire_logs_seconds=604800
 max_binlog_size=500M
 sync_binlog=1
 
 # 接続設定
 port=3306
 bind-address=0.0.0.0
 max_connections=500
 max_connect_errors=1000000
 wait_timeout=600
 interactive_timeout=600
 connect_timeout=10
 max_allowed_packet=256M
 skip-name-resolve
 
 # メモリ設定 (32GBメモリを想定)
 innodb_buffer_pool_size=24G
 innodb_buffer_pool_instances=16
 innodb_log_buffer_size=64M
 table_open_cache=4000
 table_definition_cache=2000
 thread_cache_size=100
 
 # InnoDB設定
 innodb_flush_log_at_trx_commit=1
 innodb_flush_method=O_DIRECT
 innodb_file_per_table=ON
 innodb_autoinc_lock_mode=2
 
 # REDOログ設定 (MySQL 8.0.30以降)
 innodb_redo_log_capacity=2G
 
 # I/O設定 (SSD環境)
 innodb_io_capacity=2000
 innodb_io_capacity_max=4000
 innodb_read_io_threads=8
 innodb_write_io_threads=8
 
 # セキュリティ設定
 local_infile=OFF
 secure_file_priv=/var/lib/mysql-files/
 sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
 
 # パスワードポリシー
 validate_password.policy=STRONG
 validate_password.length=10
 validate_password.mixed_case_count=1
 validate_password.number_count=1
 validate_password.special_char_count=1
 
 # SSL/TLS設定 (証明書PATH)
 # ssl_ca=/etc/mysql/ssl/ca-cert.pem
 # ssl_cert=/etc/mysql/ssl/server-cert.pem
 # ssl_key=/etc/mysql/ssl/server-key.pem
 # require_secure_transport=ON
 
 # パフォーマンススキーマ
 performance_schema=ON
 
 [client]
 port=3306
 socket=/var/lib/mysql/mysql.sock
 default-character-set=utf8mb4
 
 [mysql]
 # プロンプトカスタマイズ
 prompt="\\u@\\h [\\d]> "
 
 [mysqldump]
 quick
 max_allowed_packet=256M


本番環境では、データ整合性を最優先するため、innodb_flush_log_at_trx_commit=1sync_binlog=1 を設定する。

バイナリログは、レプリケーションとポイントインタイムリカバリ (PITR) のために必須である。
binlog_expire_logs_seconds=604800 により、7日間分のバイナリログを保持する。

skip-name-resolve により、DNS逆引きを無効化してパフォーマンスを向上させている。

セキュリティ設定として、local_infile=OFFsecure_file_priv、強力なパスワードポリシーを設定している。

SSL/TLS設定は、パブリックネットワーク経由の接続を受け付ける場合に有効化する。