vlambda博客
学习文章列表

如何将数据从MySQL/MongoDB中迁移至云开发数据库

前言
如何将数据从MySQL/MongoDB中迁移至云开发数据库

云开发数据库

云开发为我们提供了一个 JSON 文档型数据库(NoSQL),并集成了增删改查 等 API,操作方便,简单易懂。并且相比传统数据库而言它具有 高性能的数据库读写服务,可以直接在客户端对数据进行读写,无需关心数据库实例和环境。

迁移说明

本篇文章从 MySQL、MongoDB 迁移到云开发数据库,其他数据库迁移也都大同小异~
迁移大致分为以下几步👇:
  • 从 MySQL、MongoDB 将数据库导出为 JSON 或 CSV 格式

  • 创建一个云开发环境

  • 到云开发数据库新建一个集合

  • 在集合内导入 JSON 或 CSV 格式文件


Mysql迁移到云开发数据库
如何将数据从MySQL/MongoDB中迁移至云开发数据库
为了方便,我们使用 Navicat for MySQL进行导出。

导出为 CSV 格式

选中表后进行导出
如何将数据从MySQL/MongoDB中迁移至云开发数据库
类型中选择 csv 格式
如何将数据从MySQL/MongoDB中迁移至云开发数据库
注:在第4步时,我们需要勾选包含列的标题
如何将数据从MySQL/MongoDB中迁移至云开发数据库
导出后的 csv 文件内容 第一行为所有键名,余下的每一行则是与首行键名相对应的键值记录。类似这样👇
如何将数据从MySQL/MongoDB中迁移至云开发数据库

导出为 JSON 格式

同样的我们将选中的表进行导出为 json 格式:
如何将数据从MySQL/MongoDB中迁移至云开发数据库
剩余步骤全部选择默认即可。
导出后的样子👇
如何将数据从MySQL/MongoDB中迁移至云开发数据库
我们将数组去除,最后是这样👇
如何将数据从MySQL/MongoDB中迁移至云开发数据库

MongoDB迁移到云开发数据库
如何将数据从MySQL/MongoDB中迁移至云开发数据库
首先我们先启动 mongod 服务:
如何将数据从MySQL/MongoDB中迁移至云开发数据库 启动后此终端不要关闭。

导出为 CSV 格式

新打开一个终端,输入以下命令
mongoexport -d
数据库 -c 集合名称 --csv -f 导出的列名以,分割 -o 输出路径\输出名字.csv
注:导出 csv 格式时需要指定导出的列 否则会报错:
csv mode requires a field list
导出后的样子:
如何将数据从MySQL/MongoDB中迁移至云开发数据库

导出为 JSON 格式

新打开一个终端,输入以下命令:
mongoexport -d 数据库 -c 集合名称 -o 输出路径\输出名字.json
参数说明:
参数 全称 参考解释
-d --db <database> 指定数据库名称
-c --collection <collection> 指定需要导出的集合
-o --out <file> 指定要导出的文件路径(含文件名)
导出后的样子:
如何将数据从MySQL/MongoDB中迁移至云开发数据库

导入

当我们导出工作准备好之后,就可以进行进行导入啦!

新建云环境

如果已有云环境,可直接跳过这一步打开云开发控制台新建云环境:
如何将数据从MySQL/MongoDB中迁移至云开发数据库
新建环境后耐心等待2分钟环境初始化过程。

数据库导入

我们进入云环境后,找到数据库选项,默认有一个 tcb_hello_world 集合,可以把他删掉。
点击添加集合来创建一个集合:
如何将数据从MySQL/MongoDB中迁移至云开发数据库
新建之后我们点进去,并进行导入操作:
如何将数据从MySQL/MongoDB中迁移至云开发数据库
选择我们之前导出的 CSV 或 JSON 格式文件。
注:这里有两种冲突处理模式: Insert 和 Upsert \\Insert:Insert 模式会在导入时总是插入新记录,同一文件不能存在重复的 _id 字段,或与数据库已有记录相同的 _id 字段。 \\Upsert:Upsert 模式会判断有无该条记录,如果有则更新该条记录,否则就插入一条新记录。
简单的说,有时我们并不希望产生冗余重复的数据,那么我们可以使用 Upsert 模式。当然如果希望之间的数据不被覆盖掉,可以选择 Insert 模式。
这里我们选择 Upsert 模式:
如何将数据从MySQL/MongoDB中迁移至云开发数据库
点击导入之后就会发现有内容啦~
如何将数据从MySQL/MongoDB中迁移至云开发数据库

数据库测试

最后我们来测试下是否可用。

安装 cloudbase/cli

cloudbase/cli 是一个开源的命令行界面交互工具,用于帮助用户快速、方便的部署项目,管理云开发资源。
npm i -g @cloudbase/cli

云开发项目初始化

安装完成后进行云开发项目初始化tcb init.
$ tcb init√ 选择关联环境 · 环境名称 - [环境ID:空]√ 请输入项目名称 · cloudbase-demo√ 创建项目 cloudbase-demo 成功!
默认会有一个名为 app 的云函数,我们只是测试,所以修改 functions/app/index.js 即可

编写测试数据库代码

将以下代码拷入:
const tcb = require('tcb-admin-node')
tcb.init({ env: tcb.getCurrentEnv()})const db = tcb.database()
exports.main = async (event) => { return db.collection('db_remove').get()}
这里我们用到了 tcb-admin-node ,使用 npm 安装一下即可
npm i --save tcb-admin-node@latest

本地运行云函数

本地运行云函数执行命令:
tcb functions:run --name app
如何将数据从MySQL/MongoDB中迁移至云开发数据库
可以看到成功返回我们导入的数据,具体云函数的写法可以参照 云开发文档。

可能发生的问题

1.secure_file_priv 的 Value 为 Null;

如果MySQL采用 into outfile 命令导出可能报错:
[Code: 1290, SQL State: HY000] The MySQL server is running with the –secure-file-priv option so it cannot execute this statement
这是因为我们 secure_file_pri 参数给的权限不足以使我们对数据进行导入导出。
解决办法:打开 MySQL 的配置文件(mysqld.cnf),在其中加入或修改 secure_file_pri="/",表示可以对任何路径进行导入导出操作。

2.JSON 数据不是数组,而是类似 JSON Lines,即各个记录对象之间使用 \n 分隔,而非逗号;

例如,应该写成
{ "user":"aaa", "pwd":43}{ "user":"root", "pwd":8}
而非(注意逗号的区别)
{ "user":"aaa", "pwd":43},{ "user":"root", "pwd":8}
注:像上面例子这样的没有 json 嵌套可以直接采用替换的方式进行将每条数据之间逗号去除,将 },换行{ 替换为 }换行{ 。如果有 json 嵌套可以采用正则的方式进行去除。
我们可以将 json 用数组 ([ ]) 包起来,遍历这个数组,对于每一项使用正则 },$ 匹配到每一项最后的逗号,将其替换为 } 。这样就解决了 }, => } 在有 json 嵌套的去掉每条数据之间逗号。
有其他的问题可以参考数据库导入。

总结
如何将数据从MySQL/MongoDB中迁移至云开发数据库
只要掌握导入 CSV、JSON 的格式,就会很简单的进行数据库迁移,还等什么,快行动起来~

数据库专题直播第二场《云开发数据库的高可用高性能实现》将在今晚20:00开播,还有代金券的直播抽奖哦!

如何将数据从MySQL/MongoDB中迁移至云开发数据库



Serverless云应用申请限量开放内测啦,点击 阅读原文 ,了解更多!


 更多精彩

扫描二维码了解更多

容器化的Serverless=Faas+Caas+Baas




      点击在看让更多人发现精彩