MySQL設定ファイルの活用と読み込み順序制御

MySQLの各実行ファイルは、起動時に対話型のコマンドライン引数を補完するために設定ファイル(オプションファイルとも呼称)を自動参照する仕組みを持っています。これにより、日常的に使用する接続情報や動作パラメータを定型化でき、メンテナンス効率が大きく向上します。特定のツールが設定ファイルを有効にするかどうかの確認は、ヘルプ表示フラグを組み合わせることで簡単に行えます。

ファイル参照の有効化確認と特殊ファイル

対象となるコマンドに--helpフラグを渡してドキュメントを表示させるのが標準的な検証手順です。mysqldについては--verbose --helpの組み合わせを使用してください。出力結果中に「reading option files」や該当パスの一覧が含まれていれば、設定ファイル読み込みが有効な状態です。

重要な制限事項
--no-defaultsフラグ付きで起動した場合、.mylogin.cnf以外のあらゆる設定ファイルの読み込みが拒否されます。また、persisted_globals_loadシステム変数が無効な状態でサーバーを初期化すると、JSON形式の永続変数ファイル(mysqld-auto.cnf)は処理されません。

テキストエディタで自由に編集可能な一般的な設定ファイルとは異なり、以下のファイル群は独自のフォーマットや管理ツールが必要です:

  • .mylogin.cnf:暗号化された認証情報の保存領域。mysql_config_editorコマンドによって生成・管理されます。対象となるのはhostuserpasswordportsocketの5つのキーのみです。クライアント側では--login-path経由でアクセスします。
  • MYSQL_TEST_LOGIN_FILE環境変数:ログインパス格納ファイルの代替パスを指定可能にします。テストランナーだけでなく、主要なクライアントバイナリでも解釈されます。
  • mysqld-auto.cnf:データディレクトリ直下に配置されるJSONファイル。SET PERSISTステートメントの実行結果が自動的にシリアライズされて保存されます。手動での編集や削除はサーバーの整合性を損なうため厳禁です。

OS別の探索順序と優先度ルール

設定ファイルの検索は固定されたパスリストに沿って実行されます。複数のソースで同一キーが定義されている場合、通常は後から発見された値が有効になりますが、一部の例外が存在します。

Windows環境

システムのルートディレクトリからユーザー空間へ向けて探索が行われます。

検索パス用途
%WINDIR%\my.ini, %WINDIR%\my.cnfシステム全体向け
C:\my.ini, C:\my.cnfシステム全体向け
**BASEDIR**\my.ini, **BASEDIR**\my.cnfインストール配下向け
任意のパス(--defaults-extra-file指定)優先的に読ませたいファイル
%APPDATA%\MySQL\.mylogin.cnfクライアント認証用
**DATADIR**\mysqld-auto.cnfサーバー永続変数用

環境変数の実態を確認するには、標準シェルのsetコマンドやPowerShellの$env構文を利用します。

rem 現在のWindowsディレクトリ表示
> echo %WINDIR%
C:\Windows

rem アプリケーションデータフォルダの確認
> echo %APPDATA%

Unix/Linux系環境

グローバル設定からホームディレクトリまで段階的に読み込まれます。セキュリティ強化のため、他のユーザーが書き換え可能なパーミッションのファイルは意図的にスルーされる仕様です。

検索パス用途
/etc/my.cnfグローバル基本設定
/etc/mysql/my.cnfグローバル追加設定
**SYSCONFDIR**/my.cnfビルド時指定ディレクトリ
$MYSQL_HOME/my.cnfサーバー専用拡張
任意のパス(--defaults-extra-file指定)外部参照優先設定
~/.my.cnfユーザー固有設定
~/.mylogin.cnfクライアント認証用
**DATADIR**/mysqld-auto.cnfサーバー永続変数用

なお、mysqldにおいて--userパラメータは唯一の例外です。最初に検出された定義が最終決定権を持ちます。これはコンソール上からの強制的なユーザースイッチングを防ぐための安全装置です。

構文体系と値のパース規則

カスタム作成する設定ファイルには、コマンドラインと同等のロングオプション命名規則が採用されています。ただしファイル内では先頭の--を省略でき、かつ1行あたり1つの定義しか記述できません。

  • コメント#または;で始まる行、あるいは行末に置かれた同名文字以降のテキストは無視されます。
  • セクション宣言[group_name]形式で適用対象をグループ化します。名称の大文字小文字は区別されません。
  • キー値ペアoption_nameまたはoption_name=valueです。等号周囲のスペース許容や、値内部のハッシュ文字を回避するための引用符囲みなどが可能です。

文字列内の改行やタブなどを明示する場合、\b(バックスペース)、\t(タブ)、\n(改行)、\r(復帰)、\\(バックスラッシュ自身)、\s(スペース)の6種類に対応しています。SQLリテラルとは仕様が分かれているため、バックスラッシュ後の英字がエスケープ対象外の文字の場合、そのまま文字列として残存します。これが特にWindowsのファイルパス表記に影響します。

例えば以下のように記載すると、すべて同じ絶対パスとして解釈されます:

basedir="C:\Program Files\MySQL\Server"
basedir="C:\\Program Files\\MySQL\\Server"
basedir=C:/Program Files/MySQL/Server
basedir="C:\\Program\sFiles\\MySQL\\Server"

セクションの階層化と適用例

同じキーが複数のセクションにまたがる場合、ファイル内で後方に出現する定義が先行定義を上書きします。これを逆手に取り、汎用設定を先に記述し、個別ツール向けの微調整を後に配置するのが推奨パターンです。

代表的な構成テンプレートは以下の通りです:

# 全クライアントで共有されるデフォルト値
[client]
port = 3307
socket = /var/run/mysql.sock
character-set-server = utf8mb4

# バックエンドエンジン設定
[mysqld]
port = 3307
socket = /var/run/mysql.sock
innodb_buffer_pool_size = 1G
max_connections = 200

# ダンプツール最適化
[mysqldump]
quick
single-transaction

ユーザーセッション向けの設定であれば、以下のように分割管理することもできます:

[client]
password = "SecurePass@123"

[mysql]
auto-rehash = OFF
connect_timeout = 5

メジャーバージョン依存のパラメータを分離したい場合は、[mysqld-8.0]のようにバージョン番号をセクション名に含めます。これにより特定リリース版のみが該当設定を適用します。

外部ファイルの動的読み込み

設定ファイル内に!includeディレクティブを記述することで、外部のリファレンスファイルを組み込むことができます。ディレクトリ内の全ファイルをまとめて反映させたい場合は!includedirを使用します。

# 単一ファイルの埋め込み
!include /etc/mysql/shared_params.cnf

# ディレクトリ配下のフィルタリング読み込み(Unix限定:.cnf拡張子)
!includedir /etc/mysql/conf.d/

注記
Unix系OSでは!includedirが読み取るファイル名の末尾に.cnf必須ですが、Windows環境では.iniとの両対応となります。また、インクルード先のファイルは、呼び出し元のファイルと同じようにセクション単位で記述する必要があります。実際に評価されるのは、親プロセスが現在パースしているセクションブロックに合致した部分だけです。他のセクションは完全にスローされます。

この機構はファイル内で何度呼び出しても均等に機能しますが、Windowsにおいてファイル末尾に!includeを配置する際は、必ず空行を追加してEOFを終了させてください。末尾の改行漏れが発生すると、そのディレクティブ自体が無視される現象を引き起こします。

タグ: MySQL option-files configuration-management mysqld mysql-client

5月20日 04:24 投稿