把MongoDB中的数据复制到MySQL中

我刚刚更新了用于标题的库“Momy”,所以我想趁忘记之前写一篇文章。(更新的主要内容是添加了测试)

由于MongoDB是一种NoSQL文件数据库,所以它没有基本的模式。然而,与CouchDB不同,MongoDB有一个”集合”的概念。因此,虽然有些勉强,但是如果将集合映射为SQL的表,就可以相对容易地实现从MongoDB到MySQL的单向复制。

ff85da46-c732-5794-b7b0-1f9d3fb9d231.png

如果保持 MongoDB 不变,它与 Microsoft Access 和其他办公软件工具的连接会比较困难。但是,如果将数据迁移到 MySQL,就可以使用各种工具和驱动程序。目前,有两个工具可用于从 MongoDB 复制到关系型数据库(RDB)(可能还有其他的)。

ライブラリレプリケーション実装説明MoSQLMongoDB → PostgreSQLRubyStripeが開発。残念ながら2年間メンテナンス停止状態。MomyMongoDB → MySQLNode去年、私がカッとなって作りました。

如果你使用PostgreSQL,可以使用MoSQL。此外,根据使用的目的,还可以考虑选择Apache Drill等工具。

妈妈的安装

可以从npm获取。

$ npm install -g momy

模式配置

虽然是无模式的,但实际上应用程序应该在一定程度上定义了结构。将这个”模式”设置在momyfile.json文件中。基本上,我们需要指定MongoDB(源)和MySQL(目标)数据库,并为每个集合写入字段名和其类型即可。

{
  "src": "mongodb://localhost:27017/myapp",
  "dist": "mysql://root@localhost:3306/myapp",
  "collections": {
    "contacts": {
      "_id": "string",
      "createdAt": "DATETIME",
      "lastName": "string",
      "firstName": "string",
      "code": "number",
      "birthday": "DATE",
      "address.state": "string",
      "address.city": "string",
      "address.street": "string"
    },
    "meetings": {
      "_id": "string",
      "createdAt": "DATETIME",
      "date": "DATE",
      "title": "string",
      "description": "TEXT"
    }
  }
}

指定数据库

将同期源数据库设置为”src”,同步目标数据库设置为”dist”。

“src”: “mongodb://localhost:27017/myapp” 必ずMongoDBを指定

“dist”: “mysql://root@localhost:3306/myapp” 必ずMySQLを指定

数据库的URL遵循以下格式。

データベースの種類://ユーザ名:パスワード@サーバ名:ポート/データベース名

收藏

大致上,就像你所看到的一样,但具体请看附录。

MongoDB的准备工作

母親使用MongoDB的副本集信息。因此,在单机模式下的MongoDB无法进行复制。请按照以下方式启动并开启副本集。

$ mongod --replSet "rs0" --oplogSize 100

从另一个终端打开mongo shell,并初始化副本集(rs.initiate())。请仅在首次执行此命令。这样,副本集就在这个数据库中变为活动状态。

$ mongo
....
> rs.initiate()

执行

在第一次运行时,需要使用–import参数。

$ momy --config momyfile.json --import

如果启用此选项,将根据momyfile.json文件的模式创建MySQL表格,并将MongoDB上的现有文档复制到MySQL中。

当复制完成后,将监视MongoDB并实现与MySQL的实时同步。要退出,请按下Ctl+X。

从第二次开始

$ momy --config momyfile.json

只需要”OK”。如果想在服务器等地方确保持续同步,推荐使用”forever”。

$ forever momy --config momyfile.json

如果不幸发生momy崩溃的情况,它会重新启动并继续执行。

最后

请参考去年的文章了解有关图书馆创建的背景等。关于详细的使用方法,请参考Momy的存储库。那么,我们就这样吧。

附录

设置收藏品

在momyfile.json文件中,我们使用以下格式来指定集合名称和字段设置。

{
  "コレクション名": {
    "_id": "string あるいは number",
    "フィールド名1": "フィールドの型",
    "フィールド名2": "フィールドの型",
    ...
  }
}

_id字段是必需的。在将其传输到MySQL时,它将成为主键。

使用点符号可以在字段名称中获取嵌套的值。例如:

{a:{b:{c: ‘Hey!’}}} というデータがあったら、a.b.cで’Hey!’を取得。

{address: {state: ‘東京’, city: ‘世田谷’, street: ‘代田’}} というデータがあったら、address.stateで’東京’を取得。

字段的类型 de katachi)

作为类型,可以使用以下内容。

    • BIGINT

 

    • DOUBLE

 

    • TINYINT

 

    • VARCHAR

 

    • DATE

 

    • DATETIME

 

    • TIME

 

    TEXT

备注:如果有任何缺失的类型,请提出问题或发起拉取请求。

作为替代,也可以使用以下表达方式。

string: VARCHARに同じ

number: DOUBLEに同じ

boolean: TINYINTに同じ

日期型

DATE型和DATETIME型可以接受字符串形式例如”2016-11-13″,也可以接受时间戳(毫秒)。如果指定了DATE类型,无论MongoDB上的值是什么,传递给MySQL的值都将是”2016-11-13″。

“2016-11-13 01:14:28” (文字列)

“2016-11-13T01:14:28” (文字列)

“20161113T011428” (文字列)

1478967268294 (数値)

数字类型

BIGINTを指定した場合、小数点以下はparseInt()で丸められます。

DOUBLEを指定した場合、parseFloat()で解釈されます。

字符串类型

VARCHARは、実際にはVARCHAR(255)です。255文字以上の場合は、トランケートされます。

TEXTには、明確な文字数制限がありません。

广告
将在 10 秒后关闭
bannerAds