はじめに
MySQL 8.4 LTSがリリースされ、5年間のサポートが提供されることになりました。しかし、MySQL 8.0から8.4へのアップグレードには、特にRailsアプリケーションにおいていくつかの重要な変更があります。
本記事では、実際のアップグレード作業で遭遇する問題と、その具体的な解決方法を解説します。
MySQL 8.4の主要な変更点
認証プラグインの強制変更
-
MySQL 8.0:
mysql_native_password
がデフォルト(8.0.34以降は非推奨) -
MySQL 8.4:
caching_sha2_password
が強制デフォルト(default_authentication_plugin
変数が削除)
SSL接続の必須化
caching_sha2_password
を使用する場合、SSL接続またはRSA鍵交換が必要になります。
廃止された機能
-
WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS()
関数の完全削除 -
FLOAT
/DOUBLE
列でのAUTO_INCREMENT機能の削除
Rails側で必要な対応
1. database.ymlへのSSL設定追加
現在の設定例:
default: &default
adapter: mysql2
encoding: utf8mb4
collation: utf8mb4_general_ci
pool: 5
host: <%= Rails.application.credentials.dig(:database, :host) %>
username: <%= Rails.application.credentials.dig(:database, :username) %>
password: <%= Rails.application.credentials.dig(:database, :password) %>
MySQL 8.4対応版:
default: &default
adapter: mysql2
encoding: utf8mb4
collation: utf8mb4_general_ci
pool: 5
host: <%= Rails.application.credentials.dig(:database, :host) %>
username: <%= Rails.application.credentials.dig(:database, :username) %>
password: <%= Rails.application.credentials.dig(:database, :password) %>
# SSL設定を追加
ssl_mode: <%= Rails.env.production? ? 'required' : 'preferred' %>
production:
<<: *default
database: myapp_production
ssl_mode: required
development:
<<: *default
database: myapp_development
ssl_mode: preferred
test:
<<: *default
database: myapp_test
# テスト高速化のためSSL無効化(任意)
ssl_mode: disabled
2. AWS RDS使用時の追加設定
AWS RDSを使用している場合は、CA証明書の設定も必要です:
production:
<<: *default
database: myapp_production
ssl_mode: required
sslca: /opt/rds-ca-2019-root.pem
3. mysql2 gemのバージョン確認
MySQL 8.4対応には mysql2 gem 0.5.2以降が必要です:
# 現在のバージョン確認
bundle show mysql2
# Gemfileで指定
gem 'mysql2', '~> 0.5.3'
事前確認とテスト手順
1. 開発環境での接続テスト
# Rails console で実行
rails c
# MySQL バージョン確認
ActiveRecord::Base.connection.execute("SELECT VERSION()")
# SSL接続状態の確認
result = ActiveRecord::Base.connection.execute("SHOW STATUS LIKE 'Ssl_cipher'")
puts result.first['Value'].present? ? "SSL接続中" : "非SSL接続"
# 認証プラグイン確認
user = ActiveRecord::Base.connection_config[:username]
result = ActiveRecord::Base.connection.execute(
"SELECT user, host, plugin FROM mysql.user WHERE user = '#{user}'"
)
puts result.to_a
2. 廃止機能の事前チェック
-- FLOAT/DOUBLEのAUTO_INCREMENT使用テーブル確認
SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE DATA_TYPE IN ('FLOAT', 'DOUBLE')
AND EXTRA LIKE '%auto_increment%';
-- Spatial indexの確認
SELECT TABLE_SCHEMA, TABLE_NAME, INDEX_NAME
FROM INFORMATION_SCHEMA.STATISTICS
WHERE INDEX_TYPE = 'SPATIAL';
AWS RDS Blue/Green Deploymentを活用したアップグレード
AWS RDSのBlue/Green Deploymentを使用することで、ダウンタイムを最小限(数分程度)に抑えられます。
手順
- Green環境の作成: MySQL 8.4でGreen環境を構築
- アプリケーションテスト: Green環境での動作確認
- スイッチオーバー: 本番トラフィックをGreenに切り替え
よくあるエラーと対処法
エラー1: Authentication plugin cannot be loaded
Mysql2::Error: Authentication plugin 'caching_sha2_password' cannot be loaded
対処法:
- database.ymlに
ssl_mode: required
を追加 - mysql2 gemのバージョンを0.5.2以降に更新
エラー2: SSL connection error
Mysql2::Error: SSL connection error: error:00000001:lib(0):func(0):reason(1)
対処法:
- SSL証明書のパス確認
- AWS RDSの場合は適切なCA証明書を設定
エラー3: Function does not exist
Mysql2::Error: FUNCTION database.WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS does not exist
対処法:
廃止された関数を使用していないかコードを確認し、代替機能に置き換え
緊急時の回避策
開発環境での一時的対処
development:
<<: *default
ssl_mode: disabled # SSL無効化
既存ユーザーの認証プラグイン変更(非推奨)
-- 一時的な対処として
ALTER USER 'app_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
パフォーマンスとセキュリティの向上
MySQL 8.4の利点
- パフォーマンス向上: 最大2倍の書き込みレイテンシ改善
- セキュリティ強化: より強固な認証プラグイン
- 長期サポート: 5年間のLTSサポート
Rails側での最適化
production:
<<: *default
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 10 } %>
timeout: 5000
ssl_mode: required
# 接続プールの最適化
checkout_timeout: 5
まとめ
MySQL 8.0から8.4へのアップグレードは、主にSSL設定の追加が重要なポイントです。
チェックリスト
- mysql2 gem 0.5.2以降の使用
- database.ymlにssl_mode設定追加
- 廃止機能の使用有無確認
- テスト環境での動作確認
- AWS RDS証明書設定(該当する場合)
適切な準備を行えば、ダウンタイムを最小限に抑えてスムーズにアップグレードできます。MySQL 8.4 LTSの長期サポートにより、今後5年間は安心してアプリケーションを運用できるでしょう。