2015-12-16
■[MySQL][MongoDB] 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 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[運用+管理]トラブルシューティングガイド
- 作者: 奥野幹也
- 出版社/メーカー: 技術評論社
- 発売日: 2010/06/12
- メディア: 大型本
- 購入: 16人 クリック: 204回
- この商品を含むブログ (34件) を見る
稲川淳二 真相・恐怖の現場 本当の恐怖をナメてはいけない編 [DVD]
- 出版社/メーカー: ハピネット・ピーエム
- 発売日: 2013/08/02
- メディア: DVD
- この商品を含むブログ (2件) を見る
- 作者: Kyle Banker,Sky株式会社玉川竜司
- 出版社/メーカー: オライリージャパン
- 発売日: 2012/12/14
- メディア: 大型本
- 購入: 5人 クリック: 55回
- この商品を含むブログ (8件) を見る
- 14 http://b.hatena.ne.jp/
- 11 https://t.co/p9wTFNSGPF
- 5 https://www.facebook.com/
- 4 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CCAQFjAA&url=http://d.hatena.ne.jp/akuwano/20151216/1450273160&ei=8m5xVvruCfua8ALXfw&usg=AFQjCNGkJg8VWMIfhQiCAXer7KANL-325A
- 4 https://www.google.co.jp/
- 3 http://htn.to/gTnFEG
- 3 http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CDQQFjAF&url=http://goo.gl/7lvFRA&ei=f2pxVpuEDfbG4AS1Jw&usg=AFQjCNG820IQwwUJ_bOmdaduN43iGjDUGw
- 3 https://www.facebook.com
- 2 http://b.hatena.ne.jp/entrylist/it/技術ブログ
- 2 http://htn.to/cfZH5mye