系统升级数据库错误:migrate error

升级为什么会有数据库错误?

系统升级:

  • 系统文件的升级:代码文件的更新,新增代码文件
  • 数据库升级:新增数据表,更新表结构

如果您的数据库的数据表数据非常多,譬如:图片附件表,商品表,当商品几十万,甚至上百万条,当更新图片附件表,商品表的表结构,那么时间将会非常长, 当超出最大时间,那么mysql连接就会断开,进而出现问题(有的用户的商品表数据几百万,甚至上千万条,表结构结构更新,需要长达十几分钟才能完成)

超时进而出现问题:

  • 等待十几分钟后,数据库的表结构更新完成了
  • 但是,因为超时,migrate记录表,记录sql没有执行成功
  • 再次强制更新,将会重复执行表结构升级,但是这个更新的字段已经存在了,进而报错:migrate error

对于基础表(譬如:图片附件表,商品表),我们很少更新,但有时候逻辑需要也会更新

  • 譬如:liquid模版,图片进行懒加载(先渲染页面内容,然后加载图片),但是图片在渲染前后会导致页面的高度发生变化,因此需要提前记录图片的宽高比,提前撑起来页面的高度和宽度,图片加载后无缝替换
  • 进而解决页面渲染过程中的偏移问题,这就需要在表里面加字段记录宽高比数据

解决migrate error

解决这个问题,需要您有一定的mysql操作能力,否则不要自己操作,联系fecify技术帮您操作

  • 切记!不懂mysql不要自己操作数据库
  • 切记!不懂mysql不要自己操作数据库
  • 切记!不懂mysql不要自己操作数据库

1.通过宝塔,phpmyadmin,进入数据库,打开表:fecify_migration

2.进入宝塔,点击菜单:文件,打开文件列表

3.sql升级原理解析:

  • 系统升级,会遍历文件夹:fecpx/migrations/mysqldb/ 里面的sql文件,如果该文件的名称,在表:fecify_migration中存在,那么将不执行,如果不存在,那么将执行该sql文件
  • sql文件执行后,将会在fecify_migration中插入一条记录, 然后继续执行下一个sql文件直至完成
  • 如果sql执行超时(表结构更改sql,执行十几分钟后),那么将会出现:sql执行完成了,但是表:fecify_migration中没有插入记录(超时退出了),那么升级sql将会在这里断掉,后续的sql将没有执行
  • 因此,如果发生sql执行超时的情况,如果重新强制升级,系统将重新执行升级逻辑。由于超时的sql在fecify_migration中没有插入记录,但是实际在mysql已经执行了(更改了表结构),那么这个时候将会报错:migrate error

4.通过sql升级解析,我们明白了出现这个报错的原因,下面是解决方法:

  • 假设:数据表:fecify_migration,里面找到的最后一条记录是:m250915_014259_fecify_tables,那么我们在上图找到相应的文件(如上图),这是一条执行完成的sql文件
  • m250915_014259_fecify_tables的下一个sql文件是:m250915_014503_fecify_tables.php,我们双击这个文件打开,如下图:

5.我们进入表:fecify_shop_product_variant_image(注意:如果您的数据表多,表结构更新可能十几分钟的情况,您需要等一段时间,让数据库执行完这个sql,也就是升级出现报错后,等10分钟左右,或者以上)

  • 我们可以看到执行的sql:ALTER TABLEfecify_shop_product_variant_imageADD COLUMNheightint(11) NOT NULL DEFAULT 0 COMMENT '' AFTERwidth;
  • 进入表:fecify_shop_product_variant_image,查看height字段是否存在,如果存在,则说明这个sql已经执行了
  • sql已经执行,但是migration记录表:fecify_migration,没有这个记录,那么就需要我们手动给加上这个记录

5.1可以通过复制按钮的方式添加记录:

如下图,点击复制按钮

5.2您也可以直接执行sql,添加记录

  • 本质都是一样的

5.3进入服务端后台,强制升级

  • 如果升级过程中不再报错,则说明升级成功
  • 升级完成后,到前台商城进行测试,从首页开始,进行商品下单,看看有没有报错,订单流程畅通,则升级成功

通过上面,我们将超时的sql处理好了,您可以在服务端后台,进行强制升级,如果出现migrate error的报错,则继续执行上面的逻辑,然后再强制升级。

全部手动执行sql

您也可以一次性手动执行全部的sql,然后再执行强制升级。

1.续接上面的步骤,可以看到还有3个sql文件,我们依次打开这三个sql文件

查看sql文件里面的sql代码,复制出来,到mysql中手动执行

2.到migration记录表:fecify_migration,依次添加记录

  • 最终执行的sql文件,在fecify_migration表中都有相应的记录

3.进入服务端后台,强制升级

  • 如果升级过程中不再报错,则说明升级成功
  • 升级完成后,到前台商城进行测试,从首页开始,进行商品下单,看看有没有报错,订单流程畅通,则升级成功

!!!注意:执行过程中要心细,不要漏掉sql,否则会发生报错。

Copyright © fecify.com 2025 all right reserved,powered by Gitbook该文件修订时间: 2025-10-18 21:02:35

results matching ""

    No results matching ""