256bitの殺人メニュー

インフラエンジニアだったソリューションアーキテクトなくわののブログ。こちらのBlogは個人の意見となっていて会社とは全く関係ありません。お約束です。[twitter:@kuwa_tw]めんどくさがりが重い腰を上げて何かをアウトプットすることにどれほどの意味があるのかを試してみたいブログでもある。

MongifyでMySQLからMongoDBへの移行しちゃう

このエントリは、MySQL Casual Advent Calendar 2015 16日目のエントリです。
※このエントリは個人の見解であり、所属する組織の公式見解ではありません


どうもどうも乙カレー様です。桑野です。
前回は、このようなブログを書いてアレだったわけですが、さて今回こそはちゃんとブログ書こうと思ってアドベントカレンダーのページ見なおしたらなんか書いてあるんですよね。



またかよ。MySQLだっつってんだろ。
ということで何書こうかなと思ってたんですが、ネタ記事としてMongifyというRubyのプロダクトでMySQLからMongoDBへの移行しちゃうのをやろうかと思います。
誰得なのかということであれば俺得です(∗ᵒ̶̶̷̀ω˂̶́∗)੭₎₎̊₊♡ウケトレィ!


今度こそ怒られないかな、、、(;´Д`)ハァハァ

ちゅーわけでテストテーブル作ってみる。

まずは移行元のMySQLにテーブル作ってみましょ。
適当にインストールから。

apt-get install mysql-server mysql-client
apt-get install libmysqlclient-dev
apt-get install mongodb
mysql> CREATE DATABASE d1;
mysql> use d1
mysql>  CREATE TABLE t1 (
   id INT PRIMARY KEY AUTO_INCREMENT,
   name VARCHAR(20),
   nosql VARCHAR(30),
   price INT UNSIGNED,
   created_at DATETIME
 );
mysql>  INSERT INTO t1 (name, nosql, price, created_at)
   VALUES ("kuwa_tw", "mongodb", 10, now());
mysql> INSERT INTO t1 (name, nosql, price, created_at)
   VALUES ("oranie", "cassandra", 100, now());
mysql> INSERT INTO t1 (name, nosql, price, created_at)
   VALUES ("kakky_h", "hbase", 1000, now());
mysql> INSERT INTO t1 (name, nosql, price, created_at)
   VALUES ("la_luna_azul", "riak", 1500, now());
mysql> INSERT INTO t1 (name, nosql, price, created_at)
   VALUES ("saeoshi", "voldemote", 2000, now());
mysql> SELECT * FROM t1;
+----+--------------+-----------+-------+---------------------+
| id | name         | nosql     | price | created_at          |
+----+--------------+-----------+-------+---------------------+
|  1 | kuwa_tw      | mongodb   |    10 | 2015-12-16 13:04:10 |
|  2 | oranie       | cassandra |   100 | 2015-12-16 13:04:17 |
|  3 | kakky_h      | hbase     |  1000 | 2015-12-16 13:04:29 |
|  4 | la_luna_azul | riak      |  1500 | 2015-12-16 13:04:34 |
|  5 | saeoshi      | voldemote |  2000 | 2015-12-16 13:04:38 |
+----+--------------+-----------+-------+---------------------+
5 rows in set (0.00 sec)

ほいできました。

Mongifyのインストール

Rubyはなんか適当なのでいいけど、2.2.3でやりました。(割愛)
Gemで以下のものをインストール。

gem install bundler
gem install json_pure
gem install activerecord-mysql-adapter
gem install mongify

Mongifyの実行

設定ファイルの作成

接続情報を書いたファイルをdatabase.configとして保存

cat <<'EOF' >./database.config
sql_connection do
  adapter   "mysql"
  host      "localhost"
  username  "root"
  password  "passw0rd"
  database  "d1"
end

mongodb_connection do
  host      "localhost"
  database  "d1"
end
EOF

チェック、worksになったらOK

$ mongify check database.config
SQL connection works
NoSQL connection works
既存のMySQLデータベースの情報を取得


translationコマンドでtranslation.rbとして、DBの情報を書き出す

$ mongify translation database.config > translation.rb


こんなのが出ました。

$ cat translation.rb
table "t1" do
        column "id", :key, :as => :integer
        column "name", :string
        column "nosql", :string
        column "price", :integer
        column "created_at", :datetime
end
MongoDBデータベースへのマイグレーション

processコマンドでマイグレーション

$ mongify process database.config translation.rb
Copying t1 (1/1):                             (5/5) 100% |oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo| Time: 00:00:00
Updating References t1:                       (5/5) 100% |oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo| Time: 00:00:00
Removing pre_mongified_id t1:                 (1/1) 100% |oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo| Time: 00:00:00


みてみませう。

$ echo 'db.t1.find()' | mongo d1
MongoDB shell version: 2.4.9
connecting to: d2
{ "_id" : ObjectId("567164b57609613c3d000001"), "created_at" : ISODate("2015-12-16T13:04:10Z"), "name" : "kuwa_tw", "nosql" : "mongodb", "price" : 10 }
{ "_id" : ObjectId("567164b57609613c3d000002"), "created_at" : ISODate("2015-12-16T13:04:17Z"), "name" : "oranie", "nosql" : "cassandra", "price" : 100 }
{ "_id" : ObjectId("567164b57609613c3d000003"), "created_at" : ISODate("2015-12-16T13:04:29Z"), "name" : "kakky_h", "nosql" : "hbase", "price" : 1000 }
{ "_id" : ObjectId("567164b57609613c3d000004"), "created_at" : ISODate("2015-12-16T13:04:34Z"), "name" : "la_luna_azul", "nosql" : "riak", "price" : 1500 }
{ "_id" : ObjectId("567164b57609613c3d000005"), "created_at" : ISODate("2015-12-16T13:04:38Z"), "name" : "saeoshi", "nosql" : "voldemote", "price" : 2000 }
bye

こうなったら成功です。


どうでしょう。はいっております。ぼくのシェルスクリプトと違って綺麗ですね。綺麗。
ということでありまして、MySQLからMongoDBに移行したい、なんていう珍しい方がおりましたら是非こんな感じで試してみてはいかがでしょうか。


ただし責任は取れませんが、、、(怪談的な終わり方)(今年もかよ)



エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド

エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド



MongoDBイン・アクション

MongoDBイン・アクション