0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Rails + MySQL 8.0→8.4 アップグレード

Posted at

はじめに

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を使用することで、ダウンタイムを最小限(数分程度)に抑えられます。

手順

  1. Green環境の作成: MySQL 8.4でGreen環境を構築
  2. アプリケーションテスト: Green環境での動作確認
  3. スイッチオーバー: 本番トラフィックをGreenに切り替え

よくあるエラーと対処法

エラー1: Authentication plugin cannot be loaded

Mysql2::Error: Authentication plugin 'caching_sha2_password' cannot be loaded

対処法:

  1. database.ymlにssl_mode: requiredを追加
  2. mysql2 gemのバージョンを0.5.2以降に更新

エラー2: SSL connection error

Mysql2::Error: SSL connection error: error:00000001:lib(0):func(0):reason(1)

対処法:

  1. SSL証明書のパス確認
  2. 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年間は安心してアプリケーションを運用できるでしょう。

参考資料

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?