У меня есть задание AWS Glue, в котором используется стандартный набор аналитических библиотек с Python Shell. Особо следует отметить, что для подключения к нашему Microsoft SQL Server он использует SQLAlchemy. Для этого мы также прилагаем все усилия, чтобы импортировать pymssql 2.3.1. В этом задании Glue мы последовательно запускаем несколько копий одной и той же хранимой процедуры шесть раз. Кажется, случайным образом шестая (и, следовательно, последняя) хранимая процедура завершится с точки зрения SQL Server, но завершится с ошибкой внутри вызова pandas.read_sql. Сообщение об ошибке, которое, насколько я могу судить, исходит от FreeTDS:
Operational Error("pymssql.Exceptions.OperationalError) (20047, b'DB) Сообщение об ошибке -lib 20047, уровень серьезности 9:
DBPROCESS не работает или не включен
')
Его тип — sqlalchemy.exc .OperationalError.
Данные в нашем поле SQL меняются только один раз в день, но вот что странно: Когда я получаю эту ошибку, я получаю ее для оставшуюся часть дня. Не имеет значения, сколько раз я запускаю задание Glue.
Как это отладить?
Что я пробовал или исключил
Извините за длину, но я пробовал многое:
- Я уверен, что с окном SQL проблем нет. С его точки зрения, окончательный запрос выполняется до завершения. Ни расширенные события, sp_WhoIsActive, ни журнал ошибок SQL Server не показывают ничего интересного. Они знают, когда Python закрывает. соединение, но это нормально.
- Изменение версии pymssql, как предложено здесь, ничего не дало. Мы попробовали версии 2.3.0 и 2.3.1.
- Проблем с разрешениями AWS нет. Это прекрасно работает в большинстве дней в году.
- Добавлениеstream_results к моим параметрам подключения не имеет никакого эффекта, независимо от того, True или False. В документации неясно, поддерживает ли его вообще Microsoft SQL Server.
- Я добавил echo="debug", echo_pool="debug" в параметры своего движка. Дополнительная регистрация, которую они добавляют, не имеет никакой ценности. Я даже не буду этим делиться здесь. Все работает отлично, пока мы не получим ту же ошибку, о которой я говорил выше.
- , безусловно, является наиболее рекомендуемым решением. Это не решает проблему. Я вижу предварительный пинг в дополнительных журналах, обсуждавшихся выше, но задание по-прежнему завершается с ошибкой. pymssql 2.3.0 и 2.3.1 здесь ведут себя одинаково.
Код: Выделить всё
pool_pre_ping = True - Отключение пула соединений () не устранил проблему, как и Pool_reset_on_return.
Код: Выделить всё
poolclass=NullPool - Учитывая вышеизложенное, я считаю, что проблема объединения в пул исключена. Но мне действительно интересно, что количество пулов по умолчанию равно 5, а запрос 6 не работает.
- Я очень тщательно искал в Google эту ошибку. Я прочитал каждую страницу результатов Google на предмет «Сообщение об ошибке 20047 db-lib, dbprocess мертв». Сюда входят элементы, выходящие за рамки Python (кажется, Ruby разделяет эту проблему). Ничего не помогло.
- Это не проблема, если данных слишком много. У нас есть еще одно задание Glue, которое собирает расширенный набор этих данных, и сегодня оно работало нормально. Во всех аспектах, за исключением изменения имени хранимой процедуры, код другого задания полностью идентичен.
- Я не вижу ничего, что указывало бы на то, что это проблема с тайм-аутом.
- Искра — не вариант. Это просто не так. Я бы хотел попробовать pyobdc, но мне так и не удалось заставить его работать с Windows EC2, которую мы разрабатываем.
Подробнее здесь: https://stackoverflow.com/questions/790 ... sixth-quer