【问题标题】:Magento causes deadlock in mariadbMagento 在 mariadb 中导致死锁
【发布时间】:2018-02-16 03:47:45
【问题描述】:

当我使用 MySQL5.5 数据库多年时,我的 Magento(Vesion 1.8.0.0) 网站运行没有任何问题。最近迁移到 mariadb-server-10.2 后(使用 sqldump 导出数据,然后在新的 mariadb 服务器上导入),很多时候 PHP 子进程处于等待状态,直到 max_execution_time 到期,最后 php-fpm 停止响应。

经过调查,我发现所有 php 子进程都在等待数据库查询。我最近遇到问题时检查了mariadb上的进程列表,输出如下。知道如何解决这个问题吗?提前致谢。

MariaDB [(none)]> 显示进程列表; +--------+-------------+-------------- -----+---------+---------+------+------ -------------+------------------------------------ ---------------------------------- ---------------- ----------------+----------+ |身份证 |用户 |主持人 |分贝 |命令 |时间 |状态 |信息 |进展 | +--------+-------------+-------------- -----+---------+---------+------+------ -------------+------------------------------------ ---------------------------------- ---------------- ----------------+----------+ | 1 |系统用户 | |空 |守护进程 |空 | |空 | 0.000 | | 2 |系统用户 | |空 |守护进程 |空 | |空 | 0.000 | | 4 |系统用户 | |空 |守护进程 |空 | |空 | 0.000 | | 3 |系统用户 | |空 |守护进程 |空 | |空 | 0.000 | | 5 |系统用户 | |空 |守护进程 |空 | InnoDB 关闭处理程序 |空 | 0.000 | | 109822 |目录 | mymagentositexxxxxx.com:56405 |目录 |查询 | 985 |更新 |插入`cataloginventory_stock_status`(`product_id`、`website_id`、`stock_id`、`qty`、`stock_statu | 0.000 | | 109850 |目录 | mymagentositexxxxxx.com:56436 |目录 |查询 | 985 |更新 |插入`cataloginventory_stock_status`(`product_id`、`website_id`、`stock_id`、`qty`、`stock_statu | 0.000 | | 109859 |目录 | mymagentositexxxxxx.com:56448 |目录 |查询 | 985 |更新 |插入`cataloginventory_stock_status`(`product_id`、`website_id`、`stock_id`、`qty`、`stock_statu | 0.000 | | 109931 |目录 | mymagentositexxxxxx.com:56554 |目录 |查询 | 986 |等待表级锁 |从 `catalogsearch_fulltext` 删除 WHERE (store_id=1) AND (product_ id IN ('26515')) | 0.000 | | 109966 |目录 | mymagentositexxxxxx.com:56606 |目录 |查询 |第984章等待表级锁 | INSERT INTO `catalogsearch_result` SELECT 33218 AS `query_id`, `s`.`product_id`, 0 AS `relevance` FR | 0.000 | | 109993 |目录 | mymagentositexxxxxx.com:56645 |目录 |查询 |第934章更新 |插入`sales_flat_quote_item`(`quote_id`、`created_at`、`updat ed_at`、`product_id`、`store_id | 0.000 | | 109997 |目录 | mymagentositexxxxxx.com:56650 |目录 |查询 | 987 |发送数据 | INSERT INTO `catalogsearch_result` SELECT 33215 AS `query_id`, `s`.`product_id`, 0 AS `relevance` FR | 0.000 | | 110040 |目录 | mymagentositexxxxxx.com:56709 |目录 |查询 | 983 |等待表级锁 | INSERT INTO `catalogsearch_result` SELECT 33215 AS `query_id`, `s`.`product_id`, 0 AS `relevance` FR | 0.000 | | 110218 |目录 | mymagentositexxxxxx.com:56925 |目录 |查询 | 940 |等待表级锁 | INSERT INTO `catalogsearch_result` SELECT 6656 AS `query_id`, `s`.`product_id`, 0 AS `relevance` FRO | 0.000 | | 110248 |目录 | mymagentositexxxxxx.com:56956 |目录 |查询 |第932章等待表级锁 | INSERT INTO `catalogsearch_result` SELECT 33220 AS `query_id`, `s`.`product_id`, 0 AS `relevance` FR | 0.000 | | 110380 |目录 | mymagentositexxxxxx.com:57095 |目录 |查询 | 906 |等待表级锁 | INSERT INTO `catalogsearch_result` SELECT 33214 AS `query_id`, `s`.`product_id`, 0 AS `relevance` FR | 0.000 | | 110392 |目录 | mymagentositexxxxxx.com:57107 |目录 |查询 | 905 |等待表级锁 | INSERT INTO `catalogsearch_result` SELECT 33215 AS `query_id`, `s`.`product_id`, 0 AS `relevance` FR | 0.000 | | 110810 |目录 | mymagentositexxxxxx.com:57554 |目录 |查询 |第825章等待表级锁 | INSERT INTO `catalogsearch_result` SELECT 6656 AS `query_id`, `s`.`product_id`, 0 AS `relevance` FRO | 0.000 | | 110865 |目录 | mymagentositexxxxxx.com:57616 |目录 |查询 | 808 |等待表级锁 | INSERT INTO `catalogsearch_result` SELECT 21581 AS `query_id`, `s`.`product_id`, 0 AS `relevance` FR | 0.000 | | 110968 |目录 | mymagentositexxxxxx.com:57782 |目录 |查询 | 48 |更新 |插入`sales_flat_quote_item`(`quote_id`、`created_at`、`updat ed_at`、`product_id`、`store_id | 0.000 | | 110969 |目录 | mymagentositexxxxxx.com:57783 |目录 |查询 | 48 |更新 |插入`sales_flat_quote_item`(`quote_id`、`created_at`、`updat ed_at`、`product_id`、`store_id | 0.000 | | 110989 |目录 | mymagentositexxxxxx.com:57803 |目录 |查询 | 39 |更新 |插入`sales_flat_quote_item`(`quote_id`、`created_at`、`updat ed_at`、`product_id`、`store_id | 0.000 | | 110999 |目录 | mymagentositexxxxxx.com:57813 |目录 |查询 | 34 |更新 |插入`sales_flat_quote_item`(`quote_id`、`created_at`、`updat ed_at`、`product_id`、`store_id | 0.000 | | 111012 |目录 | mymagentositexxxxxx.com:57867 |目录 |查询 | 32 |更新 |插入`sales_flat_quote_item`(`quote_id`、`created_at`、`updat ed_at`、`product_id`、`store_id | 0.000 | | 111067 |目录 | mymagentositexxxxxx.com:57959 |目录 |查询 | 18 |更新 |插入`sales_flat_quote_item`(`quote_id`、`created_at`、`updat ed_at`、`product_id`、`store_id | 0.000 | | 111077 |目录 | mymagentositexxxxxx.com:57974 |目录 |查询 | 15 |更新 |插入`sales_flat_quote_item`(`quote_id`、`created_at`、`updat ed_at`、`product_id`、`store_id | 0.000 | | 111078 |根 |本地主机 |空 |查询 | 0 |初始化 |显示进程列表 | 0.000 | | 111117 |目录 | mymagentositexxxxxx.com:58015 |目录 |查询 | 10 |等待表级锁 | INSERT INTO `catalogsearch_result` SELECT 13226 AS `query_id`, `s`.`product_id`, 0 AS `relevance` FR | 0.000 | | 111147 |穆勒 | mymagentositexxxxxx.com:58046 |穆勒 |睡眠 | 0 | |空 | 0.000 | +--------+-------------+-------------- -----+---------+---------+------+------ -------------+------------------------------------ ---------------------------------- ---------------- ----------------+----------+ 一组 29 行(0.00 秒)

#update2 处于等待状态的表的“显示创建表输出”如下

MariaDB [目录]> 显示创建表目录搜索全文; +------------------------+------------ -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -----------------+ |表 |创建表 | +------------------------+------------ -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -----------------+ |目录搜索_全文 |创建表`catalogsearch_fulltext`( `product_id` int(10) unsigned NOT NULL COMMENT '产品 ID', `store_id` smallint(5) unsigned NOT NULL COMMENT 'Store ID', `data_index` longtext DEFAULT NULL COMMENT '数据索引', `fulltext_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Entity ID', 主键(`fulltext_id`), 唯一键 `UNQ_CATALOGSEARCH_FULLTEXT_PRODUCT_ID_STORE_ID`(`product_id`,`store_id`), 全文键 `FTI_CATALOGSEARCH_FULLTEXT_DATA_INDEX` (`data_index`) ) ENGINE=MyISAM AUTO_INCREMENT=912741 DEFAULT CHARSET=utf8 COMMENT='目录搜索结果表' | +------------------------+------------ -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -----------------+ 一组中的 1 行(0.00 秒) MariaDB [目录]> 显示创建表目录搜索结果; +---------------------+-------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------+ |表 |创建表 | +---------------------+-------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------+ |目录搜索结果 |创建表`catalogsearch_result`( `query_id` int(10) unsigned NOT NULL COMMENT '查询 ID', `product_id` int(10) unsigned NOT NULL COMMENT '产品 ID', `relevance` 十进制(20,4) NOT NULL DEFAULT 0.0000 COMMENT 'Relevance', 主键(`query_id`,`product_id`), KEY `IDX_CATALOGSEARCH_RESULT_QUERY_ID`(`query_id`), KEY `IDX_CATALOGSEARCH_RESULT_PRODUCT_ID`(`product_id`), CONSTRAINT `FK_CATALOGSEARCH_RESULT_QUERY_ID_CATALOGSEARCH_QUERY_QUERY_ID` FOREIGN KEY (`query_id`) REFERENCES `catalogsearch_query` (`query_id`) ON DELETE CASCADE ON UPDATE CASCADE, 约束 `FK_CATSRCH_RESULT_PRD_ID_CAT_PRD_ENTT_ENTT_ID` 外键 (`product_id`) 参考 `catalog_product_entity` (`entity_id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='目录搜索结果表' | +---------------------+-------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------+ 一组中的 1 行(0.00 秒)

【问题讨论】:

  • 请为提到的每个带有“表级锁”的表提供SHOW CREATE TABLE
  • @RickJames,我已经用两个正在等待“表级锁定”的表的“SHOW CREATE TABLE”输出更新了这个问题
  • 我还检查了表“cataloginventory_stock_status”的“SHOW CREATE TABLE”。它正在使用 InnoDB。使用不同的引擎是否会导致问题?

标签: mysql magento mariadb


【解决方案1】:

时间最长的进程(#109997)正在触摸那个 MyISAM 表?做了SHOW FULL PROCESSLIST之后,我明白了

INSERT
     INTO  `catalogsearch_result` 
SELECT  11474 AS `query_id`, `s`.`product_id`, 0 AS `relevance`
    FROM  `catalogsearch_fulltext` AS `s`
    INNER JOIN  `catalog_product_entity` AS `e`  ON e.entity_id = s.product_id
    WHERE  (s.store_id = 1)
      AND  ((`s`.`data_index` LIKE '%Informaatika%'
         OR  `s`.`data_index` LIKE '%8.c%')
           )  ON DUPLICATE KEY 
UPDATE  `relevance` = VALUES(`relevance`)

这是一个最近才开始的缓慢SELECT。由于我们正在讨论 MyISAM,并且正在撰写文章,因此查询将一次发生一个(大多数情况下)。

由于ORLIKE 测试中的前导 通配符,它​​很慢。您有什么方法可以避免两个这些问题吗?有了它们,SELECT 必须扫描整个表,这显然需要几分钟。 (桌子有多大?)

更改超时可能会让您超过一个实例,但随后只会让您处于一个永无止境的查询序列中,等待其他查询完成。

最好的解决方案是远离 MyISAM。更多提示:http://mysql.rjweb.org/doc.php/myisam2innodb

(即使转换后,也可能存在其他问题。)

【讨论】:

  • 由于这里不能放'Show full processlist'的输出,我把它放在git hub - gist.github.com/anonymous/4c2d6bfe8b45bcf4fed60f225f251075
  • 你问的插入查询是 INSERT INTO catalogsearch_result SELECT 6656 AS query_id, s.product_id, 0 AS relevance FROM catalogsearch_fulltext AS s INNER JOIN @ 987654336@ AS e ON e.entity_id = s.product_id WHERE (s.store_id = 1) AND ((s.data_index LIKE '%informaatika%')) 重复键更新relevance = VALUES( relevance)
  • 设置任何超时值,如 'lock_wait_timeout' 会解决问题吗?现在超时值相当大 - 默认值为 86400。
  • 我主要根据完整的查询重写了我的答案。
  • 是的,表 'catalogsearch_fulltext' 有 18998 条记录,所有记录的 store_id=1。每个记录的 data_index 都很大。所以当你发现这将是一个非常慢的 sql 操作。我不明白的是,为什么我在使用 MySQL 时没有遇到这些问题。 MySQL 中的一些默认设置拯救了我。感谢您的回答。我会问 Magento 人如何摆脱这个查询。
猜你喜欢
  • 2021-01-14
  • 2018-04-20
  • 2012-09-20
  • 2018-06-04
  • 2016-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
相关资源
最近更新 更多