资讯专栏INFORMATION COLUMN

以文本形式将MySql数据迁移Mongodb的方法

IT那活儿 / 3090人阅读
以文本形式将MySql数据迁移Mongodb的方法
数据迁移是DBA的一类常见工作,如果是相同数据库产品之间的数据迁移,因为各个DBMS都提供了迁移的工具,所以是一个比较简单的事情。但是现在各种开源数据库产品大行其道,也经常出现跨DBMS的数据迁移需求,此时就得想各种方法来实现,跨库迁移最常见的就是ETL工具或者以文本的形式导出和导入。
在本文中,笔者将简单介绍MySql数据库以文本的形式导出导入到Mongodb的方法。MySql数据库是一种关系型数据库,数据在表中是以行列的形式存储,而Mongodb是一种非关系型数据库,数据是以Json文档的形式存储。两种数据库都提供了导入导出文本的工具,都支持CSV、TSV等格式的导入导出,Mysql是mysqldump,mongodb导入使用mongoimport,所以整个过程也比较简单,只是有些细节需要注意。
使用mysqldump导出CSV或者TSV格式,比较常见,此时暂不做讨论,由于Mongodb数据是以Json文档来存储,在表级并没有表结构定义的概念,但是每个Json文档的字段都有类型,且同为文本类型,字段长度也不一致,时间类型也不同,在Mongodb中是ISODate,所以使用mongoimport导入时,需指定每个字段的类型。所以可以按照下表进行Mysql和Mongodb之间的字段类型转换导入:
序号

Mysql数据类型

mongoimport数据类型

1

tinyint

int32()

2

smallint

int32()

3

mediumint

int32()

4

integer

int32()

5

bigint

int64()

6

decimal

decimal()

7

float

double()

8

double

double()

9

char

string()

10

varchar

string()

11

tinytext

string()

12

text

string()

13

mediumtext

string()

14

longtext

string()

15

year

string()

16

date

date_oracle(YYYY-MM-DD)

17

time

string()

18

datetime

date_oracle(YYYY-MM-DD HH24:MI:SS)

19

timestamp

date_oracle(YYYY-MM-DD HH24:MI:SS)

20

bit

int32()

mongoimport导入命令需注意以下参数:

--type 指定导入文件的类型,可选值有CSV、TSV、JSON

--fields指定Json文档的字段名

--columnsHaveTypes表示指定每个字段的数据类型,如果加了此选项,field字段后面就要加数据类型,如msisdn.string()

命令示例:

mongoimport--db ring***ne_prod --collection=Di***bt --parseGrace=skipField--fields="ms**dn.string(),r***ame.string(),nic**me.string(),co***ntId.string(),cop***tId.string(),fil***pe.string(),dat***atus.string(),localF***Path.string(),diyTran*****nId.string(),diyFtp***ath.string(),diyFile***at.string(),cre***me.date_oracle(YYYY-MM-DDHH24:MI:SS),lastM****ime.date_oracle(YYYY-MM-DDHH24:MI:SS),sta***e.string(),e***ime.string(),he***Str.string(),dep***onId.string(),act***Id.string(),l***el.string()"--type tsv --file=t_m****bt_info.tsv --numInsertionWorkers=100--columnsHaveTypes

在上面也说过,在Mongodb中的表(集合)上没有严格的结构定义,所以字段数据没有NULL的概念,如果该字段值数据为NULL,则直接就不需要这个字段。而在mysqldump的时候,如果数据是NULL,则导出的文本文件就会出现NULL,导入后会呈现如下情况:

此时,建议导出的时候使用selectifnull(column_name,’’)****intooutfile的形式进行导出;在使用mongoimport导入是指定参数--ignoreBlanks,这样导入的json文档就不会存在null的字段。如果大批量的表数据迁移,则使用selectinto outfile比较麻烦,可以考虑使用shell脚本对原始文本文件进行全量的Null替换,然后再导入。

另外在生产中,Mysql数据中可能存在以字符串形式保存的Json文档,在Mongodb中,这种Json文档建议以子文档的形式存储入数据库中,此时使用mongoimport就不能满足需求,此时可以考虑使用python对文本数据进行转换后写入mongodb。

END

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129966.html

相关文章

  • mongodb从2.6迁移到3.0过程

    摘要:数据的迁移由于需要换引擎,所以原来的数据不能直接使用了,必须使用和两个工具来迁移数据。指定一个时间限制以毫秒为单位。以上是新版本用户角色权限的一些说明。到这里,单实例的从迁移到就基本完成了。 首发于 搞起博客 总共有这么几个问题需要解决: 1. mongodb3.0版本的二进制包 1. wiredTiger引擎的配置 1. 数据的迁移 1. 权限 mongodb3.0的二进...

    xorpay 评论0 收藏0
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据结构化

    摘要:则在读取数据时将两个中文字段混淆成了一个字段,导致整个数据结构错乱。三条路子全军覆没,这让我情何以堪,好在使用的经验颇丰,通过中文的转换和切割就轻松解决了这个问题。 概述 showImg(https://segmentfault.com/img/bVylLL); 在现实场景中,由于数据来源的异构,数据源的格式往往是难以统一的,这就导致大量具有价值的数据通常是以非结构化的形式聚合在一起的...

    leiyi 评论0 收藏0
  • 开源|性能优化利器:数据库审核平台Themis选型与实践

    摘要:正是存在问题,促使我们考虑引入数据库审核平台。的确,与很多互联网公司相比,数据库数十套的估摸并不是太大但与互联网类公司不同,类似宜信这类金融类公司对数据库的依赖性更大,大量的应用是重数据库类的,且其使用复杂程度也远比互联网类的复杂。 作者:韩锋 出处:DBAplus社群分享 Themis开源地址:https://github.com/CreditEaseDBA 拓展阅读:宜信开源|数...

    wenhai.he 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<