vlambda博客
学习文章列表

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

IT那活儿
不管IT什么活儿,干就完了。
292篇原创内容
Official Account
数据迁移是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,导入后会呈现如下情况:

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

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

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

END