Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL ALTER TABLE отнема много време в малка таблица

Предполагам, че ALTER TABLE чака заключване на метаданни и всъщност не е започнало да променя нищо.

Какво е заключване на метаданни?

Когато стартирате заявка като SELECT/INSERT/UPDATE/DELETE срещу таблица, тя трябва да получи заключване на метаданни. Тези заявки не се блокират една друга. Всеки брой заявки от този тип могат да имат заключване на метаданни.

Но DDL израз като CREATE/ALTER/DROP/TRUNCATE/RENAME или събитие CREATE TRIGGER или LOCK TABLES трябва да придобие изключителен заключване на метаданни. Ако някоя транзакция все още съдържа заключване на метаданни, операторът DDL изчаква.

Можете да демонстрирате това. Отворете два терминални прозореца и отворете mysql клиента във всеки прозорец.

  • Прозорец 1:CREATE TABLE foo ( id int primary key );
  • Прозорец 1:START TRANSACTION;
  • Прозорец 1:SELECT * FROM foo; -- няма значение, че таблицата няма данни

  • Прозорец 2:DROP TABLE foo; -- забележете, че чака

  • Прозорец 1:SHOW PROCESSLIST;

    +-----+------+-----------+------+---------+------+---------------------------------+------------------+-----------+---------------+
    | Id  | User | Host      | db   | Command | Time | State                           | Info             | Rows_sent | Rows_examined |
    +-----+------+-----------+------+---------+------+---------------------------------+------------------+-----------+---------------+
    | 679 | root | localhost | test | Query   |    0 | starting                        | show processlist |         0 |             0 |
    | 680 | root | localhost | test | Query   |    4 | Waiting for table metadata lock | drop table foo   |         0 |             0 |
    +-----+------+-----------+------+---------+------+---------------------------------+------------------+-----------+---------------+
    

Можете да видите падащата таблица, чакаща заключването на метаданните на таблицата. Просто чакам. Колко време ще чака? Докато транзакцията в прозорец 1 завърши. В крайна сметка ще изтече след lock_wait_timeout секунди (по подразбиране това е зададено на 1 година ).

  • Прозорец 1:COMMIT;

  • Прозорец 2:Забележете, че спира да чака и веднага изпуска таблицата.

И така, какво можете да направите? Уверете се, че няма дълготрайни транзакции, блокиращи вашата ALTER TABLE. Дори транзакция, която е изпълнила бърз SELECT срещу вашата таблица по-рано, ще задържи заключването на своите метаданни, докато транзакцията не се ангажира.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Изчислете 1 седмица преди последната неделя и от днес до последната неделя

  2. Проблем с инсталацията на Ruby on Rails - Как да използвам WAMP MySQL инсталация?

  3. Python 3 и mysql чрез SQLAlchemy

  4. Получаване на йерархични данни от саморефериращи се таблици

  5. jQuery инструмент за избор на дати с php и mysql