FAQ v2.0终于上线了,断断续续忙了有2个多月。这个项目是我实践的第一个全栈的项目,从需求(后期有产品经理介入)到架构,再到设计(有征询设计师的意见)、构建(前端、后台、数据库、服务器部署),也是第一次独立负责一个项目,所以意义很不一般,后面还会写一篇总结的文章。闲言少叙,进入正题:

  其中有一个自动定时发访问记录列表和反馈问题列表的邮件的功能,本来打算自己写的,不过后来了解到团队有现成的平台可以做这个事,所以就用现成的喽。但有一个问题,该平台配置的数据源必须是MySQL数据库,而FAQ平台用的是MongoDB数据库。有两个办法:一是把现有的MongoDB数据库换成MySQL,这样的话要改动比较大;二是把MongoDB里的数据迁移到MySQL数据库。我采用的是第二种方法,可是怎么迁移呢?不能直接迁移,在网上搜了下,有一个办法是先把MongoDB里的数据导出到csv文件或者txt文件中,再把csv/txt文件中的数据导入到MySQL数据库中,感觉挺靠谱的。

  分两步走:

  PS:昨天用windows自带的画图工具画的那个图有点丑,今天一个设计师朋友用sketch给我画了个好看点的图,附上。(2016.10.26更新)

  第一步:将MongoDB里的数据导出到csv文件,有一个mongo自带的工具mongoexport就可以实现。

/usr/local/mongodb/bin/mongoexport -h ip(192.168.0.102) -u mongo数据库登录帐号 -p mongo数据库登录密码 -d mongo数据库名称 -c mongo数据库集合名 -f _id,字段1,字段2 --type=csv -o 保存路径(/data/kagol/records.csv)

  导出的csv文件格式是一条mongo记录占一行,字段之间用逗号(,)分割。

  第二步:将csv文件导入到MySQL数据库中,可以用MySQL的load命令。

  SQL语句如下(load_csv_data.sql):

 load data local infile '/data/kagol/records.csv'
into table `records` character set utf8
fields terminated by ',' optionally enclosed by '"'
lines terminated by '\n'
ignore 1 lines;

  写成shell脚本(load_csv_data.sh):

mysql -hip(192.168.0.105) -umysql登录用户名 -pmysql登录密码 mysql数据库名 --default-character-set=utf8 --local-infile= < /data/kagol/load_csv_data.sql

  要注意的是:

  (1)-h和ip之间不需要空格(-u,-p同理);

  (2)MySQL数据库的格式必须和csv格式一致(字段数、顺序等)。

  这样就顺利地完成了MongoDB数据库到MySQL数据库的迁移,but!!这个方法导出来的数据中文是乱码的!!花了那么多时间居然是乱码,此刻我的内心是奔溃的!(此处不配图,自己脑补画面)

  

  于是,有了现在的方案,写代码(Node)迁移。

 //mongo对象
var Record = require('./record'); //mysql对象
var mysql = require('mysql');
var connection = mysql.createConnection({
host : '192.168.0.104',//mysql服务器ip
user : 'XXX',//mysql登录名
password : 'XXX',//mysql登录密码
database : 'XXX'//mysql数据库名
}); connection.query('set names latin1');//这句很关键,确保中文不乱码 var addZero = function(num){
return num < 10 ? '0' + num : num;
} var getYesterday = function(){
var now = new Date();
var year = now.getFullYear();
var month = now.getMonth() + 1;
now.setTime(now.getTime() - 1000*60*60*24);
var day = now.getDate();
var result = year + '-' + addZero(month) + '-' + addZero(day);
return result;
} var yesterday = getYesterday(); //导入昨天的数据
Record.find({time:{'$gt':yesterday + ' 00:00:00','$lt':yesterday + ' 23:59:59'}},function(err, docs){
if(err){
console.log('error');
}else{
for(var i=0;i<docs.length;i++){
var 字段1 = docs[i].字段1;
var 字段2 = docs[i].字段2;
var sql = 'insert into faq_records (字段1, 字段2) values("'+字段1+'","'+字段2+');';
connection.query(sql, function(err, rows) {
return;
});
}
console.log('succeed!');
}
})

  record.js文件是封装了对mongo数据库的操作:

 var mongoose = require('mongoose');
var connectionRecord = mongoose.createConnection('mongodb://mongo登录帐号:mongo登录密码@ip:mongo服务端口(默认是27017)/数据库名');
var Schema = mongoose.Schema;
var recordSchema = new Schema({
字段1: String,
字段2: String
});
var Record = connectionRecord.model('Record', recordSchema);
module.exports = Record;

  

  这个方案完美地解决了中文乱码问题!

  大家有别的方法可以一起讨论哈~~

  PS:一直没搞明白为什么第一种方案会乱码,mongo里的数据确实是没有乱码的,csv文件里的数据也没有乱码,就是到了MySQL里就是乱码,怀疑是load data那一步有问题,但是我加了"character set utf8"和"--default-character-set=utf8"啊~~

  

  

如何将MongoDB数据库的数据迁移到MySQL数据库中的更多相关文章

  1. Oracle中的数据迁移到Mysql数据库中的方式Navicat premium工具

    1.安装 Navicat premium工具 2.破解 Navicat premium工具 3.连接需要相互迁移的两个库Mysql和Oracle(可以是远程的或者本机的数据库都是可以的) 4.连接上之 ...

  2. Mongodb到mysql数据库的数据迁移(Java,Windows)

    运行环境为windows 测试过260万的数据表,迁移大概要10分钟左右,当然肯定和网络,字段大小什么的有关系. 遇到的坑和注意点都用紫色标记了(对,就是我大乃团的高冷紫--Nogizaka 46) ...

  3. Oracle数据迁移至MySQL

    ORACLE DB: 11.2.0.3.0 MYSQL DB: 5.5.14 因项目需求,需要将ORACLE生产中数据迁移至MYSQL数据库中作为初始数据,方法有如下几种: 1.ORACLE OGG ...

  4. Neo4j ETL工具快速上手:简化从关系数据库到图数据库的数据迁移

    注:本文系从https://medium.com/neo4j/tap-into-hidden-connections-translating-your-relational-data-to-graph ...

  5. mysql 客户无感知迁移_亿级账户数据迁移,不用数据库工具还能怎么搞?

    原标题:亿级账户数据迁移,不用数据库工具还能怎么搞? 背景 在阿里巴巴内部"大中台,小前台"的组织和业务体制,使前线业务更加敏捷,赋能业务积极迎接未来挑战和机遇,在阿里大中台能力建 ...

  6. 将ABP的数据库从SQLSERVER迁移到MySql

    摘要:之前跟着网上的一些教程,学习了一点ABP的知识.最近想说把默认的SQLSERVER数据迁移到mysql吧 首先网上搜一波 安装MySql.Data.Entity 然后你需要安装 MySql.Da ...

  7. Mysql ---Sqlserver数据迁移到Mysql(Mysql建表迁移数据)

    1 试用了MysqlWorkBench的数据迁移功能 以为能实现:建立跟Sqlserver一样的表结构和视图的功能,sqlserver的数据迁移到mysql 实际上发现:即使勾选了表和视图,实际上却只 ...

  8. 用JDBC把Excel中的数据导入到Mysql数据库中

    步骤:0.在Mysql数据库中先建好table 1.从Excel表格读数据 2.用JDBC连接Mysql数据库 3.把读出的数据导入到Mysql数据库的相应表中 其中,步骤0的table我是先在Mys ...

  9. 猫眼电影爬取(一):requests+正则,并将数据存储到mysql数据库

    前面讲了如何通过pymysql操作数据库,这次写一个爬虫来提取信息,并将数据存储到mysql数据库 1.爬取目标 爬取猫眼电影TOP100榜单 要提取的信息包括:电影排名.电影名称.上映时间.分数 2 ...

随机推荐

  1. .Net程序员的前端优化

    面向.Net程序员的前端优化 2014-08-06 17:20 by 熬夜的虫子, 1152 阅读, 9 评论, 收藏, 编辑 背景 作为web开发人员大家大多了解一些网站的性能优化方法,其实大部分方 ...

  2. 动画操作 (Applying Animations) ngAnimate12

    动画操作 (Applying Animations) ngAnimate step 12 1.切换目录 git checkout step-12 npm start 2.效果图 这里在点击右边的缩略图 ...

  3. SQLServer数据库误删数据找回

    记一次SQLServer数据库误删数据找回 昨天 同事在本机清理数据库表时,连接到了生产机,误删了二十几张表,幸好是晚上加班的时候删除的,生产机上当时是一天一备份,还原备份是最后的策略,最关键的还是要 ...

  4. Windows服务小技巧

    Windows服务小技巧 阅读目录 开始 将Windows服务转变为控制台程序 注册服务为自动启动服务 注册服务时设置服务的依赖关系 添加自定义命令行参数 自定义命令行参数演示 系列链接 伴随着研究W ...

  5. rabibtMQ安装及集群配置-linux

    安装RabbitMQ RabbitMQ是流行的开源消息队列系统,用erlang语言开发,故首先需要安装erlang依赖及erlang. 安装erlang依赖的基本环境,通过yum方式进行安装: yum ...

  6. MAKE gnu

    GNU Make 学习系列一:怎样写一个简单的Makefile 编程通常遵循一个相当简单的程序:编辑源文件,编译源代码成可执行的格式,调试结果.尽管将源代码翻译成可执行程序是常规的过程,如果做的不正确 ...

  7. WCF从零学习之设计和实现服务协定2

    WCF从零学习之设计和实现服务协定(二)   在创建服务协定之前,有很多WCF术语,比如: 消息.服务.终结点 创建协定 类或接口都可以定义服务协定,建议使用接口,因为接口可以直接对服务协定建模 服务 ...

  8. 强制卸载VS2013

    最近因为VS2013闹许可证过期问题,加之又发现新版本update5,所以就想卸掉重装,但是按照正常的卸载,发现卸载不了,再后来force强制卸载,OK了. force强制卸载: 首先如果安装了中文包 ...

  9. Object-c学习之路三(@class与#import的区别)

    //@class只是为了声明B是一个类  当两个类相互包含的时候#import是做不到的 //一般在.h文件中用@class声明一个类成员 在..m文件中具体用到时才用#import应用 //二者区别 ...

  10. javascript的关键所在---作用域链

    javascript的关键所在---作用域链 javascript里的作用域是理解javascript语言的关键所在,正确使用作用域原理才能写出高效的javascript代码,很多javascript ...