系统升级数据库错误: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 TABLE
fecify_shop_product_variant_imageADD COLUMN
heightint(11) NOT NULL DEFAULT 0 COMMENT '' AFTER
width;
- 进入表: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,否则会发生报错。