隔週連載groonga

第7回 [実録] MySQL向け全文検索エンジン「Tritonn」から「mroonga」への移行ガイド(2)

この記事を読むのに必要な時間:およそ 7.5 分

MySQL 5.0からMySQL 5.6へのデータマイグレーション(前編)

MySQL 5.0からMySQL 5.6へのデータマイグレーションの手順については前述の通りです。ステップを追って進めていきます。

移行時に使うサーバとその使い分け

CentOS 6.4(X86_64)のサーバを2台,次の使い分けで作業サーバとします。

  • MySQL 5.0用の作業サーバ
  • MySQL 5.6用の作業サーバ

MySQL 5.0 のインストール

MySQL 5.0用の作業サーバへ,SourceForgeのTritonnバイナリ配布ページより必要ファイルを入手の上,yum localinstallコマンドでインストールします。

インストール後,必要に応じて/etc/my.cnfの書き換えを行います。

yum localinstall \
  mecab-0.98-tritonn.1.0.12a.x86_64.rpm \
  mecab-ipadic-2.7.0.20070801-tritonn.1.0.12a.x86_64.rpm \
  senna-1.1.4-tritonn.1.0.12a.x86_64.rpm \
  MySQL-shared-5.0.87-tritonn.1.0.12a.x86_64.rpm \
  MySQL-client-5.0.87-tritonn.1.0.12a.x86_64.rpm \
  MySQL-server-5.0.87-tritonn.1.0.12a.x86_64.rpm \
  MySQL-devel-5.0.87-tritonn.1.0.12a.x86_64.rpm

MySQL 5.6 のインストール

MySQL 5.6用の作業サーバへ,オラクルが配布している公式rpmを用いて,yum installコマンドでインストールします。なお,まだこの段階ではmroongaを使いません。次回,MySQL 5.6用のrpmパッケージのビルド方法を紹介します。インストール後,必要に応じて/etc/my.cnfの書き換えを行います。

$ sudo yum install \
  http://cdn.mysql.com/Downloads/MySQL-5.6/MySQL-shared-compat-5.6.12-1.el6.x86_64.rpm \
  http://cdn.mysql.com/Downloads/MySQL-5.6/MySQL-shared-5.6.12-1.el6.x86_64.rpm \
  http://cdn.mysql.com/Downloads/MySQL-5.6/MySQL-client-5.6.12-1.el6.x86_64.rpm
  http://cdn.mysql.com/Downloads/MySQL-5.6/MySQL-server-5.6.12-1.el6.x86_64.rpm \
  http://cdn.mysql.com/Downloads/MySQL-5.6/MySQL-devel-5.6.12-1.el6.x86_64.rpm

MySQL 5.0用の作業サーバへデータを投入する(プロダクション環境サーバでの作業)

まずはプロダクション環境サーバでの作業での作業を行います。Tritonn依存のないスキーマに変更するために,MySQL 5.0用の作業サーバへプロダクション環境のデータを複製します。何かしらの方法で数時間オフラインにできるサーバを確保してから,次のようにデータを吸い出します。

なお,問答無用でMySQLのサービスを止めてしまうと,一時テーブルが消失してレプリケーションエラーが発生することがあります。そのため,Slave_open_temp_tablesの値を確認しながらの作業を行います。こちらの詳細はMySQL公式ドキュメントレプリケーションとテンポラリ テーブルを参照ください。

-- レプリケーションを一時的に停止する
stop slave;

-- slave_open_tmp_tablesが0であることを確認する
mysql> show status like 'Slave_open_temp_tables';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| Slave_open_temp_tables | 0     |
+------------------------+-------+
1 row in set (0.00 sec)

-- もしslave_open_tmp_tablesが0でない場合には,気長に0となるまで以下を繰り返す
start slave;
stop slave;
show status;

レプリケーションを止めることができたら,続けてMySQLのサービスを停止し,MySQLのデータディレクトリを,MySQL 5.0作業マシンへscpなどで転送します。

# レプリケーションのポジションを確認し,メモしましょう
# 必要になる値は, Master_Log_File と Exec_Master_Log_Pos の2つ
# MySQL 5.6用の作業サーバでレプリケーション開始する際に必要となる
$ mysql -uroot -p -e "SHOW SLAVE STATUS\G"

# 安全にレプリケーションを停止できたら,MySQLのサービスを停止する
$ sudo /etc/init.d/mysql stop

# 何らかの方法でMySQLの設定ファイルとデータをMySQL 5.0作業マシンへコピーする
$ sudo scp -p /etc/my.cnf ユーザ名@MySQL 5.0用の作業サーバIP:/tmp/
$ sudo scp -rp /var/lib/mysql ユーザ名@MySQL 5.0用の作業サーバIP:/tmp/mysql

# MySQL 5.0作業マシンへのファイル転送が完了したら,MySQLサービスを開始する
$ sudo /etc/init.d/mysql start

# 起動後,レプリケーションがこれまで通りに動いていることを確認する
$ mysql -uroot -p -e "SHOW SLAVE STATUS\G"

MySQL 5.0用の作業サーバへデータを投入する(MySQL 5.0作業マシンでの作業)

プロダクション環境サーバからのコピーが完了したら,MySQL 5.0作業マシンでの作業を始めます。必要ファイルをそれぞれ配置した後,MySQLサービスを開始します。

# もしMySQLが起動していたらサービスを停止する
/etc/init.d/mysql stop

# デフォルトで生成されているデータディレクトリがあれば,移動ないし削除を行う
$ sudo mv /var/lib/mysql /var/lib/mysql-default

# プロダクション環境よりコピーしてきたデータを配置し,mysqlユーザで読み書きできるようにする
$ sudo mv /tmp/mysql /var/lib/mysql
$ sudo chown -R mysql:mysql /var/lib/mysql

# プロダクション環境よりコピーしてきた設定ファイルを配置する
$ sudo mv /tmp/my.cnf /etc/my.cnf

# レプリケーションのポジション情報が変わることを防ぐため,
# 起動時にレプリケーションが動かないようにする設定を追加する
# mysqldセクションにskip-slave-startと記入する
$ sudo vi /etc/my.cnf 

# 設定が済みましたら,MySQLサービスを起動する。
# 心配な場合には,起動前に/var/lib/mysqlのバックアップをとっても良い
$ sudo /etc/init.d/mysql start

# 起動後,レプリケーションが停止状態になっていることを確認する
# 具体的には,Slave_IO_RunningとSlave_SQL_Runningが共にNoであることを確認する
$ mysql -uroot -p -e "SHOW SLAVE STATUS\G" | grep Running

Tritonn依存のないスキーマに変更する

Tritonn依存のスキーマがない状態になってはじめて,MySQL 5.6用の作業サーバへデータの流し込みができるようになります。ここでは,FULLTEXTインデックスを一旦除去するためのDROP INDEX文を作成します。

それでは,MySQL 5.0用の作業サーバにて,mysqldumpコマンドを利用してスキーマを取り出します。なお,このファイルは後ほどスキーマをmroonga対応にする際にも利用しますので,消さずに保管しましょう。

# 次のようにデータベース毎にスキーマをmysqldumpで取得する
$ mysqldump -uroot -p --no-data --triggers \
  --routines データベース名 > /path/to/データベース名.sql

書き出したSQLファイルの中に,"FULLTEXT"という行を持つテーブルをリストアップしましょう。今回はそれらテーブルを対象に,ALTER TABLEクエリを作成していきます。

このスキーマで作られたテーブルを例に説明します。

CREATE TABLE search_fulltext (
  id INT,
  content TEXT,
  FULLTEXT INDEX ft USING MECAB, NORMALIZE (content)
) ENGINE=MyISAM DEFAULT CHARSET utf8;

ftという名前でフルテキストインデックスが作られているため,次のクエリでTritonn依存のインデックスを削除できます。同様にその他のテーブルに関しても確認を行い,MySQL 5.0用の作業サーバにてそれぞれ実行します。

ALTER TABLE search_fulltext DROP INDEX ft;

MySQL 5.0のSQLダンプを作成

先ほどの作業により,MySQL 5.0用の作業サーバにあるデータからTritonn依存のスキーマはなくなりました。ようやく,MySQL 5.0用の作業サーバよりmysqldumpコマンドを用いてデータベース毎に吸い出すことができます。

早速MySQL 5.6用の作業サーバにて,次のようにmysqldumpを行います。

$ mysqldump -h MySQL5.0サーバのIP -u root -p --quick --no-data \
  --triggers --routines --order-by-primary --no-autocommit \
  --set-gtid-purged=OFF データベース名 > /path/to/データベース名.sql

なお,MySQL 5.6からの新しいオプション--set-gtid-purged=OFFは,MySQL 5.6以下のGTID非対応のMySQLからデータをダンプする際に必要になるオプションです。

SQLダンプをMySQL 5.6へインポート

先ほどの作業で吸い出したSQLダンプデータを,MySQL 5.6用の作業サーバへ流し込みます。

# データベースを作成する
$ mysql -uroot -p -e "CREATE DATABSE データベース名"

# ダンプデータを流し込む
$ mysql -uroot -p DB < /path/to/データベース名.sql

MySQL 5.6にてレプリケーションを開始

“MySQL 5.0用の作業サーバへデータを投入する(プロダクション環境サーバでの作業)"にてメモを行った,Master_Log_FileExec_Master_Log_Pos を利用し,CHANGE MASTER構文を作ります。

CHANGE MASTER TO
  MASTER_HOST = 'レプリケーションマスタのIP',
  MASTER_USER = 'レプリケーションユーザ',
  MASTER_PASSWORD = 'レプリケーションパスワード',
  MASTER_LOG_FILE = 'Master_Log_Fileの値',
  MASTER_LOG_POS = Exec_Master_Log_Posの値;

CHANGE MASTER文の準備ができたらいよいよ,レプリケーションの開始です。

-- CHANGE MASTERで登録した内容が期待通り反映されていることを確認する
SHOW SLAVE STATUS\G

-- レプリケーションを開始する
START SLAVE;

-- Slave_IO_RunningとSlave_SQL_Runningが共にYesとなっていれば問題ない
SHOW SLAVE STATUS\G

これで無事,MySQL 5.0の下にMySQL 5.6をスレーブとして追加する,MySQL 5.0と5.6の混在レプリケーションが完了しました。

今回はここまでとし,この続きは次回となります。

まとめと次回予告

次回はいよいよ本プロジェクトの大詰めとなります。 次のトピックをお届けする予定です。乞うご期待!

  • Tritonnからmroongaへのスキーマ書き換えガイド
  • Tritonnからmroongaへの全文検索クエリ書き換えガイド
  • CentOS 6+MySQL 5.6環境で動くmroongaのrpmパッケージ構築方法

groongaの利用事例を寄稿しませんか

連載の目的は「読者の皆さんがgroongaを使いたくなる!」ことです。そこで,すでにgroongaを使っており,groongaの利用事例を本連載で紹介していただける人を募集します。募集要項を参考にご連絡ください。お待ちしています!

週刊groonga on Qiita

もっとmroongaを知りたくなったらQiitaにあるmroonga情報もチェックしてみてください。毎週木曜日にgroonga関連情報を提供しています。

著者プロフィール

吉田健太郎(Kentaro Yoshida)

株式会社リブセンス,Web系インフラの研究開発エンジニア。

ITベンチャー立ち上げに参画し,幅広い領域での経験を積むこと8年目。フルスタックエンジニアを目指して,湧き出るアイディアを形にする日々を過ごしている。

GitHub:https://github.com/y-ken/
ブログ:http://y-ken.hatenablog.com/