Aamzon RDS for MySQL ユーザーのための MariaDB入門
先日、2015年10月7日に re:Invent 2015 の keynoteで Amazon RDS の 新エンジン "MariaDB" のリリースが発表されました。MariaDB登場の背景や違いを知ることは、MariaDB導入の意思決定にお役立ちするでしょう。
ANDY JASSY 曰く、
高価で、独占的で、(ベンダー)ロックオンで、過酷なライセンスによって不自由な...そんなデータベースの悪い関係から開放されたい! それこそ、顧客がよりオープンで、フレンドリーで、高価でないデータベースエンジンに移行している理由です。 しかし、独占的なデータベースに匹敵する性能を得るのは困難です。 顧客は自由へのさらなる選択肢を求めています。 そこで登場したのが、第6のデータベースエンジン”MariaDB”です!
MariaDBとは
MariaDBは、MySQLから派生したオープンソースのRDBMSです。MariaDB の開発はMySQLのオリジナルコードの作者であり、MySQL ABの創設者でもある Michael "Monty" Widenius が中心に行われており、MySQLと高い互換を目指して開発されています。MySQLからMariaDBの移行が容易で、今では Redhat, Fedora, openSUSE, Slackwareなど主要な Linux デストリビューションの多くが MariaDB を採用しています。
実際にAamzon RDS for MariaDBのDBインスタンスの作成とログインは以下のブログを御覧ください。
MariaDBの背景
RDSのMariaDBのバージョンは10.0系(10.0.17)の一択ですが、MariaDBには大きく5.5系と10.0系の2つのバージョンが存在し、MySQL5.5以前の完全互換を重視する5.5系と、フォークした10.0系に分類されます。
MySQL 5.6の大規模なリファクタリングに伴い、MySQLをベースにしてMariaDB独自の改良を継続が困難になりました。そのような背景からMariaDB5.5をベースにして、MySQL5.6から新機能の選択的な追加や、積極的に独自機能の追加を行う方針に変更され、バージョン番号が10.0に切り上げられました。
MariaDBとMySQLの相違点
Aamzon RDS for MySQLは、MySQLと同様にMultiAZやReadReplicaに対応しています。以下、RDSユーザーにおけるMariaDB10.0系とMySQL5.6系の相違点をまとめました。
SQLの差異
項目 | MySQL | MariaDB |
Autoincrement | 最大値に達すると、以降は最大値を繰り返す。Warningのみ。エラーにならない。tinyintであれば、,125,126,127,127,127…となる。 | 最大値-1まで。以降はエラーを返す。tinyintは125,126,ERROR,ERROR,…となる。 |
INSERT,UPDATE,DELETEパーティション句 | バージョン5.6から | 未対応 |
SHOW文 WHERE句 | バージョン5.6から | 未対応 |
EXPLAIN文 JSON形式 | バージョン5.6から | 未対応 |
Optimizer Trace | バージョン5.6から | 未対応 |
基本的にClient-Server間は同じプロトコルで通信を行うため、接続するクライアントにとっては違いがない、つまり MySQLのツール群がほとんどそのまま使えることを意味します。また、MySQL5.5以前であれば、Autoincrement以外の差異が見られないので、移行が容易であることが理解できると思います。
機能的な差異
機能 | MariaDB | MySQL |
グローバルトランザクションID(GTID) (仕様が異なるため、互換性なし) | ○ | ○ |
エンジン非依存の統計情報 | ○ | - |
非インデックスカラムのヒストラグム統計 | ○ | - |
スレッドプール | ○ | -(Community Editionになし) |
ダイナミックカラム | ○ | - |
バーチャルカラム | ○ | - |
KILL QUERY ID | ○ | - |
ALTER TABLE進捗レポート | ○ | - |
SHOW EXPLAIN | ○ | - |
スレッド毎のメモリ統計 | ○ | - |
ROLE管理 | ○ | - |
memcachedプラグイン | - | ○ |
optimizer_switch | ○ | △(一部のみ) |
MariaDBはオープンで自由なだけでなく、MySQLのCommunity Editionに含まれていないEnterprise Edition相当の機能であるスレッドプールが標準で利用できるのが魅力です。RDSは標準ではリプリケーション関連の様に不要な機能やshutdownコマンドのようなRDS向きではない機能は制限がかけられています。
参考: MariaDB vs. MySQL - Features MariaDB versus MySQL - Compatibility
DBパラメータグループ
Amazon RDS MySQL default.mysql5.6 DB パラメータグループに含まれるいくつかのパラメータがありますが、すべてのパラメータがあるわけではありません。default.mariadb10.0 DB パラメータグループには、MariaDB のみに適用されるパラメータが含まれています。でも、ご心配ありません、付録: MariaDB のパラメータ にスッキリとまとめられています。
MySQL 5.6 のパラメータの詳細については、『MySQL のドキュメント』、MariaDB パラメータの詳細については、MariaDB のドキュメントを参照してください。
サポートしているストレージエンジン
ストレージエンジンを覗いてみましょう。(ちょっと横に長いですが)
mysql> show engines; +--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+ | CSV | YES | CSV storage engine | NO | NO | NO | | MRG_MyISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | InnoDB | DEFAULT | Percona-XtraDB, Supports transactions, row-level locking, and foreign keys | YES | YES | YES | | BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO | | MyISAM | YES | MyISAM storage engine | NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | | ARCHIVE | YES | Archive storage engine | NO | NO | NO | | FEDERATED | YES | FederatedX pluggable storage engine | YES | NO | YES | | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | | Aria | YES | Crash-safe tables with MyISAM heritage | NO | NO | NO | +--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+ 10 rows in set (0.18 sec)
MariaDB10.0系でサポートされている、Cassandra、CONNECT、Spider、TokuDBは、サポートされていない様です。また、上記では、FEDERATEDがYesですが、公式マニュアル(MariaDB を実行する DB インスタンスを作成する)には、「加えて、フェデレーティッドストレージエンジンは、現在 MariaDB の Amazon RDS ではサポートされていません。」との記載があります。
サポートしているプラグイン
プラグインについても覗いてみましょう。
mysql> show plugins; +-----------------------------+----------+--------------------+---------+---------+ | Name | Status | Type | Library | License | +-----------------------------+----------+--------------------+---------+---------+ | binlog | ACTIVE | STORAGE ENGINE | NULL | GPL | | mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL | | mysql_old_password | ACTIVE | AUTHENTICATION | NULL | GPL | | CSV | ACTIVE | STORAGE ENGINE | NULL | GPL | | MRG_MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL | | MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL | | MEMORY | ACTIVE | STORAGE ENGINE | NULL | GPL | | BLACKHOLE | ACTIVE | STORAGE ENGINE | NULL | GPL | | FEDERATED | ACTIVE | STORAGE ENGINE | NULL | GPL | | Aria | ACTIVE | STORAGE ENGINE | NULL | GPL | | InnoDB | ACTIVE | STORAGE ENGINE | NULL | GPL | | XTRADB_READ_VIEW | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | XTRADB_INTERNAL_HASH_TABLES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | XTRADB_RSEG | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_TRX | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_LOCKS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_LOCK_WAITS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMPMEM | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMPMEM_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP_PER_INDEX | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP_PER_INDEX_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_BUFFER_PAGE | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_BUFFER_PAGE_LRU | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_BUFFER_POOL_STATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_METRICS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_DEFAULT_STOPWORD | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_BEING_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_CONFIG | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_INDEX_CACHE | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_INDEX_TABLE | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_TABLES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_TABLESTATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_INDEXES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_COLUMNS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_FIELDS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_FOREIGN | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_FOREIGN_COLS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_TABLESPACES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_DATAFILES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CHANGED_PAGES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | ARCHIVE | ACTIVE | STORAGE ENGINE | NULL | GPL | | PERFORMANCE_SCHEMA | ACTIVE | STORAGE ENGINE | NULL | GPL | | FEEDBACK | DISABLED | INFORMATION SCHEMA | NULL | GPL | | partition | ACTIVE | STORAGE ENGINE | NULL | GPL | +-----------------------------+----------+--------------------+---------+---------+ 47 rows in set (0.19 sec)
標準的なものとストレージエンジンに関するものがほとんどです。 "plugin_dir"ディレクトリ内のすべてのプラグイン(未インストールも含む)に関する情報を参照してみます。
mysql> show plugins soname; +-----------------------------+---------------+--------------------+----------------------+---------+ | Name | Status | Type | Library | License | +-----------------------------+---------------+--------------------+----------------------+---------+ | binlog | ACTIVE | STORAGE ENGINE | NULL | GPL | | mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL | | mysql_old_password | ACTIVE | AUTHENTICATION | NULL | GPL | | CSV | ACTIVE | STORAGE ENGINE | NULL | GPL | | MRG_MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL | | MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL | | MEMORY | ACTIVE | STORAGE ENGINE | NULL | GPL | | BLACKHOLE | ACTIVE | STORAGE ENGINE | NULL | GPL | | FEDERATED | ACTIVE | STORAGE ENGINE | NULL | GPL | | Aria | ACTIVE | STORAGE ENGINE | NULL | GPL | | InnoDB | ACTIVE | STORAGE ENGINE | NULL | GPL | | XTRADB_READ_VIEW | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | XTRADB_INTERNAL_HASH_TABLES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | XTRADB_RSEG | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_TRX | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_LOCKS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_LOCK_WAITS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMPMEM | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMPMEM_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP_PER_INDEX | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CMP_PER_INDEX_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_BUFFER_PAGE | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_BUFFER_PAGE_LRU | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_BUFFER_POOL_STATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_METRICS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_DEFAULT_STOPWORD | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_BEING_DELETED | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_CONFIG | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_INDEX_CACHE | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_FT_INDEX_TABLE | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_TABLES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_TABLESTATS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_INDEXES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_COLUMNS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_FIELDS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_FOREIGN | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_FOREIGN_COLS | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_TABLESPACES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_SYS_DATAFILES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | INNODB_CHANGED_PAGES | ACTIVE | INFORMATION SCHEMA | NULL | GPL | | ARCHIVE | ACTIVE | STORAGE ENGINE | NULL | GPL | | PERFORMANCE_SCHEMA | ACTIVE | STORAGE ENGINE | NULL | GPL | | FEEDBACK | DISABLED | INFORMATION SCHEMA | NULL | GPL | | partition | ACTIVE | STORAGE ENGINE | NULL | GPL | | auth_0x0100 | NOT INSTALLED | AUTHENTICATION | auth_0x0100.so | GPL | | AUDIT_NULL | NOT INSTALLED | AUDIT | adt_null.so | GPL | | unix_socket | NOT INSTALLED | AUTHENTICATION | auth_socket.so | GPL | | simple_parser | NOT INSTALLED | FTPARSER | mypluglib.so | GPL | | test_plugin_server | NOT INSTALLED | AUTHENTICATION | auth_test_plugin.so | GPL | | cleartext_plugin_server | NOT INSTALLED | AUTHENTICATION | auth_test_plugin.so | GPL | | qa_auth_server | NOT INSTALLED | AUTHENTICATION | qa_auth_server.so | GPL | | daemon_example | NOT INSTALLED | DAEMON | libdaemon_example.so | GPL | | qa_auth_interface | NOT INSTALLED | AUTHENTICATION | qa_auth_interface.so | GPL | | InnoDB | NOT INSTALLED | STORAGE ENGINE | ha_innodb.so | GPL | | INNODB_TRX | NOT INSTALLED | INFORMATION SCHEMA | ha_innodb.so | GPL | | INNODB_LOCKS | NOT INSTALLED | INFORMATION SCHEMA | ha_innodb.so | GPL | | INNODB_LOCK_WAITS | NOT INSTALLED | INFORMATION SCHEMA | ha_innodb.so | GPL | | INNODB_CMP | NOT INSTALLED | INFORMATION SCHEMA | ha_innodb.so | GPL | | INNODB_CMP_RESET | NOT INSTALLED | INFORMATION SCHEMA | ha_innodb.so | GPL | | INNODB_CMPMEM | NOT INSTALLED | INFORMATION SCHEMA | ha_innodb.so | GPL | | INNODB_CMPMEM_RESET | NOT INSTALLED | INFORMATION SCHEMA | ha_innodb.so | GPL | | INNODB_CMP_PER_INDEX | NOT INSTALLED | INFORMATION SCHEMA | ha_innodb.so | GPL | | INNODB_CMP_PER_INDEX_RESET | NOT INSTALLED | INFORMATION SCHEMA | ha_innodb.so | GPL | | INNODB_BUFFER_PAGE | NOT INSTALLED | INFORMATION SCHEMA | ha_innodb.so | GPL | | INNODB_BUFFER_PAGE_LRU | NOT INSTALLED | INFORMATION SCHEMA | ha_innodb.so | GPL | | INNODB_BUFFER_POOL_STATS | NOT INSTALLED | INFORMATION SCHEMA | ha_innodb.so | GPL | | INNODB_METRICS | NOT INSTALLED | INFORMATION SCHEMA | ha_innodb.so | GPL | | INNODB_FT_DEFAULT_STOPWORD | NOT INSTALLED | INFORMATION SCHEMA | ha_innodb.so | GPL | | INNODB_FT_DELETED | NOT INSTALLED | INFORMATION SCHEMA | ha_innodb.so | GPL | | INNODB_FT_BEING_DELETED | NOT INSTALLED | INFORMATION SCHEMA | ha_innodb.so | GPL | | INNODB_FT_CONFIG | NOT INSTALLED | INFORMATION SCHEMA | ha_innodb.so | GPL | | INNODB_FT_INDEX_CACHE | NOT INSTALLED | INFORMATION SCHEMA | ha_innodb.so | GPL | | INNODB_FT_INDEX_TABLE | NOT INSTALLED | INFORMATION SCHEMA | ha_innodb.so | GPL | | INNODB_SYS_TABLES | NOT INSTALLED | INFORMATION SCHEMA | ha_innodb.so | GPL | | INNODB_SYS_TABLESTATS | NOT INSTALLED | INFORMATION SCHEMA | ha_innodb.so | GPL | | INNODB_SYS_INDEXES | NOT INSTALLED | INFORMATION SCHEMA | ha_innodb.so | GPL | | INNODB_SYS_COLUMNS | NOT INSTALLED | INFORMATION SCHEMA | ha_innodb.so | GPL | | INNODB_SYS_FIELDS | NOT INSTALLED | INFORMATION SCHEMA | ha_innodb.so | GPL | | INNODB_SYS_FOREIGN | NOT INSTALLED | INFORMATION SCHEMA | ha_innodb.so | GPL | | INNODB_SYS_FOREIGN_COLS | NOT INSTALLED | INFORMATION SCHEMA | ha_innodb.so | GPL | | INNODB_SYS_TABLESPACES | NOT INSTALLED | INFORMATION SCHEMA | ha_innodb.so | GPL | | INNODB_SYS_DATAFILES | NOT INSTALLED | INFORMATION SCHEMA | ha_innodb.so | GPL | +-----------------------------+---------------+--------------------+----------------------+---------+ 85 rows in set (0.18 sec)
MariaDB10.0系でサポートしているAuditプラグインやPAMプラグインはなく、期待していたHandlerSocketプラグインもありませんでした。今後のバージョンアップやサポートを期待したいところです。執筆時点のRDSのMariaDBでは、MySQL 5.6 の memcached サポートの様にDBOptionGroupによるプラグインの有効化のようなカスタマイズの余地がありません。
MySQLからの移行
公式マニュアルでは、Amazon RDS MariaDB インスタンスに初期データをインポートする方法と、レプリケーションを設定して継続的にデータをインポートするための推奨方法の詳細について説明します。
Amazon RDS MariaDB インスタンスにインポートする方法
既存の MySQL データベースから Amazon RDS MariaDB DB インスタンスにデータをインポートする最も簡単な方法は、mysqldump を使用してデータベースをコピーし、MariaDB インスタンスに直接パイプ処理する方法です。
sudo mysqldump -u <local_user> --databases world --single-transaction --compress --order-by-primary -p<local_password> | mysql -u <RDS_user_name> --port=3306 --host=hostname -p<RDS_password>
レプリケーションを設定して継続的にデータをインポートするは、MySQL DB または MariaDB DB から Amazon RDS MySQL または MariaDB DB インスタンスへのデータのインポート を参照してください。
最後に
DBインスタンスの作成や接続はMySQLとほとんど変わりません。Aamzon RDS for MySQLのDBインスタンスの作成や接続したことのある方であれば、全く違和感なく操作できるはずです。MariaDBのJDBCドライバはAmazon RDS for Auroraのドライバも兼ねており、MariaDBとAuroraのシナジーも期待できます。オープンでフレンドリーなデータベースを活用したいと思います。