Куда уходит сервер?

К написанию этой статьи меня побудило сожаление о потраченном времени на анализ и устранение ошибки. Теперь же, я надеюсь, программист, столкнувшийся с аналогичной проблемой прочтет эту статью и решит задачу гораздо быстрее.

Все примеры в статье рассматриваются применительно к программироаванию в операционной системе OS/2 и eComstation.

Ошибка

Программа, скомпилированная Virtual Pascal (OS/2) с библиотекой MySQL после запуска попадает в трап с ошибкой MySQL:2006:MySQL server has gone away. Проверка логина и пароля ничего не дает - все верно. Сервер работает. Учетная запись в MySQL существует, права назначены. В логах сервера также все замечательно и нет никаких ошибок.

Анализ

Ситуация патовая. В интеренет эта ошибка описывается как потеря связи с сервером преимущественно из-за таймаута. Это не верный путь. Никакие таймауты крутить не надо.

Подробный анализ кода библиотеки показывает, что разработчики очень вольно относились к информации об ошибках. А если точнее, то далеко не вся информация содержится в сообщении, которое выдается при попадании в трап.

Ну что же? Самое главное правильно определить место поиска информации. Находим файл Libmysql.Pas, а в нем функцию mysql_real_connect. Ближе к концу функции видим метку error:. Именно на этот участок кода будет попадать управление, если произойдет ошибка. Далее в отладочных целях модифицируем код следующим образом:

error:
//DBUG_PRINT("error",("message: %u (%s)",net->last_errno,net->last_error));
writeln(net^.last_errno,' ' ,net^.last_error);
end_server(mysql^);
if mysql^.free_me then FreeMem(mysql,sizeof(mysql^));
Result := nil;
end;

В коде видно, что разработчики, которые писали исходную библиотеку на Си, предусмотрели отладочный вывод. Те же, кто портировал библиотеку на Pascal, просто его закомментировали.

Компилируем и запускаем программу. Теперь при неудачном старте мы видим дополнительную информацию и можем понять почему же наш сервер не хочет работать с нашим соединением.

Решение

В часности сервер может нам сообщить, что логин и пароль не верные. Как же так? Проверяем - все верно. В этом случае смотрим на имя пользователя в виде login@domain. В стандарте MySQL предусматривается возможность коннекта с разных IP или доменов для этого нужно ввести логин пользователя в формате login@%. Однако, сборка MySQL от Paul Smedley не понимает групповых символов! Указывайте точно такой же логин с доменом, как отписал сервер в ошибке и тогда соединение установить удастся.

Другая возможная ошибка - клиент не поддерживает алгоритм хеширования пароля. В этом случае сервер в сообщении об ошибке посоветует нам заменить клиент MySQL. К сожалению эта задача сложно выполнимая - свежих портов клиента MySQL лично я не видел. Но выход есть - при создании пользователя в MySQL можно указать, чтобы пароль сохранялся в формате MySQL версии 4.0, а не 4.1+.

Заключение

Надеюсь, информация, приведенная здесь, была Вам полезна и позволит избежать потери времени на поиск в интернете путей решения такой задачи.