X

Magento 2: Таблица catalog_product_index_eav_temp и другие temp таблицы

Во время реиндекса большой базы интернет магазина на платформе Magento 2 столкнулся с одной очень интересной таблицей catalog_product_index_eav_temp, о ней и будет сегодняшняя заметка..

Предистория

Из-за большого беклога в change log таблице, было решено не ждать Mview реиндекса, а запустить ручной, вот так

php bin/magento indexer:reindex catalog_product_attribute

Список кодов индексеров и их названий

$ php bin/magento indexer:info
design_config_grid                       Design Config Grid
customer_grid                            Customer Grid
catalog_product_flat                     Product Flat Data
catalog_category_flat                    Category Flat Data
catalog_category_product                 Category Products
catalog_product_category                 Product Categories
catalogrule_rule                         Catalog Rule Product
catalog_product_attribute                Product EAV
cataloginventory_stock                   Stock
catalog_product_price                    Product Price
catalogrule_product                      Catalog Product Rule
catalogsearch_fulltext                   Catalog Search
targetrule_product_rule                  Product/Target Rule
targetrule_rule_product                  Target Rule/Product
salesrule_rule                           Sales Rule

И процесс реиндекса затянулся. После примерно 1.5 часа ожидания, я решил проверить все ли ок с процессом и заглянул в стек выполнения при помощи strace ( https://man7.org/linux/man-pages/man1/strace.1.html ). Пользоваться не сложно, ищем id процесса, я использую для этого htop и затем запускаем вывод стека выполнения или логируем его в файл. Я предпочитаю последнее. Вся команда выглядит так:

sudo strace -p 112233 -s 1024 -o strace.log
  • -p <PID> = номер процесса
  • -s <SIZE> = кол-во сиволов в строке
  • -o <FILE> = путь к файлу, если хотим перенаправить вывод в файл

Далее ждем 2-3 минуты, прерываем выполнение и смотрим что там записалось. Я увидел там некоторые SELECT и вот примерно такой INSERT

INSERT INTO `catalog_product_index_eav_temp` SELECT `u`.* FROM ( (SELECT DISTINCT  `cpe`.`entity_id`, `dd`.`attribute_id`...

Отлично подумал я, это как раз новая таблица, которая после окончания просто заменит собой старую. Вот я и решил пойти и посмотреть сколько там в этой таблице данных, чтобы понять сколько уже сделанно и сколько еще ждать.

Однако, к моему удивлению, я не нашел такой таблицы в базе. Хмм...

Развязка

Оказалось, что это временная таблица. Такие таблицы создаются командой

CREATE TEMPORARY TABLE new_tbl SELECT * FROM orig_tbl LIMIT 0;

и их особенность в  том, что они уникальны внутри одной сессии подключения. Т.е. у моего индексера своя сессия и своя таблица catalog_product_index_eav_temp. Если я подключучсь к базе, то я не увижу ее, более того я могу создать параллельно свою таблицу с таким же именем и работать с ней.

13.1.20.2 CREATE TEMPORARY TABLE Statement
You can use the TEMPORARY keyword when creating a table. A TEMPORARY table is visible only within the current session, and is dropped automatically when the session is closed. This means that two different sessions can use the same temporary table name without conflicting with each other or with an existing non-TEMPORARY table of the same name. (The existing table is hidden until the temporary table is dropped.)

https://dev.mysql.com/doc/refman/8.0/en/create-temporary-table.html

Т.к. таблица создана индексером, я не мог увидеть и подсчитать данные которые уже находятся в ней.

В общем мне оставалось только ждать. К моему счастью, индексер закончил работу всего через 5 минут, после того как я разобрался во всем этом.