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

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

系统升级:

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

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

超时进而出现问题:

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

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

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

解决migrate error

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

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

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

表数据记录说明:

  • 表:fecify_migration,记录的是执行完成的sql文件的名称(文件夹:fecpx/migrations/mysqldb/ 下的sql文件)
  • 表的最后一行记录数据,对应,最后一个执行完成的sql文件
  • 如果sql文件名称,没有在表:fecify_migration 里面记录,则系统升级的时候,将自动执行sql文件

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

  • 表:fecify_migration的最后一条记录,migrations文件夹下,找到对应的sql文件

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是否执行,这样会更准确一些)

  • 我们可以看到执行的sql:ALTER TABLE fecify_shop_product_variant_image ADD COLUMN height int(11) NOT NULL DEFAULT 0 COMMENT '' AFTER width;
  • 进入表:fecify_shop_product_variant_image,查看height字段是否存在,如果存在,则说明这个sql已经执行了
  • 有的文件里面,可能存在多条sql,您需要依次检查,如果sql没有执行,则需要手动执行。最终保证这个文件里面的sql都执行完成。
  • sql已经执行完成,但是migration记录表:fecify_migration,没有这个记录,那么就需要我们手动给加上这个记录

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

如下图,点击复制按钮

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

  • 本质都是一样的

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

  • 如果升级过程中不再报错,则说明升级成功
  • 如果升级过程中出现migrate error,则可以重复上面的步骤(可能执行的下一个sql,也超时退出了,就会继续报错:migrate error)
  • 升级完成后,到前台商城进行测试,从首页开始,进行商品下单,看看有没有报错,订单流程畅通,则升级成功

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

全部手动执行sql

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

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

  • 这三个sql文件,在表:fecify_migration中没有数据记录
  • 我们可以手动执行这3个文件里面的sql,然后到表:fecify_migration里面手动加上相应的记录就可以了

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

  • 这几个文件里面的sql,依次到mysql中执行

2.到migration记录表:fecify_migration,依次添加记录(将手动执行sql对应的几个文件名称,添加到表:fecify_migration

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

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

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

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

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

results matching ""

    No results matching ""