При обновлении с версии mysql 5.1 до 5.7 при последовательном запуске запросов DDL с помощью сценария perl застревает причина "Ожидание блокировки метаданных таблицы".
У меня есть Perl-скрипт, который использует DBD::mysql и выполняет такие операции, как создание таблиц, а также выполняет вставку, обновление, изменение, удаление запросов выбора над ними. Данные загружаются сюда из XML-файла. Я здесь пытаюсь обновить с MySQL 5.1 до MySQL 5.7. И я столкнулся с проблемой, как загрузка застревает при использовании этого сценария.
Когда проверено на show processlist
выход как показано ниже:
mysql> show full processlist;
+----+------+-----------+---------+---------+------+---------------------------------+----------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+---------+---------+------+---------------------------------+----------------------------+
| 14 | test | localhost | REGRESS | Sleep | 17 | | NULL |
| 15 | test | localhost | REGRESS | Query | 16 | Waiting for table metadata lock | OPTIMIZE TABLE TEST.SOURCE |
| 16 | test | localhost | NULL | Query | 0 | starting | show full processlist |
+----+------+-----------+---------+---------+------+---------------------------------+----------------------------+
Я не сталкивался с этой проблемой при использовании MySQL 5.1.
Здесь для каждого запроса, который мы выполняем, прежде чем запрос выполняется, autocommit
установлен в 0
кроме вставки и удаления, мы не выполняем коммит после выполнения запроса.
Я хотел бы знать, является ли это ошибкой в последней версии MySQL, или какими-либо изменениями, которые мне нужно внести в мой код для выполнения ручной фиксации даже после select
запрос запускается из другого сеанса в моем скрипте (см. комментарий: https://dev.mysql.com/doc/refman/5.7/en/metadata-locking.html).
Я попытался убить процесс, спящий от другого сеанса MySQL, и сценарий пошел дальше. Также пытался поставить commit
заявления после select
операторы и без процесса уничтожения все прошло нормально, но все же застрял при выполнении другой последовательности вышеупомянутых наборов запросов - я хотел бы знать, помещая операторы commit - это правильно?
Есть ли переменная или параметр, который я должен установить - что необходимо изменить при обновлении до MySQL 5.7?
Есть ли обходной путь для вышеуказанной проблемы?
Как найти Спящий поток был создан?
Есть ли способ идентифицировать живой запущенный запрос в MySQL?
Обновление вопроса: есть ли способ получить функциональность движка MyISAM DB, как в 5.1 после обновления до MySQL 5.7 с помощью сценариев perl.
Используя параметры default-storage-engine и disabled-storage-engine в my.cnf, установите его как: default-storage-engine=MyISAM disabled-storage-engine =InnoDB
Пытался загрузить данные XML в мой скрипт.
Автокоммит переменных состояния:
MySQL 5.7 - выберите @@ autocommit
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 1 |
+--------------+
Perl dbh autocommit через скрипт при подключении к БД по-прежнему не установлен как: $self->{dbh}->{AutoCommit}=0;
Проблема блокировки таблицы все еще сохраняется.
Фрагмент статуса двигателя:
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| InnoDB | YES | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| MyISAM | DEFAULT | MyISAM storage engine | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
Есть ли каким-либо образом я могу отключить управление транзакциями на mysql5.7? Дайте мне знать, если мне нужно установить любой другой флаг, чтобы получить вышеуказанные запрошенные функции.
Заранее спасибо.