8.

MySQL/MariaDB 初期設定 (my.cnf) 完全ガイド

編集
この記事の要点
  • MySQL/MariaDB の設定ファイルは Linux /etc/mysql/my.cnf / Windows my.ini
  • 主要セクション: [mysqld] (サーバ本体)、[client] (クライアント共通)、[mysql] (mysql CLI)
  • 必須項目: character-set-server=utf8mb4innodb_buffer_pool_size = RAM の 60-80%max_connections
  • 初期セキュリティ: mysql_secure_installation で匿名ユーザー削除・root パスワード設定
  • 稼働中の動的変更: SET GLOBAL var = value + my.cnf も書き換えで恒久化

設定ファイルの場所

OS / Distro設定ファイルパス
Linux (Debian/Ubuntu)/etc/mysql/my.cnf/etc/mysql/mysql.conf.d/mysqld.cnf
Linux (RHEL/CentOS)/etc/my.cnf + /etc/my.cnf.d/*.cnf
macOS (Homebrew)/opt/homebrew/etc/my.cnf (Apple Silicon)
WindowsC:\ProgramData\MySQL\MySQL Server X.X\my.ini
Docker (公式イメージ)/etc/mysql/conf.d/*.cnf をボリュームマウント

読み込み順を確認:

mysql --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 --verbose --help | grep -A 1 "Default options"

基本構成 (my.cnf)

# /etc/mysql/my.cnf

# サーバ本体
[mysqld]
# === ネットワーク ===
bind-address       = 0.0.0.0       # 外部接続許可 (本番は LAN 内に絞る)
port               = 3306
socket             = /var/run/mysqld/mysqld.sock
skip-name-resolve                  # DNS 逆引き無効 (高速化)

# === 文字コード (必ず utf8mb4) ===
character-set-server  = utf8mb4
collation-server      = utf8mb4_unicode_ci
init-connect          = 'SET NAMES utf8mb4'

# === InnoDB ===
default-storage-engine = InnoDB
innodb_buffer_pool_size      = 4G      # ★ RAM の 60-80%
innodb_log_file_size         = 512M
innodb_flush_log_at_trx_commit = 1     # 1=ACID 厳密 / 2=高速化 / 0=最速 (危険)
innodb_file_per_table        = 1
innodb_flush_method          = O_DIRECT

# === 接続 ===
max_connections        = 200
max_connect_errors     = 100000
wait_timeout           = 28800         # 8 時間
interactive_timeout    = 28800

# === クエリログ ===
slow_query_log         = 1
slow_query_log_file    = /var/log/mysql/slow.log
long_query_time        = 1             # 1 秒以上を記録
log_queries_not_using_indexes = 0      # 本番では基本 0

# === エラーログ ===
log_error              = /var/log/mysql/error.log

# === バイナリログ (レプリ/PITR 用) ===
server-id              = 1
log_bin                = /var/log/mysql/mysql-bin
binlog_format          = ROW
expire_logs_days       = 7
sync_binlog            = 1

# クライアント共通
[client]
default-character-set = utf8mb4
port                  = 3306
socket                = /var/run/mysqld/mysqld.sock

# mysql CLI
[mysql]
default-character-set = utf8mb4
prompt                = '\u@\h [\d]> '

# mysqldump
[mysqldump]
default-character-set = utf8mb4
quick
single-transaction

必須の初期設定: mysql_secure_installation

sudo mysql_secure_installation

# 対話で:
# 1) VALIDATE PASSWORD COMPONENT の有効化 (任意)
# 2) root のパスワード設定
# 3) 匿名ユーザー削除
# 4) リモート root ログイン禁止
# 5) test データベース削除
# 6) 権限再読込

主要パラメータの意味

パラメータ意味推奨
innodb_buffer_pool_sizeInnoDB のメモリキャッシュ (最重要)RAM の 60-80%
innodb_log_file_sizeRedo Log サイズ256M-2G
innodb_flush_log_at_trx_commitfsync 戦略1 (ACID) / 2 (やや高速)
max_connections同時接続数上限アプリ Pool x ノード数 + 余裕
wait_timeoutアイドル接続切断時間 (秒)120-28800
max_allowed_packet1 クエリの最大サイズ64M (デフォルト) / 大量 INSERT で増やす
character-set-serverサーバデフォルト文字コード必ず utf8mb4 (絵文字対応)
slow_query_logスロークエリログ本番 ON / long_query_time=1
server-idレプリケーション用 IDレプリ環境では各ノード一意

character-set: utf8 と utf8mb4 の違い

MySQL の utf8最大 3 バイトしか格納できない壊れた UTF-8 です。絵文字 (4 バイト) を保存できません。必ず utf8mb4 を使ってください:

-- 現状確認
SHOW VARIABLES LIKE 'character%';
SHOW VARIABLES LIKE 'collation%';

-- 既存テーブルの文字コード変換
ALTER DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- ❌ NG (絵文字消失)
character-set-server = utf8
-- ⇔ utf8mb3 のエイリアス (廃止予定)

-- ✅ OK
character-set-server = utf8mb4

innodb_buffer_pool_size のチューニング

-- 現在のバッファプールサイズ
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';

-- ヒット率 (99%+ が理想)
SHOW STATUS LIKE 'Innodb_buffer_pool_reads';      -- ディスクから読んだ
SHOW STATUS LIKE 'Innodb_buffer_pool_read_requests'; -- キャッシュから読んだ
-- ヒット率 = 1 - reads / read_requests

-- 動的変更 (MySQL 5.7+)
SET GLOBAL innodb_buffer_pool_size = 8 * 1024 * 1024 * 1024;  -- 8G

-- 推奨値:
-- 専用 DB サーバ: RAM の 60-80%
-- 共用サーバ: RAM の 50%
-- 32GB RAM 専用: 24G
-- 8GB RAM 専用:  6G

稼働中の動的変更

-- セッションのみ
SET wait_timeout = 600;

-- 全体に即時反映 (再起動で失われる)
SET GLOBAL wait_timeout = 600;
SET GLOBAL max_connections = 500;
SET GLOBAL slow_query_log = ON;

-- 永続化 (MySQL 8.0+: SET PERSIST)
SET PERSIST max_connections = 500;
-- → /var/lib/mysql/mysqld-auto.cnf に保存される

-- 確認
SHOW VARIABLES LIKE 'max_connections';
SELECT @@global.max_connections;

-- どの GLOBAL 変数が動的に変更可能か
SELECT VARIABLE_NAME, VARIABLE_VALUE
FROM performance_schema.global_variables
WHERE VARIABLE_NAME = 'max_connections';

パスワード変更とユーザー作成

-- root パスワード変更 (MySQL 8)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_strong_password';

-- 新規ユーザー作成
CREATE USER 'appuser'@'%' IDENTIFIED BY 'app_pass';
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'appuser'@'%';
FLUSH PRIVILEGES;

-- 確認
SELECT User, Host FROM mysql.user;
SHOW GRANTS FOR 'appuser'@'%';

-- パスワード認証方式の指定 (古いクライアント対応)
ALTER USER 'appuser'@'%' IDENTIFIED WITH mysql_native_password BY 'pass';

サービス操作

# systemd (Linux)
sudo systemctl start mysql
sudo systemctl restart mysql
sudo systemctl status mysql
sudo systemctl enable mysql

# 設定リロード (再起動なし) ※ 一部パラメータのみ
mysql -uroot -p -e "SET GLOBAL ..."

# 設定確認 (起動前にシンタックスチェック)
mysqld --validate-config

# どこから読まれているか確認
mysql --print-defaults
mysqld --print-defaults

Docker で my.cnf を渡す

# docker-compose.yml
services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: mydb
      MYSQL_USER: appuser
      MYSQL_PASSWORD: apppass
    volumes:
      - ./my.cnf:/etc/mysql/conf.d/custom.cnf:ro
      - dbdata:/var/lib/mysql
    ports:
      - "3306:3306"
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

volumes:
  dbdata:

FAQ

Q: my.cnf を変更したのに反映されない
A: ファイルが読み込まれていない可能性。mysqld --print-defaults で確認。複数の my.cnf があると後勝ちです。

Q: innodb_buffer_pool_size を大きくしすぎたら?
A: OS がスワップし始め、むしろ遅くなります。free -m で空きメモリを確認しながら調整。

Q: MariaDB と MySQL で設定は同じ?
A: 基本同じですが、一部パラメータ名が違います (例: query_cache_size は MariaDB ではまだ有効、MySQL 8 では廃止)。バージョン別ドキュメント参照。

編集
Post Share
子ページ
  1. オートコミット
同階層のページ
  1. ダウンロード&インストール方法(Windows)
  2. インストール方法(Linux)
  3. コマンド一覧
  4. SQL
  5. データ型
  6. 関数
  7. 管理ツール
  8. 設定
  9. パフォーマンスチューニング関連
  10. エクスポートおよびインポート
  11. エラー&トラブル
  12. 文字コードの確認
  13. 実行中の SQL の状態確認およびプロセスキルの方法
  14. パスワードの無効化設定
  15. root ユーザーの初期パスワード確認方法
  16. rootユーザーのパスワード変更方法
  17. LIMIT, OFFSET の始まりと挙動
  18. mysqlのバージョン確認方法
  19. MySQLで実行計画を表示する方法
  20. レプリケーションのステータス確認方法
  21. 中央値の導き方(バージョン8未満)
  22. 階層SQL(バージョン8未満)
  23. パーセンタイルの導き方
  24. 特定スキーマの全テーブルの全カラム情報を取得する方法

最近更新/作成されたページ