MySQL Amazon RDS: превышен тайм-аут ожидания блокировки

#mysql #timeout #deadlock #amazon-rds

#mysql #тайм-аут #взаимоблокировка #amazon-rds

Вопрос:

В Mysql (Amazon RDS), когда я пытаюсь запустить следующий SQL-запрос

 UPDATE
    table1 INNER JOIN table2 USING (CommonColumn)
SET
    table1.col1 = table2.x,
    table1.col2 = table2.y
  

Я получаю эту ошибку примерно через 52 секунды последовательно:

 Error Code: 1205. Lock wait timeout exceeded; try restarting transaction
  

Как я должен это решить?

таблица 2 содержит около 17 миллионов записей, а таблица 2, которая является подмножеством таблицы 1, содержит 4 миллиона записей. Может быть, проблема в размере таблиц или что-то не так с моим запросом?

Ответ №1:

Попробуйте увеличить количество потоков ввода-вывода по умолчанию, если вы используете движок InnoDB. Значение RDS по умолчанию равно жалким 4. Вам нужно будет перезапустить экземпляр базы данных, чтобы группа параметров использовала новые значения, поскольку они не являются «динамическими» (требуют перезагрузки).


show variables like 'innodb_%io_threads';
------------------------- -------
| Variable_name | Value |
------------------------- -------
| innodb_read_io_threads | 4 |
| innodb_write_io_threads | 4 |
------------------------- -------

Комментарии:

1. Я не могу отредактировать это в RDS aurora «Переменная ‘innodb_write_io_threads’ является переменной только для чтения»»

2. Aurora DB является запатентованным продуктом, похожим на MySQL. Его переменные конфигурации могут быть защищены, несовместимы или просто выставлены напоказ. Приведенные выше инструкции были для управляемых экземпляров MySQL (RDS MySQL). Вам нужно будет повторно связаться со службой поддержки Aurora. ваша конкретная проблема.

3. слишком поздно для комментариев, тем не менее, параметры RDS доступны для редактирования с консоли AWS. Для некоторых изменений может потребоваться перезапуск

Ответ №2:

В AWS RDS у меня был заполнен экземпляр базы данных, что вызвало эту ошибку на клиенте.

Ответ №3:

Я перезапустил экземпляр MySQL, и сработал тот же запрос.

Комментарии:

1. Как я уже говорил вам. У кого-то была блокировка некоторых из этих ресурсов. Итак, перезапуск закрыл все соединения и ресурсы были освобождены: P

2. а если проблема не устранена?

3. если проблема не устранена, используйте innotop, чтобы посмотреть, что блокирует блокировки. затем вы можете закрыть соединение, связанное с блокировкой блокировки (завершение процесса-нарушителя может вызвать панику и сбой mysqld в версиях 5.5)