MySQL5.7 からMariaDB 10.0に移行しました

RedHatもMySQLからMariaDBに移行する

bigwave既にFedoraやopenSUSEなどのディストリビューションは、MySQLからMariaDBへ移行していたのですが(移行は強制ではなく、MySQLもオプションのパッケージとして標準レポジトリには登録されています)、昨日になって、Red Hat Enterprise Linux 7でもMySQLに代えてMariaDBを採用というニュースも飛び込んできました。RHEL7でMariaDBが採用されるということは、そのクローンであるCentOSでもMariaDBが標準になっていくと思われます。Linux界隈の流れは明らかにMariaDBに向かっています。「世界的ですもんね。乗るしかない!このビッグウェーブに!」ということで、自宅サーバーもMariaDBへ移行させることにしました。

自宅のMySQL使用状況

私の自宅サーバーは、openSUSE 12.3の拡張レポジトリを使って、つい最近に開発版としてリリースされたMySQL5.7をパッケージインストールしていました。MySQLの用途は主にWordPressとRedmineです。WordPressはRedisと連携させてメモリキャッシュ機構を利用しています(Nginxのプロキシキャッシュも使っています)。メモリは32GBで、このメモリサイズに最適化するようにmy.cnfやRedisの設定値を調整しています。この環境でMariaDBに移行できるか試してみることにしました。

MariaDBとは何か

MariaDBをご存じない方に説明しておくと、MariaDBはMySQLからフォークされて開発が進んでいるMySQLとの完全互換のRDBMSです。フォークしたのは、MySQLのオリジナルコードの作者でMySQL ABの創設者のMichael Monty Widenius氏。Oracle主導で開発されているMySQLは、かなりOracleの影響力が強く、コミュニティ主導というよりエンタープライズ志向で、閉鎖的な面が強いです。最近の開発状況を見ても、コミュニティサイドからは「MySQL大丈夫なんかい!?」と不安視する声が出ていて、それがMariaDBへの移行の背景になっているようです。

日本だと手嶋屋主導で開発が進められているopenPNEや、ロックオン主導で開発が進められているEC CUBEへの、コミュニティの反発とメンタリティ的には通じる面があるかもしれません。もちろん、オープンソースのあり方は企業主導も含めて多様にあって良いと思いますし、MySQLは非常に優れたプロダクトだと思いますが、コミュニティ主導のオープンソースがスタイルとして好きな私は、今回MariaDBに乗ってみることにしました。WikipediaもMySQLからMariaDBへの移行を実施しています。

MariaDBは、現在5.5と10.0の2つのバージョンがあります。MariaDB5.5はMySQL5.5と完全互換のものです。MariaDB10.0は、MySQL5.6との互換性と更にいくつかの新機能を搭載している開発版です。新しい開発版が好きな私はMariaDB10.0をインストールすることにしましたw  ただ、私の自宅サーバーはMySQL5.7の開発版で既に運用しているため、実質的にはダウングレードという形になります。マニアックな環境ですみません。

MySQLからMariaDBへの移行手順

トライ&エラーでハックするには、何はともあれバックアップ。まず、現在のMySQL5.7をmysqldumpでフルバックアップを取りました。また、/etc/my.cnfのバックアップを取り、MySQLを停止させた後で/var/lib/mysqlのホットコピーを取りました。

その後、/var/lib/mysql配下のファイルや/etc/my.cnfは残したままで、素の状態のままパッケージ入れ替えでMariaDB10.0に移行できるか試してみました。openSUSEなので、YaSTでMySQL5.7関連のパッケージを削除して、MariaDBのパッケージをインストールしました。インストール後に、/etc/init.d/mysqlの起動スクリプトが再作成されていることを確認し、起動させてみました。最初は起動失敗。どうも/etc/my.cnfが上書きされていたようです。そこでバックアップから/etc/my.cnfを引っ張りだしてきて適用させました。

すると起動には成功しました。起動後、MySQLプロンプトに入ると、これがMariaDBであることのWelcomeメッセージが出ました。

Welcome to the MariaDB monitor.  Commands end with ; or g.
Your MariaDB connection id is 41
Server version: 10.0.3-MariaDB openSUSE package

Copyright (c) 2000, 2013, Oracle, Monty Program Ab and others.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

MariaDB [(none)]

ただ、そこから先が駄目でした…。show databases;でデータベースが見えるのですが、テーブル定義が見えず、SELECT文なども失敗します。

MariaDB [blog]/</ select * from wp_users;
ERROR 1033 (HY000): Incorrect information in file: './blog/wp_users.frm'

どうもテーブル定義の*.frmファイルが、MySQL5.7とMariaDB10.0では違う様子。mysql_upgradeも試したのですが成功しませんでした。素のままの移行って実質ダウングレードだし無理だったのかなと思って、drop databaseでデータベースの消去を行ったのですが、drop databaseすらも成功せず、結局/var/lib/mysql配下のデータベースディレクトリを削除することで、データベースを削除しました。

MariaDB [(none)]/</ drop database redmine;
ERROR 1010 (HY000): Error dropping database (can't rmdir './redmine/', errno: 17 "File exists")</code></pre>

気を取り直してダンプファイルからインポート

全てのデータベースを削除してクリアになった段階で、気を取り直してmysqldumpでダンプしたデータをMariaDBに投入する作業を行いました。そうすると、途中でエラー発生。

ERROR 1911 (HY000) at line 1191: Unknown option 'STATS_PERSISTENT'

ダンプファイルにあるSTATS_PERSISTENTという箇所がMariaDBにはないようです。STATS_PERSISTENTってあまり馴染みがなかったのですが、MySQL5.6から搭載されたテーブル定義の要素らしい。ダンプファイルでSTATS_PERSISTENT=0となっている部分を全てvimで置換して、再度流し込み作業を行いました。DBインポート成功!WordPressもRedmineも正常に稼働しています。WordPress + Redis連携によるキャッシュも正常動作しているようで、ひと安心しました。

今回、MySQL5.7(開発版)からMariaDB10.0(MySQL5.6相当)というケースだったのでトラブルが多かったのかもしれません。MySQL5.6からMariaDB10.0または、MySQL5.5からMariaDB5.5だったら、もっとスムーズに移行できたのかと思います。とりあえず今日からMariaDBとのお付き合いが始まりました。色々ベンチマークを取ったり、レプリケーションを構成させたり、デュアルマスター構成をさせたりして、MySQLと色々比較してみます!