WordPressのデータベースをMySQL v5.5からMariaDB v10へ移行

MariaDB Galera Cluster が v10 になり、1ノードからデプロイが可能で後からノード追加が可能でしかもマルチマスタ構成なので MySQL Cluster (5.5.27-ndb-7.2.8-cluster-gpl MySQL Cluster Community Server (GPL)) から移行することにした。とはいっても互換性があるため WordPress のプラグイン BackWPup や mysqldump コマンドを利用して取得したバックアップをそのままインポートするだけでデータベース部分の移行は完了する。
Webサーバ側もデータ移行後、wp-config.php の DB_HOST 変数の IP アドレスを MariaDB のものに変更するだけで問題ありませんでした。

今回は、Lubuntu 14.04 LTS を利用して MariaDB Galera Cluster の初期ノードをセットアップし、既存データの移行までを行います。

既存データのバックアップ

WordPress が稼働中の場合には BackWPup というプラグインが簡単です。赤枠クリックするだけで .sql 形式でダウンロードされます。
WordPress が稼動しておらず、既存の MySQL DB サーバ上でバックアップを取得したい場合には以下のような mysqldump コマンドで .sql 形式で出力することができます。お好みでどうぞ。

mysqldump を利用する場合

$ mysqldump -u root blog.neoflow.jp > blog.neoflow.jp.sql

BackWPup プラグインを利用する場合

BackWPup

データベースのバックアップをダウンロード

MariaDB Galera Cluster のインストール

普通の MariaDB に移行する場合は mariadb-galera-server-10.0 ではなく mariadb-server パッケージをインストールすれば OK です。
※リポジトリは Ubuntu または Lubuntu 14.04 用です。他のディストリビューション向けも用意されていますので公式サイトの記述を確認してください。

$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db
$ sudo add-apt-repository 'deb http://ftp.yz.yamagata-u.ac.jp/pub/dbms/mariadb/repo/10.0/ubuntu trusty main'
$ sudo apt-get update
$ sudo apt-get install mariadb-galera-server-10.0

リモートからの接続を許可しておきます。Lubuntu 14.04 では bind-address がループバックアドレス指定になっているのでこれをコメントしておけば OK です。

$ sudo vi /etc/mysql/my.cnf
     44 #
     45 # Instead of skip-networking the default is now to listen only on
     46 # localhost which is more compatible and is not less secure.
     47 #bind-address           = 127.0.0.1
     48 #

MariaDB Galera Cluster の初期設定と起動確認

自動で mysqld が起動するがクラスタの初期ノードにはなっていない。スタンドアロン状態で起動する。この状態で SHOW STATUS LIKE ‘wsrep_%’; を打ってみる。

$ mysql -uroot -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 43
Server version: 10.0.21-MariaDB-1~trusty-wsrep-log mariadb.org binary distribution, wsrep_25.10.r4144
 
Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
MariaDB [(none)]> SHOW STATUS LIKE 'wsrep_%';
+--------------------------+----------------------+
| Variable_name            | Value                |
+--------------------------+----------------------+
| wsrep_cluster_conf_id    | 18446744073709551615 |
| wsrep_cluster_size       | 0                    |
| wsrep_cluster_state_uuid |                      |
| wsrep_cluster_status     | Disconnected         |
| wsrep_connected          | OFF                  |
| wsrep_local_bf_aborts    | 0                    |
| wsrep_local_index        | 18446744073709551615 |
| wsrep_provider_name      |                      |
| wsrep_provider_vendor    |                      |
| wsrep_provider_version   |                      |
| wsrep_ready              | ON                   |
| wsrep_thread_count       | 0                    |
+--------------------------+----------------------+
12 rows in set (0.00 sec)

クラスタ用の設定追加後 mysqld を一旦停止してから初期ノードとして起動

以下の内容で /etc/mysql/conf.d/galera.cnf を新規に作成します。binlog_format=ROW の指定は必須です。

[mysqld]
binlog_format=ROW
# MariaDB Galera Cluster 10.x settings
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_name="galera_cluster"
wsrep_cluster_address="gcomm://192.168.202.93,192.168.202.92"
wsrep_sst_method=rsync
$ sudo /etc/init.d/mysql stop
 * Stopping MariaDB database server mysqld                                                                   [ OK ] 
$ sudo mysqld --wsrep-new-cluster
150823 21:45:22 [Note] mysqld (mysqld 10.0.21-MariaDB-1~trusty-wsrep-log) starting as process 7335 ...

初期ノード起動確認

以下2つのコマンドがお決まりのようです。cluster size が 1 に、wsrep_cluster_status が Primary になっていることを確認します。

SELECT VARIABLE_VALUE as "cluster size" FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME="wsrep_cluster_size";
SHOW STATUS LIKE 'wsrep_%';
$ sudo mysql -uroot -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 50
Server version: 10.0.21-MariaDB-1~trusty-wsrep-log mariadb.org binary distribution, wsrep_25.10.r4144
 
Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
MariaDB [(none)]> SELECT VARIABLE_VALUE as "cluster size"  FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE  VARIABLE_NAME="wsrep_cluster_size";
+--------------+
| cluster size |
+--------------+
| 1            |
+--------------+
1 row in set (0.00 sec)
 
MariaDB [(none)]> SHOW STATUS LIKE 'wsrep_%';
+------------------------------+--------------------------------------+
| Variable_name                | Value                                |
+------------------------------+--------------------------------------+
| wsrep_local_state_uuid       | d1bdabba-4994-11e5-a101-6f28db83f829 |
| wsrep_protocol_version       | 7                                    |
| wsrep_last_committed         | 53                                   |
| wsrep_replicated             | 53                                   |
| wsrep_replicated_bytes       | 185336                               |
| wsrep_repl_keys              | 188                                  |
| wsrep_repl_keys_bytes        | 2723                                 |
| wsrep_repl_data_bytes        | 179221                               |
| wsrep_repl_other_bytes       | 0                                    |
| wsrep_received               | 2                                    |
| wsrep_received_bytes         | 148                                  |
| wsrep_local_commits          | 53                                   |
| wsrep_local_cert_failures    | 0                                    |
| wsrep_local_replays          | 0                                    |
| wsrep_local_send_queue       | 0                                    |
| wsrep_local_send_queue_max   | 1                                    |
| wsrep_local_send_queue_min   | 0                                    |
| wsrep_local_send_queue_avg   | 0.000000                             |
| wsrep_local_recv_queue       | 0                                    |
| wsrep_local_recv_queue_max   | 1                                    |
| wsrep_local_recv_queue_min   | 0                                    |
| wsrep_local_recv_queue_avg   | 0.000000                             |
| wsrep_local_cached_downto    | 1                                    |
| wsrep_flow_control_paused_ns | 0                                    |
| wsrep_flow_control_paused    | 0.000000                             |
| wsrep_flow_control_sent      | 0                                    |
| wsrep_flow_control_recv      | 0                                    |
| wsrep_cert_deps_distance     | 11.169811                            |
| wsrep_apply_oooe             | 0.000000                             |
| wsrep_apply_oool             | 0.000000                             |
| wsrep_apply_window           | 1.000000                             |
| wsrep_commit_oooe            | 0.000000                             |
| wsrep_commit_oool            | 0.000000                             |
| wsrep_commit_window          | 1.000000                             |
| wsrep_local_state            | 4                                    |
| wsrep_local_state_comment    | Synced                               |
| wsrep_cert_index_size        | 38                                   |
| wsrep_causal_reads           | 0                                    |
| wsrep_cert_interval          | 0.000000                             |
| wsrep_incoming_addresses     | 10.1.2.93:3306                       |
| wsrep_evs_delayed            |                                      |
| wsrep_evs_evict_list         |                                      |
| wsrep_evs_repl_latency       | 0/0/0/0/0                            |
| wsrep_evs_state              | OPERATIONAL                          |
| wsrep_gcomm_uuid             | d1bc55dd-4994-11e5-966c-179d97d5f43d |
| wsrep_cluster_conf_id        | 1                                    |
| wsrep_cluster_size           | 1                                    |
| wsrep_cluster_state_uuid     | d1bdabba-4994-11e5-a101-6f28db83f829 |
| wsrep_cluster_status         | Primary                              |
| wsrep_connected              | ON                                   |
| wsrep_local_bf_aborts        | 0                                    |
| wsrep_local_index            | 0                                    |
| wsrep_provider_name          | Galera                               |
| wsrep_provider_vendor        | Codership Oy     |
| wsrep_provider_version       | 3.9(rXXXX)                           |
| wsrep_ready                  | ON                                   |
| wsrep_thread_count           | 2                                    |
+------------------------------+--------------------------------------+
57 rows in set (0.00 sec)
 
MariaDB [(none)]> quit

DB初期設定と既存データのインポート

初期ノードとして起動しましたので、移行先としてデータベースの作成とWordPress接続ユーザに権限を与えておきます。バックアップしておいた sql は source コマンドでインポートします。

$ sudo mysql -uroot -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 50
Server version: 10.0.21-MariaDB-1~trusty-wsrep-log mariadb.org binary distribution, wsrep_25.10.r4144
 
Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.
 
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
 
MariaDB [(none)]> create database `blog.neoflow.jp`;
Query OK, 1 row affected (0.00 sec)
 
MariaDB [(none)]> grant all privileges on `blog.neoflow.jp`.* to `wpuser`@`10.1.0.0/255.255.0.0` identified by 'PASSWORD' with grant option;
Query OK, 0 rows affected (0.01 sec)
 
MariaDB [(none)]> use blog.neoflow.jp
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
 
Database changed
MariaDB [blog.neoflow.jp]> source /home/daisuke/blog.neoflow.jp.sql
・・・
 
MariaDB [blog.neoflow.jp]> quit
Bye

wp-config.php の変更

/** MySQL のホスト名 */
define('DB_HOST', '192.168.202.93');

トラブルシューティング

起動したまま初期ノードセットアップをやると・・・

スタンドアロンで mysqld が起動したままでは初期ノードセットアップはできないので、一旦 mysqld を sudo /etc/init.d/mysql stop で停止してから実行しましょう。

$ sudo mysqld --wsrep-new-cluster
150822 15:21:36 [Note] mysqld (mysqld 10.0.21-MariaDB-1~trusty-wsrep-log) starting as process 3709 ...
150822 15:21:36 [ERROR] mysqld: Can't lock aria control file '/var/lib/mysql/aria_log_control' for exclusive use, error: 11. Will retry for 30 seconds
150822 15:22:07 [ERROR] mysqld: Got error 'Could not get an exclusive lock; file is probably in use by another process' when trying to use aria control file '/var/lib/mysql/aria_log_control'
150822 15:22:07 [ERROR] Plugin 'Aria' init function returned error.
150822 15:22:07 [ERROR] Plugin 'Aria' registration as a STORAGE ENGINE failed.
150822 15:22:08 [Note] InnoDB: Using mutexes to ref count buffer pool pages
150822 15:22:08 [Note] InnoDB: The InnoDB memory heap is disabled
150822 15:22:08 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
150822 15:22:08 [Note] InnoDB: Memory barrier is not used
150822 15:22:08 [Note] InnoDB: Compressed tables use zlib 1.2.8
150822 15:22:08 [Note] InnoDB: Using Linux native AIO
150822 15:22:08 [Note] InnoDB: Not using CPU crc32 instructions
150822 15:22:08 [Note] InnoDB: Initializing buffer pool, size = 256.0M
150822 15:22:08 [Note] InnoDB: Completed initialization of buffer pool
150822 15:22:08 [ERROR] InnoDB: Unable to lock ./ibdata1, error: 11
150822 15:22:08 [Note] InnoDB: Check that you do not already have another mysqld process using the same InnoDB data or log files.
150822 15:22:08 [Note] InnoDB: Retrying to lock the first data file
150822 15:22:09 [ERROR] InnoDB: Unable to lock ./ibdata1, error: 11
150822 15:22:09 [Note] InnoDB: Check that you do not already have another mysqld process using the same InnoDB data or log files.
150822 15:22:10 [ERROR] InnoDB: Unable to lock ./ibdata1, error: 11
150822 15:22:10 [Note] InnoDB: Check that you do not already have another mysqld process using the same InnoDB data or log files.
・・・

クラスタノードは binlog_format = ‘ROW’ で

初期ノードセットアップをすると以下のようなメッセージが表示されることがある。これは binlog_format の指定が ROW 以外か、指定がないため。
対応策として、my.cnf の [mysqld] エントリに binlog_format=ROW を指定する。本稿ではクラスタ用の設定は /etc/mysql/conf.d/galera.cnf としてインクルードしています。

$ sudo mysqld --wsrep-new-cluster
150823 21:44:26 [ERROR] WSREP: Only binlog_format = 'ROW' is currently supported. Configured value: 'STATEMENT'. Please adjust your configuration.
150823 21:44:26 [ERROR] Aborting
スポンサーリンク