Magento 2: Таблица catalog_product_index_eav_temp и другие temp таблицы
Во время реиндекса большой базы интернет магазина на платформе Magento 2 столкнулся с одной очень интересной таблицей catalog_product_index_eav_temp, о ней и будет сегодняшняя заметка..
Предистория
Из-за большого беклога в change log таблице, было решено не ждать Mview реиндекса, а запустить ручной, вот так
1 2 3 |
php bin/magento indexer:reindex catalog_product_attribute |
Список кодов индексеров и их названий
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ 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 и затем запускаем вывод стека выполнения или логируем его в файл. Я предпочитаю последнее. Вся команда выглядит так:
1 2 3 |
sudo strace -p 112233 -s 1024 -o strace.log |
- -p <PID> = номер процесса
- -s <SIZE> = кол-во сиволов в строке
- -o <FILE> = путь к файлу, если хотим перенаправить вывод в файл
Далее ждем 2-3 минуты, прерываем выполнение и смотрим что там записалось. Я увидел там некоторые SELECT и вот примерно такой INSERT
1 2 3 |
INSERT INTO `catalog_product_index_eav_temp` SELECT `u`.* FROM ( (SELECT DISTINCT `cpe`.`entity_id`, `dd`.`attribute_id`... |
Отлично подумал я, это как раз новая таблица, которая после окончания просто заменит собой старую. Вот я и решил пойти и посмотреть сколько там в этой таблице данных, чтобы понять сколько уже сделанно и сколько еще ждать.
Однако, к моему удивлению, я не нашел такой таблицы в базе. Хмм...
Развязка
Оказалось, что это временная таблица. Такие таблицы создаются командой
1 2 3 |
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 theTEMPORARY
keyword when creating a table. ATEMPORARY
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 минут, после того как я разобрался во всем этом.
Author: | Tags: /
| Rating:
Leave a Reply