[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f7s7WnB8rk41N2yXzVigSIvRoUCzNhgaN7WpjToNvks4":3},{"code":4,"message":5,"data":6},200,"成功",{"id":7,"createdAt":8,"title":9,"content":10,"summary":11,"image":12,"uid":13,"user":14,"categoryId":21,"category":22,"subCategoryId":24,"subCategory":25,"comments":27,"status":17,"reason":33,"notice":33,"visitCount":38,"commentCount":17,"keywords":39},153,"2025-03-02T08:48:23.253Z","数据库database迁移及迁移过程可能出现的issue","这篇文章记录一下我在某云平台上迁移数据库的过程，虽然是一个小的不太正式的数据迁移，但是也可能对一些同学有参考价值，与众位共享。\n\n## 一、背景\n我在某云服务器平台上部署了服务器和mysql轻量数据库，但是面临数据库即将到期，而暂时没有找到一个优惠套餐的情况下，我决定直接重新购买一个便宜的云数据库来迁移migrate我的轻量数据库，所以有了这次的过程记录。\n\n虽然云平台上有很多数据库续费、升级、数据迁移服务，但是我为了省钱所以选择了最直接的方案，就是直接购买一个便宜的云数据库，然后直接把数据迁移过去就好了。当然是在我的数据量比较小，而且用户pv不多的情况下。如果是数据量大，pv/uv大的情况下，就必须考虑其他方案，会更稳妥安全，避免实时数据丢失。\n\n## 二、过程\n首先我们登录该云平台的数据库管理，在数据库管理页面，可以看到有迁移数据库数据的一些选项。\n![database export choice](https://image.xinwei.ltd/db_11740902887894.png)\n\n如上截图所示，在“数据管理”选项下有“数据导出”选项，我们点击后：\n\n![data export](https://image.xinwei.ltd/db_21740902950092.png)\n\n在该截图中，\n- 我们选择要导出的数据库，\n- 然后选择最大的行数，也就是100000行，\n- 文件类型是SQL，\n- 编码我们最好选择utf8mb4，因为这个是兼容emoji表情符号的，\n- 导出内容自然是要“数据和结构”，\n- 导出对象选择全选，\n- “其他选项”我使用“在CREATE语句前生成DROP语句”，这样子在生成表的时候，会最先drop，然后再create，防止sql语句create报错，\n- 数据选项，这2个选项都勾选，其中要注意，“是否禁止外键约束”这个选项要勾选，否则sql导出语句在执行时，就有可能导致外键创建时，而对应的table却没有create，导致sql执行失败。\n- 这样子，我们可以得到一个sql文件，这个sql文件包含数据库中的所有表table，以及sql的create、drop等数据结构。\n\n## 三、本地测试一下sql\n在真实的云数据库迁移入数据前，我们要在本地数据库中进行测试一下sql文件是否能真正实现我们想要的数据迁移。\n\n本地测试需要本地安装并启动mysql，最快的方式是使用docker，这是我喜欢的一种高效方案，如何在本地电脑上通过docker安装和启动mysql，docker中使用mysql的方案，大家可以去docker网站上看一下，我还没写文章记录，不过之前我记录过在Mac上安装mysql的记录，大家可以参考我之前的文章：[https://www.xinwei.ltd/article/24](https://www.xinwei.ltd/article/24)\n\n另外，我们同时也需要mysql的可视化查看软件，自从之前使用navida的软件被提醒要收费之后，我就在使用mysql workbench这个官方软件，大家可以自行下载，下面的截图是mysql workbench。\n\n我们可以在mysql workbench中导入和执行mysql文件。\n\n## 四、可能出现的问题\n### 4.1 外键问题\n> mysql execute Error Code: 1215. Cannot add foreign key constraint\t0.055 sec\n\n这个问题就是在生成sql文件的时候，如果没有勾选“是否禁止外键约束”，就有可能导致这个问题，有的table在create的时候，含有外键，但是外键对应的table并没有create，所以必须在sql中先禁止外键约束。\n\n### 4.2 database没有生成的问题\n![mysql workbench 1046](https://image.xinwei.ltd/db_31740903469038.png)\n> 23:58:35\tDROP TABLE IF EXISTS `article`\tError Code: 1046. No database selected Select the default DB to be used by double-clicking its name in the SCHEMAS list in the sidebar.\t0.018 sec\n\n本地启动mysql服务后，通过mysql workbench连接了mysql，但是我们查看mysql的数据库，却并没有我们在之前数据库中的database，截图左侧只有默认的数据库。那么我们要新增一个和之前数据库同名的数据库。\n\n![create database](https://image.xinwei.ltd/db_41740904616878.png)\n\n点击新增的数据库，然后导入并执行sql文件：\n![execute sql](https://image.xinwei.ltd/db_51740904653741.png)\n\n以上截图执行完sql后，数据库中已经有了各种表table了。\n\n说明sql文件没有问题了。\n\n## 五、云数据库导入\n我购买了一台云数据库后，登入到该数据库的云平台管理界面，和之前的管理界面类似。\n旧\n![old cloud database page](https://image.xinwei.ltd/db_61740904799470.png)\n新\n![new cloud database page](https://image.xinwei.ltd/db_71740904834512.png)\n\n在“导入导出”选项中导入之前生成的sql文件，并且执行后就会和我们之前在本地测试的结果一样，各种table和数据都创建好了。\n\n当我们在服务器的代码连接mysql处，修改旧的数据库内网ip，换成新的云数据库内网ip，确认数据库的连接username和password后，重新更新服务器的部署。\n\n接下来我们在线上进行测试，直接新写一篇文章，看服务器和数据库的交互是否有问题。\n\n## 六、线上测试\n在网站平台上随便写一个文章\n![test mysql and server](https://image.xinwei.ltd/db_91740905121881.png)\n测试发布和显示都没有问题。\n\n云数据库中进行检索\n![cloud mysql check](https://image.xinwei.ltd/db_81740904906194.png)\n\n\n发现数据也是正常的。\n\n那么这次的数据库迁移工作算是完成了，这只是一个最基础的不安全的数据库迁移操作，不管怎样，希望对有需要的同学有借鉴意义就行。\n\n也请大家多多关注公众号“新卫网络科技”。\n\n\n\n\n\n\n\n\n\n\n\n","这篇文章记录一下我在某云平台上迁移数据库的过程，虽然是一个小的不太正式的数据迁移，但是也可能对一些同学有参考价值，与众位共享。","https://image.xinwei.ltd/db_11740902887894.png",499668042977349,{"phone":15,"userId":13,"nickName":16,"vipType":17,"avatar":18,"sign":19,"createdAt":20},"13121171998","全栈老韩",1,"https://image.xinwei.ltd/images/IMG_5430.JPG","全栈工程师，擅长iOS App开发、前端（vue、react、nuxt、小程序&Taro）开发、Flutter、React Native、后端（midwayjs、golang、express、koa）开发、docker容器、seo优化等。","2024-01-01T16:14:30.305Z",2,{"id":21,"name":23},"IT技术",38,{"id":24,"name":26,"parentId":21},"数据库",[28],{"id":29,"createAt":30,"content":31,"articleId":7,"userId":13,"user":32,"replyToUid":34,"replyToUser":35,"status":17,"statusDes":33,"replies":37},19,"2026-02-06T10:16:34.124Z","欢迎讨论",{"phone":15,"userId":13,"nickName":16,"vipType":17,"avatar":18,"sign":33,"createdAt":20},"",0,{"phone":33,"userId":34,"nickName":33,"vipType":34,"avatar":33,"sign":33,"createdAt":36},"0001-01-01T00:00:00Z",null,137,"database migrate,mysql migrate,database dump file,mysql dump file"]