MariaDBとMySQLはどこまで互換か|Linuxサーバーでの乗り換え判断とレプリケーション・my.cnfの非互換ポイント

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtipsデーターベース管理 > MariaDBとMySQLはどこまで互換か|Linuxサーバーでの乗り換え判断とレプリケーション・my.cnfの非互換ポイント
「MySQLからMariaDBに切り替えたら動かないクエリが出てきた」「my.cnfの設定値がエラーになって起動しない」——どちらの方向でも、移行時には必ずいくつかの非互換ポイントに直面します。

MariaDBは2009年にMySQLからフォークされた後、独自の進化を続けており、「ほぼ互換」と言われながらも細部では確実に差が生じています。特にMySQL 8.0以降とMariaDB 10.x以降では、認証プラグイン・GTIDの形式・クエリキャッシュの扱いなど、互換を前提にすると痛い目を見るポイントが増えています。

この記事では、Rocky Linux 9 / Ubuntu 22.04 LTS上でのセルフホスト運用を前提に、MariaDBとMySQLの互換性の実態と、乗り換え判断の根拠になる非互換ポイントを整理します。

この記事のポイント

・MariaDB 10.x と MySQL 5.7 は高互換だが、MySQL 8.0 との差異は認証・GTID・JSONで大きい
・GTIDの形式が異なるため MySQL↔MariaDB 間の混在レプリケーションは設定に注意が必要
・my.cnfで MySQL 8.0 廃止のオプションが MariaDB では継続使用できるケースが多い
・mysqldump を使えばデータ移行自体は単純だが、文字セットと SQLモードを事前確認すること


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

MariaDBとMySQLが「ほぼ互換」と言われる理由

MariaDBはMySQLのコードベースをフォークして開発がスタートしたため、クライアントプロトコル・SQL構文の大部分・InnoDBの基本動作・コマンドラインオプション群が共通です。

具体的には以下が互換で動作します。

・mysqlクライアント(またはmariadbクライアント)で相互に接続できる
・phpMyAdmin・DBeaver・Adminer 等の管理ツールがドライバ変更なしで動く
・Sequelize・Doctrine・ActiveRecord 等の主要ORMがMariaDBアダプタを持つ
・mysqldumpで出力したSQLを相互にインポートできる(制約あり・後述)

ただしこれはMySQL 5.7 vs MariaDB 10.6 のような「同世代」の組み合わせでの話です。MySQL 8.0以降になると非互換の範囲が広がります。

バージョン別の互換性マトリクス

どのバージョン同士を比べるかによって互換性は大きく変わります。
MySQL バージョン MariaDB バージョン 互換レベル 主な差異
MySQL 5.7 MariaDB 10.3~10.6 高(ほぼ互換) ほぼ透過的に移行可能
MySQL 8.0 MariaDB 10.6~10.11 中(部分互換) 認証プラグイン・GTID・JSON型に注意
MySQL 8.4 MariaDB 11.x 低(要検証) mysql_native_password廃止・関数挙動差が多数

主な非互換ポイント

1. 認証プラグインの違い

MySQL 8.0からデフォルト認証プラグインが caching_sha2_password に変わりました。MariaDB 10.xのデフォルトは引き続き mysql_native_password(10.4以降は ed25519 も選択可)です。

この差異が問題になる典型的なケースは、MySQL 8.0クライアントからMariaDBに接続する場合です。クライアント側が caching_sha2_password を要求しても、MariaDB側にプラグインが入っていないため接続を拒否されます。

# MariaDB 10.11 上でのユーザー認証プラグイン確認 $ sudo mariadb -u root -p MariaDB [(none)]> SELECT user, plugin FROM mysql.user WHERE user = 'root'; +------+-----------------------+ | user | plugin | +------+-----------------------+ | root | mysql_native_password | +------+-----------------------+ 1 row in set (0.001 sec)

MySQL 8.4以降では mysql_native_password プラグインが廃止されているため、MySQL 8.4のクライアントライブラリを使ったアプリケーションがMariaDBに接続する場合は --default-auth=mysql_native_password を指定するか、接続DSNに auth_plugin=mysql_native_password を明示する必要があります。

2. GTID(グローバルトランザクションID)の形式差異

レプリケーションで最も影響が大きいのがGTIDの形式の違いです。

MySQL形式: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:N(UUID+シーケンス番号)
MariaDB形式: N-N-N(サーバーID-ドメインID-シーケンス番号)

この違いのため、GTIDモードを有効にしたMySQL→MariaDB間の混在レプリケーションは、そのままでは動作しません。後述のレプリケーション設定で回避策を解説します。

3. JSONデータ型の実装差異

MySQL 8.0はJSONをネイティブのバイナリ形式で格納し、JSONカラムへのインデックスや部分更新の最適化が行われています。MariaDB 10.2+のJSONデータ型は内部的に LONGTEXT + CHECK 制約として実装されており、バイナリ最適化はありません。

JSON関数(JSON_EXTRACT()JSON_SET() 等)のシグネチャは互換ですが、実行計画とパフォーマンス特性が異なるため、JSON型を多用するアプリケーションは移行前後でベンチマークを取ることを推奨します。

4. SQLモードのデフォルト値の違い

MySQL 8.0では ONLY_FULL_GROUP_BY がデフォルトで有効です。MariaDBでは無効(MySQL 5.7相当)です。

# MySQLでのSQLモード確認 mysql> SELECT @@sql_mode\G *************************** 1. row *************************** @@sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE, NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION # MariaDBでのSQLモード確認 MariaDB [(none)]> SELECT @@sql_mode\G *************************** 1. row *************************** @@sql_mode: STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

MySQL 5.7で動いていたGROUP BYクエリがMySQL 8.0移行後にエラーになった場合、MariaDBに移行すると再び動くことがあります。逆方向(MariaDB→MySQL 8.0)の移行では、GROUP BYに非集計列が含まれるクエリが壊れることがあるため、アプリケーション側でのSQL修正が必要です。

my.cnfの非互換オプション

1. MySQL 8.0で廃止されたオプション(MariaDBでは継続使用可)

MySQL 8.0でクエリキャッシュが廃止されたため、以下のオプションをMySQL 8.0の my.cnf に書くと起動エラーになります。MariaDBではこれらを引き続き使用できます。

query_cache_type: クエリキャッシュの有効化設定
query_cache_size: クエリキャッシュのサイズ
query_cache_limit: キャッシュする最大クエリサイズ
innodb_file_format: InnoDBファイル形式(Barracuda等)
innodb_file_format_max: 同上の最大値
innodb_large_prefix: 大きなインデックスプレフィックスの許可

MySQL 5.7の my.cnf をそのままMySQL 8.0に持っていくと上記オプションでエラーになります。MariaDBに移行する場合は設定をそのまま使い回せるメリットがあります。

2. MariaDB固有のオプション(MySQLでは使用不可)

以下はMariaDB独自のオプションで、MySQLの my.cnf に書いても無視されるか起動エラーになります。

aria_*: MariaDB独自のAriaストレージエンジン用設定
wsrep_*: Galera Cluster用のレプリケーション設定
mariadb_backup.*: mariabackup用設定
gtid_domain_id: MariaDB形式GTIDのドメインID設定

MariaDBの設定をMySQLに移行する際は、aria_*wsrep_* セクションを削除またはコメントアウトしてください。

# my.cnfのオプション有効性チェック(MariaDB) $ sudo mariadbd --validate-config # エラーがなければ何も表示されない # MySQL 8.0でのチェック(廃止オプションが残っている場合のエラー例) $ sudo mysqld --validate-config mysqld: [ERROR] unknown variable 'query_cache_type=1'

レプリケーション設定の注意点

1. MySQL(ソース)→MariaDB(レプリカ)の設定

MySQL 5.7をソース(旧master)、MariaDBをレプリカ(旧slave)として動かすことは、GTIDを無効にしたバイナリログポジションベースのレプリケーションであれば可能です。

MariaDB側の /etc/my.cnf.d/server.cnf に以下を追加します。

[mariadb] # MariaDB→MySQLソースへのレプリカ設定 server_id = 2 log_bin = mysql-bin binlog_format = ROW # MariaDB固有GTIDを使わない設定(MySQL GTIDと形式が違うため) gtid_strict_mode = OFF slave_parallel_threads = 0 # MySQL 8.0のバイナリログイベントを処理するための設定 replicate_ignore_db = performance_schema

レプリケーション開始コマンドはポジションベースで実行します。

# MariaDB側での設定(MySQL 5.7ソースのポジションに合わせる) MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST = '192.0.2.10', MASTER_USER = 'replicator', MASTER_PASSWORD = '***', MASTER_LOG_FILE = 'mysql-bin.000001', MASTER_LOG_POS = 154; MariaDB [(none)]> START SLAVE; MariaDB [(none)]> SHOW SLAVE STATUS\G # Slave_IO_Running: Yes # Slave_SQL_Running: Yes # が表示されれば正常

2. MySQL 8.0以降のGTIDモードとの混在は非推奨

MySQL 8.0でGTIDモード(gtid_mode=ON)を有効にしている場合、MariaDBとのレプリケーション混在は本番環境での使用を推奨しません。GTIDの形式が根本的に異なるため、レプリカのポジションが正しく追跡できず、データ整合性のリスクがあります。移行はダウンタイムを確保してmysqldumpで行うのが現実的です。

MariaDB・MySQLのレプリケーション設計・my.cnfチューニング・障害時の切り戻し手順は、実機を動かしながら身につけるのが最短です。20年以上の現場経験を持つエンジニアが2日間で本番運用の「型」を直接指導します。

mysqldumpを使った移行手順

1. 移行元(MySQL)でダンプを取る

--single-transaction でInnoDBのロックを回避しながらダンプします。--routines--triggers を忘れると、ストアドプロシージャとトリガーが移行されないので注意してください。

# MySQL側でダンプ(本番のInnoDBをロックなしで取得) $ mysqldump \ --single-transaction \ --routines \ --triggers \ --set-gtid-purged=OFF \ -u root -p \ --databases myapp_db > /backup/myapp_db_dump.sql # ダンプファイルの文字セットを確認する $ head -5 /backup/myapp_db_dump.sql -- MySQL dump 10.19 Distrib 8.0.39, for Linux (x86_64) -- -- Host: localhost Database: myapp_db -- -------------------------------------------------------- -- Server version 8.0.39 $ grep 'character_set_database\|SET NAMES' /backup/myapp_db_dump.sql | head -3 SET NAMES utf8mb4;

--set-gtid-purged=OFF はGTIDモードが有効な環境でダンプするときに必要です。省略するとMariaDBへのインポート時に GTID_PURGED 構文エラーが発生します。

2. MariaDBへインポートする

# MariaDB側にインポート $ sudo mariadb -u root -p < /backup/myapp_db_dump.sql # インポート完了後にデータベースとテーブルを確認 $ sudo mariadb -u root -p -e "SHOW DATABASES;" +--------------------+ | Database | +--------------------+ | information_schema | | myapp_db | | mysql | | performance_schema | +--------------------+ $ sudo mariadb -u root -p -e "SHOW TABLES FROM myapp_db;"

3. 動作確認

インポート後は文字セット・SQLモード・バージョン情報を確認します。

MariaDB [(none)]> SELECT VERSION(); +--------------------+ | VERSION() | +--------------------+ | 10.11.8-MariaDB | +--------------------+ MariaDB [(none)]> USE myapp_db; MariaDB [myapp_db]> SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = 'myapp_db'; +----------------------------+------------------------+ | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | +----------------------------+------------------------+ | utf8mb4 | utf8mb4_general_ci | +----------------------------+------------------------+ # アプリケーションで使っているクエリを実際に実行してエラーがないことを確認する MariaDB [myapp_db]> EXPLAIN SELECT * FROM orders WHERE user_id = 1;

トラブルシュート

「Plugin 'mysql_native_password' is not loaded」エラー

MySQL 8.4以降のクライアントライブラリを使ってMariaDBに接続した場合、もしくはMySQL 8.4に接続しようとしてMariaDBクライアントを使った場合に発生します。

MariaDB 10.xには mysql_native_password は標準搭載されているため、MariaDB自身のサーバーに接続する分にはこのエラーは発生しません。MySQL 8.4サーバーに接続しようとしたときに出るエラーです。対処は接続先をMariaDBサーバーに限定するか、MySQL 8.4側でユーザーを caching_sha2_password 形式で再作成することです。

「Unknown system variable 'query_cache_type'」エラー

MySQL 8.0以降では query_cache_type / query_cache_size が廃止されています。MySQL 5.7からMySQLのままバージョンアップした場合に my.cnf の古い設定が残っていると発生します。

# MySQL 8.0でのエラー例 2024-09-04T03:12:45.123456Z 0 [ERROR] [MY-011071] [Server] unknown variable 'query_cache_type=1' # 対処: /etc/my.cnf から該当行をコメントアウトまたは削除 # query_cache_type = 1 ← この行をコメントアウト # query_cache_size = 64M ← この行をコメントアウト

MariaDBに移行した場合はこの設定をそのまま使えるため、MySQL 8.0より移行先としてmy.cnfの変更コストが低くなります。

「Illegal mix of collations」エラー

MySQL 8.0のデフォルトcollationは utf8mb4_0900_ai_ci ですが、MariaDB 10.xのデフォルトは utf8mb4_general_ci です。MySQLのダンプをMariaDBにインポートするとcollationの不一致でJOINや比較クエリがエラーになることがあります。

# ダンプファイル内のcollation指定を確認 $ grep 'utf8mb4_0900_ai_ci' /backup/myapp_db_dump.sql | wc -l 47 # 一括置換してMariaDB互換のcollationに変更する $ sed -i 's/utf8mb4_0900_ai_ci/utf8mb4_general_ci/g' /backup/myapp_db_dump.sql # 置換後に再確認 $ grep 'utf8mb4_0900_ai_ci' /backup/myapp_db_dump.sql | wc -l 0

MariaDB vs MySQL 互換性まとめ

項目 MariaDB 10.11 MySQL 8.0
デフォルト認証プラグイン mysql_native_password caching_sha2_password
GTID形式 サーバーID-ドメインID-シーケンス UUID:トランザクション番号
クエリキャッシュ 搭載(query_cache_*が有効) 廃止(8.0以降使用不可)
JSONデータ型 LONGTEXT + CHECKベース ネイティブバイナリ形式
ONLY_FULL_GROUP_BY デフォルト無効 デフォルト有効
デフォルトcollation(utf8mb4) utf8mb4_general_ci utf8mb4_0900_ai_ci
Galera Cluster 標準搭載(wsrep_*で設定) 非搭載(別途Percona XtraDB等)
MySQL 5.7のmy.cnfとの互換 高い(廃止オプションが少ない) 低い(多数のオプションが廃止)
乗り換えの判断基準をまとめると、MySQL 5.7からMariaDB 10.xへの移行は作業コストが低く、クエリキャッシュやmy.cnfをそのまま活かせます。MySQL 8.0からMariaDBへの移行は認証・collation・JSON型の差異を事前に洗い出してから進めることが重要です。いずれの方向でも、mysqldumpによる論理バックアップとステージング環境での事前検証が、本番移行を安全に進めるための「型」です。

MariaDB・MySQL移行設計も、Linuxサーバー運用の「型」の一部です

互換性の見極め・mysqldumpによる安全な移行手順・レプリケーション設計・my.cnfチューニングは、本番DBを止めずに運用するための基礎スキルです。「動くことは分かった。でも本番で安全に移行できる自信がない」という方へ、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。