最近在写毕业设计,用到了Mongodb,但是在写SSM的时候,发现还是用MySQL方便,于是就想到了把MongoDB中的数据转移到MySQL中。但是过程中遇到一些问题,故做出此总结。
首先,自己想的笨方法,就是从MOngoDB读取然后再写入MySQL,虽然肯定比较费时间,想着大不了就多运行一会,不用管它,但是发现根本不是想的这样。因为MongoDB中一条记录可能有的字段不包括,然后如果直接获取的话会报错:KeyError。故此方法效率又低又不方便。
然后网上查找发现,可以先将MongoDB中的数据导出到CSV,然后再将CSV导入到MySQL。所以一下就介绍这个方法,以及遇到的一些问题。
一、MongoDB导出到CSV
我的系统是Ubuntu16,故直接运行命令行:
mongoexport -h 127.0.0.1 -d Sina1 -c Tweets -f _id,ID,PubTime,Sentiment --csv -o /data/share/sentimentRecords.csv
其中127.0.0.1为IP地址,我是本机,因为我没有用户名和密码,所以此处不加该参数。Sina1为数据库名称,Tweets是集合名称。-f后的参数为要导出的Collection中的字段,-o后的参数为导出文件的位置。
执行就可以,这个过程没有遇到什么大问题。
导出后可能打开是乱码,用记事本或者Notepad另存为UTF8即可。
二、将CSV导入到MySQL
1.准备工作:
创建MySQL数据库和接收数据的表,注意表的顺序和字段要和MongoDB导出的字段及CSV中的文件表头一样。
在此处要注意,将编码都设置为utf8。
2.执行:
load data infile '/var/log/mysql/sentimentRecords.csv'
into table `tweets` character set utf8
fields terminated by ',' optionally enclosed by '"'
lines terminated by '\n'
ignore 1 lines;
一般都会报出这个错误:
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
因为MySQL导入导出不是任意文件下的文件都是可以的。
所以我们把这个VSC文件放到指定文件夹下即可。
使用命令行查看可进行操作的文件夹:
show global variables like '%secure%';
所以把文件放到该位置即可。
还可以修改MySQL的配置文件,my.cnf中的[mysqld]中添加一行:
secure_file_priv =
再次查询:
执行:
load data local infile 'C:\\ProgramData\\MySQL\\MySQL Server 5.7\\Uploads\\sentimentRecords.csv'
into table `tweets` character set utf8
fields terminated by ',' optionally enclosed by '"'
lines terminated by '\n'
ignore 1 lines;
成功。
其他问题:
因为导入另一个文件的时候,提示
ERROR 1300 (HY000): Invalid utf8 character string: ''
这个时候发现是因为我的文本中有表情,而UTF8是不支持的,所以需要将表以及有表情的字段设置为utf8mb4,utf8mb4_unicode_ci。
同时load语句也需要将UTF8改为utf8mb4.
如果还是不可以,可以试着将数据库也进行改写。
使用
SHOW VARIABLES LIKE 'character%';
可查看数据库编码,
然后使用
SET character_set_server = utf8;
命令类型进行修改即可。
同时发现,文件导入的方式进行导入导出,速度贼快,推荐。
7W多数据5s 。美滋滋~