これってRDBMSでなくても良いんでは?みたいなテーブルがあったとして
じゃあNoSQLにデータ突っ込んでみて、パフォーマンスとか使い勝手を、ささっと検証してみたいな、というときのデータ移行のアイディアメモ
- RDBMS=MySQL
- NoSQL=MongoDB
mysqlデータイメージ
| id | name1 | name2 | name3 |
| 10 | あああああ | いいいいい | ううううう |
↑このテーブルを↓こんな感じに移行したい
mongodbデータイメージ
> db.table_name.findOne();
{
"_id" : ObjectId("56e0f29de1382344d936be92"),
"id" : "10",
"name1" : "あああああ",
"name2" : "いいいいい",
"name3" : "ううううう"
}
移行用の簡易PG(PHP7)
<?php
// MongoDB接続
$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
// MySQL接続
$mysqli = new mysqli('localhost', 'user_name', 'password', 'db_name');
// カウンタ
$start = 0;
$limit = 1000; //{$limit}件ずつでcommit的な
while ($cnt > 0) {
$query = "SELECT * FROM table_name LIMIT " . $start . ", " . $limit;
if ($result = $mysqli->query($query)) {
$bulk = new MongoDB\Driver\BulkWrite;
while ($obj = $result->fetch_assoc()) {
$bulk->insert($obj);
}
$manager->executeBulkWrite('db_name.table_name', $bulk);
}
$result->free();
$cnt = $cnt - $limit;
$start = $start + $limit;
}
$mysqli->close();
?>
(注意)
* PHP7はMongoDBのExtensionの関数名とか使い方とか旧バージョンと変わってる
* 当方、MongoDBあまり触ったことないです。close処理とか大量データのbulk処理は適当
* ちゃんとした書き方は追って勉強する
* 上記PGでひとまず目的は達成できた。mbp上に作ったVM環境で、100万件の移行が10分程度