Ошибка: тайм-аут бездействия рукопожатия в модуле Node.js MYSQL

Я использую node-mysql и большинство запросов. Работающий. некоторые запросы не работают. Я пробовал все версии Node (от 0.5...) до (5.6.0), я также пробовал (4.0) и (4.1), ничего не помогает.

Пробовал менять вручную, не получилось. Я пытался изменить файл sequence на: this._idleTimeout = -1; и не помогло.

Я читал вопросы и GitHub, и ничего не помогло.

Я могу попытаться исправить это самостоятельно, но мне нужно больше информации. Где таймаут, почему? когда? что это за тип сообщения? Откуда таймаут?

MYSQL_ERROR     { [Error: Handshake inactivity timeout]  
code: 'PROTOCOL_SEQUENCE_TIMEOUT',   fatal: true,   
timeout: 10000 }  

person Aminadav Glickshtein    schedule 22.02.2016    source источник
comment
Я думаю, что вы выполняете запрос несколько раз, а не используете один запрос, потому что время выполнения зависит от количества запущенных запросов. Если вы запускаете одиночный запрос, то выполнение будет быстрым, и эта ошибка не появится.   -  person Kunal    schedule 03.08.2018
comment
Для всех, кто находит этот вопрос, эта ошибка также отображается, если вы пытаетесь создать соединение/пул с неверными учетными данными для входа (или если вы передаете номер порта, который не соответствует вашему порту mysql, который обычно равен 3306).   -  person AtAFork    schedule 21.04.2020


Ответы (6)


Хорошо, время ожидания исходит из строки файла Protocol.js: 162. Если вы проверите node-mysql, вы увидите, что это переменная «время ожидания» для запросов. Если вы установите время ожидания намного выше 10000, по умолчанию, ошибка должна исчезнуть. Примером является

pool = require('mysql').createPool({
    connectionLimit : 1000,
    connectTimeout  : 60 * 60 * 1000,
    acquireTimeout  : 60 * 60 * 1000,
    timeout         : 60 * 60 * 1000,
    host            : process.env.DB_HOST,
    user            : process.env.DB_USERNAME,
    password        : process.env.DB_PASSWORD,
    database        : process.env.DB_DATABASE
});

Вы также можете отредактировать время ожидания в файле Sequence.js (node_modules/mysql/lib/protocol/sequence/Sequence.js)

this._timeout  = 100000;
person Nick Kotenberg    schedule 05.05.2016
comment
Ошибка в написанииAcquireTimeout в приведенном выше примере кода. - person Sibaprasad Maiti; 30.08.2018
comment
иногда это происходит из-за недействительных учетных данных - person Arjun Singh; 10.04.2019
comment
Мне нужно было сделать это в нашей системе, потому что иногда она невероятно загружена, а задержки могут достигать 30 секунд. У нас выполняются массивные запросы, и иногда они поражают серверы одновременно. Я масштабировал экземпляр mysql, но все еще существует проблема состояния между базовым экземпляром и репликами. - person Nick Kotenberg; 27.04.2019
comment
В файле sequence.js я изменил ограничение по времени, но это не сработало. Не могли бы вы указать, где в файле protocol.js мы должны указать эти учетные данные? - person Mohammad; 31.07.2019

Тем, кто выполняет развертывание на AWS и столкнулся с этой ошибкой, необходимо внести изменения в группу безопасности вашей базы данных/кластера и add an inbound rule, где source – это группа безопасности вашего экземпляра/экземпляров.

Входящее правило должно выглядеть следующим образом:

Type: MySQL/Aurora
Protocol: TCP (default)
Port: 3306 (default)
Source: <security group of instance>
Description: <optional>
person mscheker    schedule 16.10.2019

Если вы пользуетесь сервисами Amazon, я смог решить эту проблему, изменив разрешенные IP-адреса в настройках безопасности или изменив открытые порты подключения.

person Berkay Torun    schedule 29.03.2019
comment
Привет, Кевин. Вы имеете в виду правила подсети, верно? Потому что я разрешил IP из моего EC2, но все равно получил эту ошибку. Это довольно нечасто. - person Lajpat; 11.09.2019

.end() не блокирует, но это может привести ваш код к той же проблеме, что и у меня - я просто вызывал .end() без ожидания фактического завершения операции.

Чтобы на самом деле дождаться окончания соединения, вы не можете просто дождаться dbConn.end(), потому что .end() не возвращает обещание. Что вам нужно, так это создать обещание и вернуть его. Как следующее:

От

connection.end();

К этому

connection.end(error => error ? reject(error) : resolve());

И для использования в бассейне

connection.release();

К этому

connection.release(error => error ? reject(error) : resolve());
person Elminson De Oleo Baez    schedule 15.05.2020
comment
Я верю, что ваш анализ верен. Я получал тайм-аут бездействия при тестировании попадания в БД в режиме быстрого огня. Фактическое время было коротким около 150 мс. Как вы создаете обещание? Не могли бы вы объяснить свой ответ для end()? - person KingAndrew; 12.09.2020

для тех, кто использует aws и heroku! введите настройки экземпляра rds db и измените правило входящего трафика --> source: any..

Помните, что Heroku не предоставляет конкретный IP-адрес!

person Edgar Olivar    schedule 12.11.2019
comment
Разрешение любого источника является довольно высоким риском, когда дело доходит до запуска базы данных. - person ThomasRedstone; 27.10.2020
comment
Я только что немного почитал об этом, и в основном это является частью того, как вы это делаете, но для безопасного выполнения есть несколько дополнительных шагов, описанных здесь: stackoverflow.com/a/42558720/340141 - person ThomasRedstone; 04.11.2020
comment
@ThomasRedstone большое спасибо, возможно, это правильный способ подключения героку к RDS с дополнительными шагами. - person Edgar Olivar; 07.12.2020

для меня это было исправить статус «выбрать», чтобы выбрать, где проверяется столбец идентификатора (первичный ключ), а не столбец, который имеет тип varchar , например: not work

select from users where userName = 'aa';

работа

select from users where userID = 1;
person Feiga Lubow    schedule 22.12.2020