この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:4
ページ更新者:guest
更新日時:2026-06-11 07:07:02

タイトル: 設定
SEOタイトル: 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 では廃止)。バージョン別ドキュメント参照。