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モードを事前確認すること
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
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_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
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 ← この行をコメントアウト
「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との互換 | 高い(廃止オプションが少ない) | 低い(多数のオプションが廃止) |
MariaDB・MySQL移行設計も、Linuxサーバー運用の「型」の一部です
互換性の見極め・mysqldumpによる安全な移行手順・レプリケーション設計・my.cnfチューニングは、本番DBを止めずに運用するための基礎スキルです。「動くことは分かった。でも本番で安全に移行できる自信がない」という方へ、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:PostgreSQLのテーブル一覧をpsqlで確認する手順|スキーマごとの洗い出しと行数・サイズの把握
- この記事の属するカテゴリ:データーベース管理へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます