Momy
Momy 是一个简单的 cli 工具,用于将 MongoDB 实时复制到 MySQL。
- 对 NoSQL 数据库中的数据启用 SQL 查询
- 使能够被 Excel 访问
安装
通过 npm 安装
$ npm install -g momy
或者使用 docker
$ docker run -it --rm -v $(pwd):/workdir cognitom/momy
您可能想要创建一个别名,例如
$ echo 'alias momy="docker run -it --rm -v $(pwd):/workdir cognitom/momy"' >> ~/.bashrc
请在下面查看有关 Docker 配置的更多详细信息。
预备
MongoDB
Momy 在 MongoDB 中使用Replica Set(副本集)功能。 但是您实际上不必在 MongoDB 之间进行复制。 请按照以下步骤操作。
启动一个没有数据的新mongo实例:
$ mongod --replSet "rs0" --oplogSize 100
打开另一个终端,然后转到MongoDB Shell:
$ mongo .... > rs.initiate()
rs.initiate() 命令准备复制所需的集合。
MySQL
启动 MySQL 实例,并创建要使用的新数据库。同步时将创建或更新表。您还将看到 mongo_to_mysql。这是存储同步信息所必需的。(请勿删除)
配置
创建一个新的 momyfile.json 文件,如下所示:
{ "src": "mongodb://localhost:27017/dbname", "dist": "mysql://root:password@localhost:3306/dbname", "prefix": "t_", "case": "camel", "collections": { "collection1": { "_id": "number", "createdAt": "DATETIME", "field1": "number", "field2": "string", "field3": "boolean", "field4.subfield": "string" }, "collection2": { "_id": "string", "createdAt": "DATETIME", "field1": "number", "field2": "string", "field3": "boolean", "field4": "TEXT" } } }
- src:MongoDB 服务器的 URL
- dist:MySQL 服务器的 URL
- prefix:表名的可选前缀。 在上面的示例中,表的名称为 t_collection1。
- fieldCase:可选。 snake 或 camel。 请参阅以下部分。
- 排除:可选。 字符或要排除的字符范围:"\uFFFD"
- 包含:可选。 字符或包含以下字符的范围:"\u0000-\u007F"
- 集合:将集合和字段设置为同步
_id 字段是每个集合的必填字段,应为字符串或数字。
栏位名称和类型
"<field_name>": "<field_tipe>"
或者,field_name 可以点连接:
"<field_name>.<sub_name>": "<field_tipe>"
例如,如果您有 { a: { b: { c: 'hey!' } } } 则 "a.b.c": "string"
当前支持以下本机类型:
BIGINT
TINYINT
VARCHAR
DATE
DATETIME
TIME
TEXT
还有一些别名:
number
=>BIGINT
boolean
=>TINYINT
string
=>VARCHAR
字段名称规范化:
某些系统(例如 Microsoft Access)不允许点连接的字段名称,因此 address.street 会导致错误。 在这种情况下,请使用fieldCase:
snake
:address.street
-->address_street
camel
:address.street
-->addressStreet
注意:如果您设置 fieldCase 值,则 _id 字段的名称也将更改为 id,不带_。
用法
在第一次运行时,我们需要从MongoDB导入所有数据:
$ momy --config momyfile.json --import
然后启动守护程序以流式传输数据:
$ momy --config momyfile.json/p> <p><field_name><field_tipe>或</field_tipe></field_name>
或者
$ forever momy --config momyfile.json
Docker的用法
首先,为您的容器创建一个网络:
$ docker network create my-net
然后,启动数据库服务器:
$ docker run \ --name my-mongod \ --detach --rm \ --network my-net \ --mount type=volume,source=my-mongo-store,target=/data/db \ mongo --replSet "rs0" $ docker run \ --name my-mysqld \ --detach --rm \ --network my-net \ --mount type=volume,source=my-mysql-store,target=/var/lib/mysql \ --env MYSQL_ALLOW_EMPTY_PASSWORD=yes \ mysql
如果这是第一次运行上述容器,则需要初始化它们:
$ docker exec my-mongod mongo --eval 'rs.initiate()' $ docker exec my-mysqld mysql -e 'CREATE DATABASE momy;'
像这样创建 momyfile.json:
{ "src": "mongodb://my-mongod:27017/momy", "dist": "mysql://root@my-mysqld:3306/momy", "collections": {...} }
注意:您必须更改用户名,密码,端口等。 以适合您的环境。
好的,让我们使用 --import 选项运行 momy:
$ docker run \ --interactive --tty --rm \ --network my-net \ --mount type=bind,source=$(pwd),target=/workdir \ cognitom/momy --import
一切顺利? 然后,停止容器(Ctrl + C)。 现在,您可以将其作为守护程序运行:
$ docker run \ --detach --rm \ --restart unless-stopped \ --network my-net \ --mount type=bind,source=$(pwd),target=/workdir \ cognitom/momy
对于贡献者
请参阅 dev 目录。
许可
MIT
(The first version translated by vz on 2020.07.18)