数据库database迁移及迁移过程可能出现的issue

原创文章
声明:作者声明此文章为原创,未经作者同意,请勿转载,若转载,务必注明本站出处,本平台保留追究侵权法律责任的权利。
全栈老韩
全栈工程师,擅长iOS App开发、前端(vue、react、nuxt、小程序&Taro)开发、Flutter、React Native、后端(midwayjs、golang、express、koa)开发、docker容器、seo优化等。

这篇文章记录一下我在某云平台上迁移数据库的过程,虽然是一个小的不太正式的数据迁移,但是也可能对一些同学有参考价值,与众位共享。

一、背景

我在某云服务器平台上部署了服务器和mysql轻量数据库,但是面临数据库即将到期,而暂时没有找到一个优惠套餐的情况下,我决定直接重新购买一个便宜的云数据库来迁移migrate我的轻量数据库,所以有了这次的过程记录。

虽然云平台上有很多数据库续费、升级、数据迁移服务,但是我为了省钱所以选择了最直接的方案,就是直接购买一个便宜的云数据库,然后直接把数据迁移过去就好了。当然是在我的数据量比较小,而且用户pv不多的情况下。如果是数据量大,pv/uv大的情况下,就必须考虑其他方案,会更稳妥安全,避免实时数据丢失。

二、过程

首先我们登录该云平台的数据库管理,在数据库管理页面,可以看到有迁移数据库数据的一些选项。
database export choice

如上截图所示,在“数据管理”选项下有“数据导出”选项,我们点击后:

data export

在该截图中,

  • 我们选择要导出的数据库,
  • 然后选择最大的行数,也就是100000行,
  • 文件类型是SQL,
  • 编码我们最好选择utf8mb4,因为这个是兼容emoji表情符号的,
  • 导出内容自然是要“数据和结构”,
  • 导出对象选择全选,
  • “其他选项”我使用“在CREATE语句前生成DROP语句”,这样子在生成表的时候,会最先drop,然后再create,防止sql语句create报错,
  • 数据选项,这2个选项都勾选,其中要注意,“是否禁止外键约束”这个选项要勾选,否则sql导出语句在执行时,就有可能导致外键创建时,而对应的table却没有create,导致sql执行失败。
  • 这样子,我们可以得到一个sql文件,这个sql文件包含数据库中的所有表table,以及sql的create、drop等数据结构。

三、本地测试一下sql

在真实的云数据库迁移入数据前,我们要在本地数据库中进行测试一下sql文件是否能真正实现我们想要的数据迁移。

本地测试需要本地安装并启动mysql,最快的方式是使用docker,这是我喜欢的一种高效方案,如何在本地电脑上通过docker安装和启动mysql,docker中使用mysql的方案,大家可以去docker网站上看一下,我还没写文章记录,不过之前我记录过在Mac上安装mysql的记录,大家可以参考我之前的文章:https://www.xinwei.ltd/article/24

另外,我们同时也需要mysql的可视化查看软件,自从之前使用navida的软件被提醒要收费之后,我就在使用mysql workbench这个官方软件,大家可以自行下载,下面的截图是mysql workbench。

我们可以在mysql workbench中导入和执行mysql文件。

四、可能出现的问题

4.1 外键问题

mysql execute Error Code: 1215. Cannot add foreign key constraint 0.055 sec

这个问题就是在生成sql文件的时候,如果没有勾选“是否禁止外键约束”,就有可能导致这个问题,有的table在create的时候,含有外键,但是外键对应的table并没有create,所以必须在sql中先禁止外键约束。

4.2 database没有生成的问题

mysql workbench 1046

23:58:35 DROP TABLE IF EXISTS article Error Code: 1046. No database selected Select the default DB to be used by double-clicking its name in the SCHEMAS list in the sidebar. 0.018 sec

本地启动mysql服务后,通过mysql workbench连接了mysql,但是我们查看mysql的数据库,却并没有我们在之前数据库中的database,截图左侧只有默认的数据库。那么我们要新增一个和之前数据库同名的数据库。

create database

点击新增的数据库,然后导入并执行sql文件:
execute sql

以上截图执行完sql后,数据库中已经有了各种表table了。

说明sql文件没有问题了。

五、云数据库导入

我购买了一台云数据库后,登入到该数据库的云平台管理界面,和之前的管理界面类似。

old cloud database page

new cloud database page

在“导入导出”选项中导入之前生成的sql文件,并且执行后就会和我们之前在本地测试的结果一样,各种table和数据都创建好了。

当我们在服务器的代码连接mysql处,修改旧的数据库内网ip,换成新的云数据库内网ip,确认数据库的连接username和password后,重新更新服务器的部署。

接下来我们在线上进行测试,直接新写一篇文章,看服务器和数据库的交互是否有问题。

六、线上测试

在网站平台上随便写一个文章
test mysql and server
测试发布和显示都没有问题。

云数据库中进行检索
cloud mysql check

发现数据也是正常的。

那么这次的数据库迁移工作算是完成了,这只是一个最基础的不安全的数据库迁移操作,不管怎样,希望对有需要的同学有借鉴意义就行。

也请大家多多关注公众号“新卫网络科技”。

评论列表
全栈老韩·
欢迎讨论