Upgrade to Pro — share decks privately, control downloads, hide ads and more …

大江戸Ruby会議でデータベース クライアントの話をするのは 間違っているだろうか

Avatar for Yasuo Honda Yasuo Honda
November 08, 2026

大江戸Ruby会議でデータベース クライアントの話をするのは 間違っているだろうか

Avatar for Yasuo Honda

Yasuo Honda

November 08, 2026

More Decks by Yasuo Honda

Other Decks in Technology

Transcript

  1. Who am I Rails Committer Maintainer of Active Record Oracle

    enhanced adapter Find me on: https://github.com/yahonda https://x.com/yahonda 大江戸Ruby会議11 2
  2. 初めての RubyKaigi:RubyKaigi 2014 Introduce Oracle enhanced adapter for ActiveRecord, another

    choice for your Rails database. 動画: rubyevents.org 大江戸Ruby会議11 8
  3. 12 年後、ずっと Rails とデータベースの話をしている 最新: Kaigi on Rails 2026「Active Record

    Connection Adapters における長年の課題に再び取り組む」 スライド: speakerdeck.com 大江戸Ruby会議11 9
  4. MySQL と MariaDB MariaDB は MySQL のフォーク ◦ プロトコルは互換だが、細かな点ではそれぞれ独自に進化している Rails

    は MariaDB を MySQL 互換のデータベースとして扱う ◦ 違いは mariadb? メソッドで吸収する ◦ 例: 生成列は MySQL が STORED 、MariaDB が PERSISTENT 大江戸Ruby会議11 13
  5. Rails と MySQL クライアントの関係 接続に使う gem ◦ mysql2 ◦ trilogy

    コマンドライン(CLI): 今回は主にこちらの話 ◦ mysql ◦ mysqldump 大江戸Ruby会議11 14
  6. Rails が実行する mysql / mysqldump mysql ◦ bin/rails dbconsole ◦

    config.active_record.database_cli で変更できる(例: mycli ) ◦ bin/rails db:schema:load mysqldump ◦ bin/rails db:schema:dump ( schema_format = :sql のとき) / db:schema:dump のコマンドは固定 ユーザーが使っているのは Rails のタスクで、MySQL クライアントを直接使っ ているわけではない db:schema:load 大江戸Ruby会議11 15
  7. 3 つの MySQL クライアント(Linux) 1. Oracle の MySQL クライアント Ubuntu

    26.04: default-mysql-client Oracle: https://dev.mysql.com/downloads/mysql/ 2. Debian の MySQL クライアント Debian 13: default-mysql-client 3. MariaDB の MySQL クライアント mariadb.org の apt リポジトリ 大江戸Ruby会議11 16
  8. Rails の Docker イメージに入る MySQL クライアント で生成される Dockerfile は Debian

    ベースで、 default-mysql-client を入れる rails new myapp -d mysql ◦ FROM docker.io/library/ruby:$RUBY_VERSION-slim AS base ◦ docker-library が -slim の指す先を Debian 13 にしている # railties/lib/rails/generators/database.rb class MySQL2 < Database def base_package "default-mysql-client" end end 大江戸Ruby会議11 17
  9. Debian の MySQL クライアントの中身は MariaDB : ディストリビューションごとに中身を変えるメタパッケ ージ(2016 年〜、Debian の

    mysql-defaults ) default-mysql-client ◦ Debian 13 (trixie): mariadb-client-compat → MariaDB のクライアント 11.8.6 ◦ Ubuntu 26.04: mysql-client → Oracle の MySQL クライアント 8.4.11 Debian 9(2017 年)から、Debian の既定は MySQL から MariaDB に変わ った 大江戸Ruby会議11 18
  10. MariaDB 版と Debian 版のクライアントの違い mysql / mysqldump という名前 ◦ MariaDB:

    mysql / mysqldump のリンクは mariadb-client-compat が入れる(11.0 か ら) ◦ Debian: mariadb / mariadb-dump へのシンボリックリンクとして入る $ ls -l /usr/bin/mysql /usr/bin/mysqldump lrwxrwxrwx 1 root root 7 Mar 6 2026 /usr/bin/mysql -> mariadb lrwxrwxrwx 1 root root 12 Mar 6 2026 /usr/bin/mysqldump -> mariadb-dump mariadb-client-compat : db:schema:dump / db:schema:load に必須 ◦ Rails が実行するコマンドは mysql / mysqldump で固定のため 大江戸Ruby会議11 19
  11. "Deprecated program name" という警告 意味: mysql / mysqldump という名前は将来削除予定、 mariadb

    / mariadbdump を使うこと ◦ MDEV-29582 "deprecate mysql* names"(11.0.1) ◦ MDEV-30201 "Remove MySQL names"(Open、時期未定) MariaDB 11.0 以降: 警告が出る(例: 12.3) $ mysql --version mysql: Deprecated program name. It will be removed in a future release, use '/usr/bin/mariadb' instead mysql from 12.3.3-MariaDB, client 15.2 for debian-linux-gnu (aarch64) using EditLine wrapper $ mysqldump --version mysqldump: Deprecated program name. It will be removed in a future release, use '/usr/bin/mariadb-dump' instead mysqldump from 12.3.3-MariaDB, client 10.20 for debian-linux-gnu (aarch64) 大江戸Ruby会議11 20
  12. "Deprecated program name" という警告 Debian 13(MariaDB 11.8.6): 11.0 以降なのに警告が出ない $

    mysql --version mysql from 11.8.6-MariaDB, client 15.2 for debian-linux-gnu (aarch64) using $ mysqldump --version mysqldump from 11.8.6-MariaDB, client 10.19 for debian-linux-gnu (aarch64) EditLine wrapper 大江戸Ruby会議11 21
  13. "Deprecated program name" という警告 Debian 側のパッチで消している ◦ 警告を消しているだけで、それ以外の振る舞いは MariaDB のものと同じ

    ◦ https://salsa.debian.org/mariadb-team/mariadb- server/-/blob/c6fc0ed3013f34410a645f4401c44034264fd801/debian/patches/ hide-mysql-command-deprecation-warnings.patch + + if ((res == 0 || my_readlink(link_name, my_progname, MYF(0)) == 0) && strncmp(link_name + dirname_length(link_name), "mariadb", 7) == 0) my_error(EE_NAME_DEPRECATED, MYF(MY_WME), link_name); /* Intentionally don't emit any errors for now */ DBUG_PRINT("deprecation warning", "skipped"); 大江戸Ruby会議11 22
  14. 直してきた問題: db:schema:load を標準入力に これまでは SOURCE で読み込んでいた ◦ mysql --execute "SET

    FOREIGN_KEY_CHECKS = 0; SOURCE ...; SET FOREIGN_KEY_CHECKS = 1" MySQL 9.4 以降、 SOURCE は --commands が必要 --commands は MariaDB のクライアントにはない ◦ unknown option '--commands' ファイルを標準入力から渡すようにした(rails/rails#58829、main のみ) Rails 8.1 以下で Oracle MySQL 9.4 以降のクライアントを使うなら ◦ ActiveRecord::Tasks::DatabaseTasks.structure_load_flags = { mysql2: ["-commands"] } 大江戸Ruby会議11 24
  15. これから直そうとしている課題 MariaDB のクライアントでは、 database.yml に ssl_mode を書くと structure.sql の dump

    / load が失敗する Oracle MySQL 8.4 の mysqldump では、MariaDB 11.4 以降を dump できな い MariaDB 11.4 以降のクライアントでは、 ssl_mode を書かなくても MySQL サ ーバーに接続できないことがある MariaDB のクライアントでは mariadb / mariadb-dump を直接使 い、"Deprecated program name" の警告を出さないようにしたい 課題は分かっているが、どう直すかはまだ決まっていない 大江戸Ruby会議11 25
  16. MariaDB のクライアントでは ssl_mode で dump / load が失敗する production: adapter:

    trilogy host: db.example.com ssl_mode: required $ bin/rails db:schema:dump → mysqldump --host=db.example.com --ssl-mode=required ... mysqldump: unknown variable 'ssl-mode=required' $ bin/rails db:schema:load → mysql --host=db.example.com --ssl-mode=required ... < db/structure.sql mysql: unknown variable 'ssl-mode=required' 大江戸Ruby会議11 26
  17. MariaDB のクライアントでは ssl_mode で dump / load が失敗する mysql2 でも

    trilogy でも同じ(rails/rails#56876) MariaDB のクライアントは接続する前に --ssl-mode を拒否する ◦ 相手のサーバーが MySQL でも MariaDB でも失敗する ◦ Oracle MySQL の --ssl-mode に当たるものは、MariaDB のクライアントでは --ssl と --ssl-verify-server-cert の組み合わせで指定する class_attribute :cli_arg_map, instance_accessor: false, default: { # ... ssl_mode: "--ssl-mode" }.freeze 大江戸Ruby会議11 27
  18. MariaDB でもアプリの接続では ssl_mode が効く mysql2 + libmariadb(Debian の libmariadb3 など)では、

    ssl_mode が効く ◦ 効くのは disabled / required / verify_identity ◦ preferred / verify_ca は警告が出て無視される trilogy は自前の実装で、libmysqlclient / libmariadb を使わない ◦ ただし CLI は持たないので、dump / load には mysql / mysqldump が必要 大江戸Ruby会議11 28
  19. Oracle MySQL 8.4 の mysqldump で MariaDB を dump できない

    $ mysqldump --host=mariadb ... mysqldump: Couldn't execute 'SELECT COLUMN_NAME, ... FROM information_schema.COLUMN_STATISTICS ...': Unknown table 'COLUMN_STATISTICS' in information_schema (1109) MariaDB 11.4 以降のサーバーで失敗する(10.11 は警告だけで成功) ◦ Ubuntu 26.04 の default-mysql-client が、この Oracle MySQL 8.4.11 8.4 は --column-statistics が既定でオン ◦ --column-statistics=0 を付ければ通る ◦ 9.7 は既定でオフなので起きない Rails では、この組み合わせのときにテストをスキップしただけ (rails/rails#58879) 大江戸Ruby会議11 29
  20. 自己署名の証明書で接続できない MariaDB 11.4 から、クライアントが既定で証明書を検証する ( --ssl-verify-server-cert 、MDEV-31857) ◦ そのため Debian

    13 のクライアント(MariaDB 11.8.6)でも、MySQL 8.4 の自己署名 の証明書で接続できない Rails の CI は ~/.my.cnf に [client] ssl=OFF ( --skip-ssl と同じ)を書い て回避(rails/buildkite-config#159) 大江戸Ruby会議11 30
  21. まとめ Rails が実行する mysql / mysqldump は、環境によって中身が違う ◦ Debian 13

    の default-mysql-client の中身は MariaDB 11.8 (意図せず)クライアントとサーバーの種類が違うことで発生する問題がある ◦ Debian 13 では default-mysql-client で MariaDB のクライアントが入る こういうことを、多くの人が考えなくていいようにしたいと思って Rails を更新 している ◦ AI がコードを書く時代に、フレームワークがこの抽象化を持ち続けるべきかは分からない 大江戸Ruby会議11 31