数据库中的更改未反映在店面上
本文提供了避免在应用实体更新时出现延迟或中断的解决方案。 这包括如何避免更改日志表变得过大,以及如何设置MySQL表触发器。
受影响的产品和版本:
- 云基础架构上的Adobe Commerce 2.2.x、2.3.x
- Adobe Commerce内部部署2.2.x、2.3.x
问题
您在数据库中所做的更改不会反映在店面上,或者在应用实体更新时出现严重延迟。 可能受影响的实体包括产品、类别、价格、库存、目录规则、销售规则和目标规则。
原因
如果索引器被配置为按计划更新,则问题可能是由一个或多个更改日志过大或未设置MySQL触发器的表导致的。
超大的更改日志表
如果indexer_update_all_views
cron作业多次未成功完成,则更改日志表将变得很大。
更改日志表是用来跟踪实体更改的数据库表。 只要不应用更改,记录就会存储在更改日志表中,该更改由indexer_update_all_views
cron作业执行。 Adobe Commerce数据库中有多个更改日志表,它们按照以下模式命名: INDEXER_TABLE_NAME + '_cl',例如catalog_category_product_cl
、catalog_product_category_cl
。 您可以在我们的开发人员文档中的索引概述> Mview一文中找到有关如何在数据库中跟踪更改的更多详细信息。
MySQL数据库触发器未设置
如果在添加或更改实体(产品、类别、目标规则等)之后,没有向相应的更改日志表添加记录,则您可能会怀疑数据库触发器未设置。
解决方案
避免更改日志表过大
确保indexer_update_all_views
cron作业始终成功完成。
您可以使用以下SQL查询获取indexer_update_all_views
cron作业的所有失败实例:
select * from cron_schedule where job_code = "indexer_update_all_views" and status
<> "success" and status <> "pending";
或者,您可以通过搜索indexer_update_all_views
条目来在日志中检查其状态:
<install_directory>/var/log/cron.log
— 适用于版本2.3.1+和2.2.8+<install_directory>/var/log/system.log
— 对于早期版本
重新设置MySQL表触发器
要设置缺少的MySQL表触发器,您需要重新设置索引器模式:
- 切换到“保存时”。
- 切换回“按计划”。
使用以下命令执行此操作。
php bin/magento indexer:set-mode {realtime|schedule} [indexerName]