【发布时间】:2019-08-02 01:28:09
【问题描述】:
有没有什么简单的方法可以把数据库从mysql改成mongoDB?
或者更好的任何人建议我做它的好教程
【问题讨论】:
-
您是在寻找传输数据的流程,还是要改变方法?
-
处理过程 :)我已经有大约 50 万条记录
-
您需要考虑将数据从 mysql 存储到 mongodb 的最佳方式。然后自己在任何语言上写映射
有没有什么简单的方法可以把数据库从mysql改成mongoDB?
或者更好的任何人建议我做它的好教程
【问题讨论】:
有没有什么简单的方法可以把数据库从mysql改成mongoDB?
方法#1:以CSV格式从MySQL导出,然后使用mongoimport tool。但是,这在处理二进制数据的日期方面并不总是有效。
方法#2:用您选择的语言编写传输脚本。基本上,您编写一个程序,一次从 MySQL 读取一个元素,然后将其插入 MongoDB。
方法#2优于#1,但仍然不够。
MongoDB 使用集合而不是表。 MongoDB 不支持连接。在我见过的每个数据库中,这意味着您在 MongoDB 中的数据结构与 MySQL 中的结构不同。
因此,没有将 SQL 移植到 MongoDB 的“通用工具”。您的数据需要在到达 MongoDB 之前进行转换。
【讨论】:
如果您使用 Ruby,也可以尝试:Mongify
这是一种将数据从 RDBS 转换为 MongoDB 而不会丢失任何内容的超级简单方法。
Mongify 将读取您的 mysql 数据库,为您构建一个翻译文件,您所要做的就是映射您希望如何转换数据。
它支持:
阅读更多信息:http://mongify.com/getting_started.html
主页上还有一个 5 分钟的短视频,向您展示它是多么容易。
【讨论】:
为了这个目的,我使用 Node.js 做了以下工作:
var mysql = require('mysql');
var MongoClient = require('mongodb').MongoClient;
function getMysqlTables(mysqlConnection, callback) {
mysqlConnection.query("show full tables where Table_Type = 'BASE TABLE';", function(error, results, fields) {
if (error) {
callback(error);
} else {
var tables = [];
results.forEach(function (row) {
for (var key in row) {
if (row.hasOwnProperty(key)) {
if(key.startsWith('Tables_in')) {
tables.push(row[key]);
}
}
}
});
callback(null, tables);
}
});
}
function tableToCollection(mysqlConnection, tableName, mongoCollection, callback) {
var sql = 'SELECT * FROM ' + tableName + ';';
mysqlConnection.query(sql, function (error, results, fields) {
if (error) {
callback(error);
} else {
if (results.length > 0) {
mongoCollection.insertMany(results, {}, function (error) {
if (error) {
callback(error);
} else {
callback(null);
}
});
} else {
callback(null);
}
}
});
}
MongoClient.connect("mongodb://localhost:27017/importedDb", function (error, db) {
if (error) throw error;
var MysqlCon = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'root',
port: 8889,
database: 'dbToExport'
});
MysqlCon.connect();
var jobs = 0;
getMysqlTables(MysqlCon, function(error, tables) {
tables.forEach(function(table) {
var collection = db.collection(table);
++jobs;
tableToCollection(MysqlCon, table, collection, function(error) {
if (error) throw error;
--jobs;
});
})
});
// Waiting for all jobs to complete before closing databases connections.
var interval = setInterval(function() {
if(jobs<=0) {
clearInterval(interval);
console.log('done!');
db.close();
MysqlCon.end();
}
}, 300);
});
【讨论】:
MongoVUE 的免费版可以自动为您完成这项工作。
它可以连接到两个数据库并执行导入
【讨论】:
我认为最简单的方法之一是将 MySQL 数据库导出为 JSON,然后使用 mongorestore 将其导入 MongoDB 数据库。
第 1 步:将 MySQL 数据库导出为 JSON
如有必要,将 mysql 转储文件加载到 MySQL 数据库中
打开 MySQL Workbench 并连接到 MySQL 数据库
转到架构查看器 > 选择数据库 > 表 > 右键单击要导出的表的名称
选择“表数据导出向导”
将文件格式设置为 .json 并输入文件名,例如 tablename.json
注意:所有表格都需要单独导出
第 2 步:使用 mongorestore 命令将 JSON 文件导入 MongoDB
mongorestore 命令应该从服务器命令行(不是 mongo shell)运行
请注意,您可能需要提供身份验证详细信息以及 --jsonArray 选项,请参阅mongorestore docs 了解更多信息
mongoimport -d dbname -u ${MONGO_USERNAME} -p ${MONGO_PASSWORD} --authenticationDatabase admin -c collectionname --jsonArray --file tablename.json
注意:如果原始 MySQL 数据库有 BLOB/二进制数据,此方法将不起作用。
【讨论】:
对于这类迁移工作,我有点偏爱TalendOpenStudio。它是一个基于 Eclipse 的解决方案,以可视化的方式创建数据迁移“脚本”。我不喜欢可视化编程,但这是一个我例外的问题域。
Adrien Mogenet 为 mongodb 创建了一个 MongoDBConnection 插件。
对于“简单”的迁移来说,这可能是矫枉过正,但 ut 是一个很酷的工具。
但是请注意,如果是一次性迁移,Nix 的建议可能会节省您的时间。
【讨论】:
您可以为此使用 QCubed (http://qcu.be) 框架。该过程将是这样的:
【讨论】:
如果有人仍在寻找解决方案,我发现最简单的方法是编写一个 PHP 脚本来连接到您的 SQL DB,使用通常的 Select 语句检索您想要的信息,使用 PHP JSON 将信息转换为 JSON对函数进行编码并简单地将结果输出到文件或直接输出到 MongoDB。它实际上非常简单直接,唯一要做的就是根据 Json 验证器仔细检查您的输出,您可能必须使用诸如 explode 之类的函数来替换某些字符和符号以使其有效。我之前做过这个,但是我目前手头没有脚本,但据我所知,它实际上是半页代码。
哦,还记得 Mongo 是一个文档存储,因此需要一些数据映射才能使其被 mongo 接受。
【讨论】:
对于那些遇到同样问题的人,您可以查看此Github project。这是一项正在进行的开发,它将帮助您通过简单地运行一个简单的命令将数据从 MySQL 数据库迁移到 MongoDB。
它将在 TypeScript 中生成 MongoDB 模式,以便您稍后在项目中使用它们。每个 MySQL 表都将是一个 MongoDB 集合,并且数据类型将有效地转换为它们的 MongoDB 兼容表。
可以在项目的README.md 中找到相同的文档。随意进来并做出贡献。如果需要,愿意提供帮助。
【讨论】:
如果您正在寻找一种工具来为您做这件事,祝您好运。
我的建议是选择您选择的语言,从一种语言读取并写入另一种语言。
【讨论】:
如果我能引用马特布里格斯的话(它曾经解决了我的问题):
驱动方式是 FAR 最直接的方式。导入/导出工具非常棒,但前提是您将它们成对使用。如果您的表包含日期并且您尝试从 db 导出并导入到 mongo,那么您将大吃一惊。
你也很幸运,在 c# 中。我们正在使用 ruby,并且有一个 3200 万行的表我们迁移到了 mongo。我们的最终解决方案是在 postgres 中制作一个疯狂的 sql 语句,该语句输出 json(包括一些使日期正常运行的非常笨拙的东西)并将命令行上该查询的输出通过管道传输到 mongoimport。花了令人难以置信的令人沮丧的一天来写,而且不是那种可以真正改变的东西。
因此,如果您可以摆脱它,请使用带有 mongo 驱动程序的 ado.net。如果没有,我祝你好运:-)
(请注意,这是来自一个完全的 mongo fanboi)
MySQL 与其他 SQL 数据库非常相似,所以我将您发送到主题: Convert SQL table to mongoDB document
【讨论】:
您可以使用以下项目。它需要编写类似solr的配置文件。非常简单直接。
【讨论】:
试试这个: 使用简单的 r2n 映射将 MySQL 转储自动转换为 Mongo 更新。 https://github.com/virtimus/mysql2mongo
【讨论】: