Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Диагностируйте и устраняйте распространённые проблемы с серверной частью mssql-django для SQL Server, База данных SQL Azure, Управляемый экземпляр SQL Azure и базы данных SQL в среде Microsoft Fabric.
mssql-django Версия 2.0 поддерживает стандартный путь драйвера pyodbc и путь драйвера MSSQL-Python по умолчанию. Для получения дополнительной информации см. Выберите драйвер базы данных для mssql-django.
Проблемы с подключением
В этом разделе рассматриваются наиболее распространенные ошибки подключения и способы их устранения.
Драйвер ODBC не найден на пути pyodbc
Симптомы
django.core.exceptions.ImproperlyConfigured: 'ODBC Driver 18 for SQL Server' is not a recognized ODBC driver
Или:
Error: ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib 'ODBC Driver 18 for SQL Server'")
Возможные причины и решения:
Драйвер ODBC не установлен
Установите драйвер Microsoft ODBC для SQL Server, когда используете стандартный путь pyodbc. Ссылки на скачивание см. в разделе "Скачать драйвер ODBC для SQL Server". Путь mssql-python не использует внешне установленный драйвер ODBC.
Установлены несколько версий драйверов
Укажите точное имя драйвера или путь в
settings.py:DATABASES = { "default": { "ENGINE": "mssql", "NAME": "<database>", "USER": "<user_id>", "PASSWORD": "<password>", "HOST": "<server>", "PORT": "1433", "OPTIONS": { "driver": "ODBC Driver 17 for SQL Server", }, }, }В Linux укажите полный путь:
"OPTIONS": { "driver": "/opt/microsoft/msodbcsql17/lib64/libmsodbcsql-17.10.so.6.1", },Проверка установленных драйверов
- В Linux или macOS выполните команду
odbcinst -q -d. - В Windows проверьте источники данных ODBC в средствах администрирования.
- В Linux или macOS выполните команду
MSSQL-python отклоняет опцию соединения
Симптомы
Псевдоним, задающий "python_driver": "mssql_python", приводит к сбою при настройке подключения после переноса ключевых слов строки подключения pyodbc в OPTIONS["extra_params"], и возникает одна из следующих ошибок:
mssql_python.exceptions.ConnectionStringParseError: Connection string parsing failed:
Unknown keyword 'longasmax' is not recognized
mssql_python.exceptions.ConnectionStringParseError: Connection string parsing failed:
Reserved keyword 'driver' is controlled by the driver and cannot be specified by the user
Имя ключевого слова в сообщении приводится к нижнему регистру, поэтому ключевое слово, которое вы написали как LongAsMax, отображается как longasmax.
ConnectionStringParseError не входит в иерархию исключений DB-API, поэтому Django не оборачивает его повторно в ошибку django.db.utils.
Возможные причины и решения:
ключевое слово только для pyodbc в
extra_paramsПуть mssql-python проверяет
extra_paramsпо списку разрешённых объектов.DRIVERиAPPзарезервированы для водителя и создаютReserved keywordформу.DSN,SERVERNAME,LongAsMaxи ключевые слова, доступные только в pyodbc, такие какColumnEncryption,QuotedId,WSID,AnsiNPW,Regional,Current Language,UseFMTONLY,Description,Network Library,Connect TimeoutиUnknown keyword, отсутствуют в списке разрешённых и приводят к формеMARS_Connection. Удалите ключевое слово или используйте стандартный путь pyodbc для псевдонима, которому нужна эта опция ODBC.Ожидается опция драйвера для управления mssql-python
Путь mssql-python игнорирует
driver,dsn,host_is_server, иunicode_results.HOSTиPORTстановитсяSERVER=<server>,<port>, а пустоеHOSTстановитсяlocalhost.
Зависимость MSSQL-Python слишком старая
Симптомы
Псевдоним, который устанавливает "python_driver": "mssql_python" , не работает при установке соединения с одной из следующих ошибок:
django.core.exceptions.ImproperlyConfigured: mssql-python 1.15.0 or newer is required; you have 1.14.0
django.core.exceptions.ImproperlyConfigured: The 'python_driver' connection option requests mssql-python, but the module could not be imported: No module named 'mssql_python'. Install it with 'pip install "mssql-python>=1.15.0"'.
Вторая форма означает, mssql_python что модуль вообще нельзя импортировать.
Решение: установка mssql-python>=1.15.0.
mssql-django Версия 2.0 объявляет mssql-python>=1.15.0, поэтому обычный pip install mssql-django определяет совместимую версию на поддерживаемых платформах.
Запасной вариант драйвера 17 не применяется к mssql-python
Симптомы
Псевдоним, который задаёт "python_driver": "mssql_python", по-прежнему не работает, хотя Microsoft ODBC Driver 17 for SQL Server установлен.
В этом случае нет явной ошибки. Код mssql-python молча игнорирует параметр driver, поэтому подключение завершается сбоем с соответствующей базовой ошибкой. Если вместо этого переместить имя водителя в extra_params, появится ошибка Reserved keyword 'driver'. См. mssql-python отклоняет опцию соединения.
Решение: используйте стандартный путь pyodbc, если псевдоним должен использовать установленный внешне ODBC Driver 17. Путь mssql-python не возвращается к драйверу 17 и игнорирует эту driver опцию. Для этого пути не нужен отдельно установленный драйвер ODBC.
В подключении отказано
Симптомы
django.db.utils.OperationalError: ('08001', '[08001] ... TCP Provider: Error code 0x2749 ...')
Возможные причины и решения:
Tcp/IP не включен в SQL Server
- Откройте диспетчер конфигурации SQL Server.
- В разделе SQL Server конфигурации сети включите TCP/IP.
- В свойствах TCP/IP активируйте IP-адрес, используемый для подключения.
- Перезапустите службу SQL Server.
Брандмауэр блокирует порт 1433
- Убедитесь, что правила брандмауэра разрешают входящие подключения через порт 1433.
- Для Azure SQL добавьте IP-адрес клиента в параметры брандмауэра портала Azure.
Неправильное имя сервера или порт
Проверьте значения
HOSTиPORTв своей конфигурации.
Сбой входа
Симптомы
django.db.utils.OperationalError: ('28000', "[28000] [Microsoft][ODBC Driver 18 for SQL Server][SQL Server]Login failed for user '<user_id>'. (18456) (SQLDriverConnect); [28000] [Microsoft][ODBC Driver 18 for SQL Server][SQL Server]Login failed for user '<user_id>'. (18456)")
На пути mssql-python:
django.db.utils.OperationalError: Driver Error: Invalid authorization specification; DDBC Error: [Microsoft][SQL Server]Login failed for user '<user_id>'.
Возможные причины и решения:
Неверные учетные данные
Проверьте имя пользователя и пароль.
База данных в
NAMEне существуетВ SQL Server при использовании mssql-python возникает тот же
OperationalErrorс тем же сообщением, что и при неверном пароле, поэтому по одному только сообщению нельзя понять, с чем именно вы столкнулись. Убедитесь, что база данных существует, прежде чем менять учетные данные. УкажитеNAME,masterчтобы проверить логин самостоятельно: если он подключается, учетные данные правильные, и проблема в базе данных. Путь pyodbc описывает этот случай отдельно какCannot open database "<database>" requested by the login. The login failed. (4060).База данных SQL Azure сообщает об этом случае иначе. Ветка mssql-python выдаёт
Driver Error: General error; DDBC Error: [Microsoft][SQL Server]Cannot open server "<server>" requested by the login. The login failed.В сообщении указано имя сервера, но с именем сервера всё в порядке. ПроверьтеNAMEвместо этого.Пользователь не существует
Убедитесь, что имя входа сопоставляется с пользователем в целевой базе данных.
SQL Server аутентификация отключена
Включите проверку подлинности в смешанном режиме или используйте Windows или Microsoft Entra аутентификацию.
Время соединения истекло
Симптомы
django.db.utils.OperationalError: ('HYT00', '[HYT00] [Microsoft][ODBC Driver 18 for SQL Server]Login timeout expired')
Возможные причины и решения:
Задержка сети
Увеличьте
connection_timeoutв разделе OPTIONS.База данных SQL Azure serverless с включённой функцией автопаузы
Автоматически приостановленная база данных возобновляется при первой попытке подключения, и эта попытка может провалиться из-за ошибки 40613, пока база данных возобновляется. Установите для
connection_timeoutзначение не менее 60 и повторите первую попытку подключения. Для получения дополнительной информации см. База данных SQL Azure serverless и Auto-pause and auto-resume.Перегруженный сервер
Увеличьте
connection_retriesиconnection_retry_backoff_time."OPTIONS": { "driver": "ODBC Driver 18 for SQL Server", "connection_timeout": 30, "connection_retries": 5, "connection_retry_backoff_time": 10, },
Проблемы с миграцией
Эти ошибки возникают во время операций миграции Django с SQL Server.
Проблемы с сырым SQL и GROUP BY
Эти ошибки возникают, когда необработанные или аннотированные запросы с оператором GROUP BY обрабатываются на этапе перезаписи плейсхолдеров на стороне бэкенда.
IndexError в GROUP BY с экранированными %% и реальными параметрами
Симптомы
IndexError: Replacement index N out of range for positional args tuple
Запрос работает без GROUP BY клаузы и без свернутого %% литерала, но не работает, если оба параметра присутствуют рядом с реальным %s параметром.
Решение: обновить до текущего mssql-django релиза. Бэкенд сужает регулярное выражение для перезаписи плейсхолдеров так, чтобы оно соответствовало только %% и %s, поэтому экранированные литералы %% сохраняются в исходном виде, и фиктивные плейсхолдеры не добавляются.
NotImplementedError для IntegerChoices в необработанных запросах GROUP BY
Симптомы
NotImplementedError: Not supported type <enum '...'> (StatusChoices.IN_PROGRESS)
То же значение enum работает как в запросах ORM, так и в сырых запросах без GROUP BY, но не срабатывает, если передаётся в качестве параметра в исходный запрос, содержащий GROUP BY оговорку.
Решение: обновить до текущего mssql-django релиза. Бэкенд использует isinstance для проверки типов параметров в пути GROUP BY , поэтому IntegerChoices ( int подкласс) связывается корректно.
bool по-прежнему связывает bit, а обычный int не изменяется.
Проблемы с поиском в регулярных выражениях
__regex или __iregex не возвращает строк
Симптомы: Запрос работает без ошибок и возвращает пустой набор результатов, хотя строки совпадают с закономерностью.
Product.objects.filter(name__regex=r"^Widget \d+$") # no rows, though "Widget 42" exists
Причина: dbo.REGEXP_LIKE игнорирует буквальное пустое пространство в узоре. Шаблон сопоставляется так, как если бы это был ^Widget\d+$, чему не может соответствовать ни одно значение, содержащее пробел. Ничего не выходит, поэтому пустой результат выглядит как проблема с данными.
Решение: Записать пробел как escape или класс символов:
Product.objects.filter(name__regex=r"^Widget\s\d+$")
Product.objects.filter(name__regex=r"^Widget[ ]\d+$")
Cannot find ... dbo.REGEXP_LIKE
Симптомы
django.db.utils.ProgrammingError: ('42000', '[42000] [Microsoft][ODBC Driver 18 for SQL Server][SQL Server]Cannot find either column "dbo" or the user-defined function or aggregate "dbo.REGEXP_LIKE", or the name is ambiguous. (4121) (SQLExecDirectW)')
На mssql-python пути:
django.db.utils.ProgrammingError: Driver Error: Syntax error or access violation; DDBC Error: [Microsoft][SQL Server]Cannot find either column "dbo" or the user-defined function or aggregate "dbo.REGEXP_LIKE", or the name is ambiguous.
Причина: CLR-ассембл не установлен в базе данных, к которой вы запрашиваете. Он устанавливается на базу данных, а не на серверы.
Решение: запустите python manage.py install_regex_clr <database> для этой базы данных. Повторно запустите это после удаления и повторного создания базы данных. См. Настройка поиска по регулярным выражениям.
Проблемы с датой и временем
Now() значения смещаются, когда USE_TZ=True
Симптомы
Метки времени, записанные с помощью Django Now(), auto_now или auto_now_add, смещаются, когда часовой пояс узла SQL Server не UTC.
Решение: обновить до текущего mssql-django релиза. Бэкенд генерирует SQL с поддержкой часовых поясов Now(), сохраняет смещения datetimeoffset и читает данные о часовых поясах через zoneinfo и tzdata.
AttributeError при вызове .explain()
Симптомы
AttributeError: ... explain_format ...
Решение: обновить до текущего mssql-django релиза. Серверная часть обрабатывает метаданные explain для всех поддерживаемых версий Django.
Не удается изменить автофилд
Симптомы
django.db.utils.ProgrammingError: Cannot alter column to or from an IDENTITY column
Решение: SQL Server не поддерживает изменение типа поля с или на AutoField. Создайте модель с нужным типом поля, перенесите данные вручную, а затем удалите старую таблицу. Обходные пути см. в разделе "Миграция баз данных" с помощью mssql-django.
Не удается переименовать из-за ограничения внешнего ключа
Симптомы
django.db.utils.ProgrammingError: ... could not drop constraint ...
Решение: SQL Server требует удаления ограничений внешнего ключа перед переименованием столбцов. Используйте SeparateDatabaseAndState при миграции. Пример см. в разделе "Миграция баз данных с помощью mssql-django".
Проблемы с кодировкой
Ошибки кодирования обычно возникают при использовании pyodbc, когда pyodbc неверно интерпретирует символьные данные из SQL Server.
Ошибки кодировки Юникода
Симптомы
UnicodeDecodeError: 'utf-8' codec can't decode byte ...
Решение: настройте pyodbc кодирование в OPTIONS словаре. Путь mssql-python игнорирует unicode_results.
"OPTIONS": {
"driver": "ODBC Driver 18 for SQL Server",
"unicode_results": True,
},
Проблемы с FreeTDS
FreeTDS требует конфигурации, специфичной для pyodbc, отличающейся от драйвера Microsoft ODBC.
ошибка host_is_server
Симптомы
Сбой подключения при использовании FreeTDS без указания host_is_server.
Решение. Задайте значение host_is_serverTrue при использовании FreeTDS:
"OPTIONS": {
"driver": "FreeTDS",
"host_is_server": True,
},
Дополнительные сведения о конфигурации FreeTDS см. в разделе "Параметры подключения" для mssql-django.
Проблемы с тестовой базой данных
Создание и уничтожение тестовой базы данных могут завершаться ошибкой в зависимости от метода аутентификации.
Не удается создать тестовую базу данных с управляемой идентификацией
Симптомы
django.db.utils.DatabaseError: ('42000', '[42000] ... EXECUTE permission denied on object ...')
Или:
django.db.utils.OperationalError: ('28000', ... login failed ...)
Средство запуска тестов не может создать или удалить тестовую базу данных при использовании проверки подлинности с помощью ActiveDirectoryMsi (управляемого удостоверения). Это ограничение существует, так как:
Учетные данные управляемой идентичности получаются из среды размещения (например, виртуальной машины Azure и Azure App Service).
Средство запуска тестов пытается подключиться с использованием учетных данных базы данных test на этапе teardown.
Управляемой идентичности можно назначить роли на уровне базы данных, но для создания и удаления тестовых баз данных обычно требуются разрешения на уровне сервера, которых у средств запуска тестов часто нет.
Затронутые методы проверки подлинности:
-
ActiveDirectoryMsi(управляемое удостоверение Azure) -
ActiveDirectoryServicePrincipal(только если настроено на уровне сервера)
Поддерживаемые методы проверки подлинности (работает создание тестовой базы данных):
ActiveDirectoryPasswordActiveDirectoryIntegrated- Проверка подлинности SQL (имя пользователя и пароль)
Компромиссы проверки подлинности для тестовых сред
| Метод | Без секрета | Работает с автоматическим созданием/удалением тестовой базы данных | Типичное использование |
|---|---|---|---|
ActiveDirectoryMsi |
Yes | Обычно нет (если права на уровне сервера не предоставлены) | продуктивные рабочие нагрузки, размещённые в Azure |
ActiveDirectoryServicePrincipal |
Нет (секрет клиента или сертификат) | Зависит от предоставленных прав на уровне сервера | CI/CD с явным управлением идентификацией |
ActiveDirectoryPassword |
нет | Да (с достаточными разрешениями SQL) | Среды разработки и контролируемые среды CI |
| Проверка подлинности SQL | нет | Да (с достаточными разрешениями SQL) | Локальные или изолированные тестовые среды |
Решения:
Для разработки: используйте
--keepdbфлаг для пропуска сноса тестовой базы данных:python manage.py test --keepdbДля конвейеров CI/CD: заранее создайте выделенную тестовую базу данных и предоставьте управляемой идентификации разрешения
CREATE TABLEиALTER:-- Connect as a server admin, then: USE [test_database_name]; -- Grant permissions for managed identity (replace with your identity name) CREATE USER [your-app-identity] FROM EXTERNAL PROVIDER; GRANT CREATE TABLE TO [your-app-identity]; GRANT ALTER ON SCHEMA::dbo TO [your-app-identity];Альтернатива: используйте аутентификацию SQL для тестовых сред или переключитесь на
ActiveDirectoryPasswordдля тестовых раннеров CI/CD.
Процедуры отката
Если миграция прерывается до завершения, используйте эту последовательность отката, чтобы вернуться к заведомо работоспособному состоянию:
Остановите запись приложения, чтобы избежать дополнительного смещения схемы.
Проверка состояния миграции:
python manage.py showmigrations python manage.py sqlmigrate <app_label> <migration_number>Откат к последней известной хорошей миграции:
python manage.py migrate <app_label> <previous_migration>Если схема и история миграций расходятся, осторожно исправляйте состояние с помощью
--fakeтолько после проверки фактической схемы базы данных.Сначала повторно запустите миграцию в промежуточной среде, а затем повторите попытку в рабочей среде.
Important
Для разрушительных миграций, таких как удаление, переименование и изменение типов столбцов, перед развертыванием выполните тестовую резервную копию. Если откат с помощью миграции невозможен, восстановите систему из резервной копии и повторно примените проверенные миграции.
Проблемы с Docker и контейнерами
При использовании стандартного способа работы с pyodbc для образов контейнеров требуется явная установка драйвера ODBC и зависимостей для сборки. Путь mssql-python не имеет отдельной установки драйвера ODBC, но всё равно нужен unixODBC runtime, потому что бэкенд импортирует pyodbc при загрузке Django.
Драйвер ODBC не найден в контейнере
Симптомы
Error: ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib 'ODBC Driver 18 for SQL Server'")
Возможные причины и решения:
Драйвер ODBC не установлен в образе контейнера
Базовые образы Slim и Alpine не включают драйвер ODBC. Добавьте репозиторий Microsoft APT и установите
msodbcsql18в Dockerfile, если вы используете pyodbc. Полный пример Dockerfile см. в статье "Развертывание в службе приложений ".Отсутствующий
unixodbc-devпакетПакет
pyodbcкомпонуется сlibodbc.so. Установитеunixodbc-dev(Debian/Ubuntu) илиunixODBC-devel(RHEL/Fedora) перед установкой пакетов Python.apt-get autoremoveСнятоlibgssapi-krb5-2после установки драйвераmsodbcsql18загружаетlibgssapi-krb5-2во время выполнения, не объявляя его зависимостью. Библиотека обычно устанавливается как зависимость отcurl, поэтому удалениеcurlс помощью--auto-removeили последующий запускapt-get autoremoveприводят к её удалению. Образ собирается без ошибок, а затем все соединения обрываются. Установитеlibgssapi-krb5-2в явном виде и не выполняйте автоудаление после установки драйвера.
Драйвер 17 отсутствовал при установке версии 18
Симптомы
Error: ('01000', "[01000] [unixODBC][Driver Manager]Can't open lib 'ODBC Driver 17 for SQL Server' : file not found (0) (SQLDriverConnect)")
Ошибка называется версией 17, но odbcinst -q -d показывает, что зарегистрирована версия 18 и dpkg -l msodbcsql18 установлена.
Причина: Версия 18 зарегистрирована, но не загружается, поэтому mssql-django возвращается к версии 17, которая не установлена. Резервный механизм сообщает о драйвере, который он попытался использовать вторым, а не о том, который не удалось использовать.
Решение: установка libgssapi-krb5-2 и восстановление. См. предыдущее примечание об автоудалении, где объясняется, как библиотека пропадает.
Ошибка загрузки модуля pyodbc в контейнер
Симптомы
django.core.exceptions.ImproperlyConfigured: Error loading pyodbc module: libodbc.so.2: cannot open shared object file: No such file or directory
Причина: на изображении нет unixODBC runtime. mssql-django импортирует pyodbc при загрузке бэкенда, поэтому эта ошибка возникает и на пути mssql-python до попытки подключения.
Решение: установка unixodbc (или unixodbc-dev).
Драйвер mssql-python не загружается
Симптомы
django.db.utils.OperationalError: Driver Error: Connection operation failed; DDBC Error: Failed to load the driver.
Причина: драйвер, поставляемый с mssql-python, требует библиотек среды выполнения Kerberos, которых нет в облегчённых базовых образах.
Решение: установить libkrb5-3 и libgssapi-krb5-2.
pyodbc не может построить на тонких изображениях
Симптомы
error: command 'gcc' failed: No such file or directory
Или:
fatal error: sql.h: No such file or directory
Решение: Установите зависимости для сборки перед pip install:
RUN apt-get update && apt-get install -y --no-install-recommends \
gcc \
g++ \
unixodbc-dev
Кроме того, используйте многоэтапную сборку, чтобы сохранить окончательный образ небольшим:
# Build stage
FROM python:3.12-slim AS builder
RUN apt-get update && apt-get install -y --no-install-recommends gcc g++ unixodbc-dev
COPY requirements.txt .
RUN pip wheel --no-cache-dir --wheel-dir /wheels -r requirements.txt
# Runtime stage
FROM python:3.12-slim
RUN apt-get update && apt-get install -y --no-install-recommends \
curl gnupg2 unixodbc \
&& curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg \
&& curl -fsSL https://packages.microsoft.com/config/debian/12/prod.list > /etc/apt/sources.list.d/mssql-release.list \
&& apt-get update \
&& ACCEPT_EULA=Y apt-get install -y --no-install-recommends msodbcsql18 libgssapi-krb5-2 \
&& apt-get purge -y curl gnupg2 \
&& rm -rf /var/lib/apt/lists/*
COPY --from=builder /wheels /wheels
RUN pip install --no-cache-dir /wheels/*
Контейнер не может подключиться к SQL Server
Симптомы
django.db.utils.OperationalError: ('08001', '... TCP Provider: Error code 0x2749 ...')
Возможные причины и решения:
Имя службы Docker Compose не используется в качестве узла
При использовании Docker Compose задайте
DB_HOSTимя службы (например,db), а неlocalhost127.0.0.1.контейнер SQL Server не готов
Для запуска контейнера SQL Server требуется несколько секунд. Добавьте проверку работоспособности или задержку запуска:
services: db: image: mcr.microsoft.com/mssql/server:2022-latest healthcheck: test: /opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P "$$MSSQL_SA_PASSWORD" -No -Q "SELECT 1" || exit 1 # $$ escapes the $ sign in Docker Compose YAML interval: 10s retries: 10 start_period: 10s web: depends_on: db: condition: service_healthyКонфликты сопоставления портов
Если на узле запущен другой экземпляр SQL Server, измените предоставленный порт (например,
1434:1433) и обновите конфигурацию Django соответствующим образом.
Azure SQL временное восстановление ошибок
Компонент mssql-django серверной части автоматически обнаруживает подключения к База данных SQL Azure и Управляемый экземпляр SQL Azure путем выполнения запроса к SERVERPROPERTY('EngineEdition'). При работе с Azure SQL серверная часть повторяет попытки подключения при возникновении временных сбоев (например, временных ограничений ресурсов или кратковременных перебоев в сети).
Это поведение можно настроить с помощью параметров connection_retries и connection_retry_backoff_time:
"OPTIONS": {
"driver": "ODBC Driver 18 for SQL Server",
"connection_retries": 5,
"connection_retry_backoff_time": 5,
},
Эти параметры применяются только к первоначальному созданию подключений. Серверная часть не повторяет неудачные запросы. Если после установления соединения запрос завершается из-за временной ошибки, исключение передаётся в код приложения. Используйте логику повторных попыток на уровне приложения (например, django-retry-db или настраиваемое ПО промежуточного слоя) для обеспечения устойчивости на уровне запросов.
Медленные запросы и регрессии планов
Эти проблемы обычно требуют анализа на стороне сервера вместе с проверкой запросов на уровне Django.
Запрос работает медленнее или начинает завершаться по тайм-ауту
Симптомы
Тот же QuerySet со временем начинает работать медленнее или начинает завершаться по тайм-ауту после развертывания, изменения индекса или обновления статистики.
Возможные причины и решения:
Начните со встроенных отчетов о производительности
Для SQL Server и Управляемый экземпляр SQL Azure откройте панель мониторинга производительности в SQL Server Management Studio. Для База данных SQL Azure откройте аналитические сведения о производительности запросов для База данных SQL Azure. Обычно эти средства являются лучшей отправной точкой, чем разовые запросы DMV, поскольку они позволяют быстро выявить ресурсоёмкие запросы, ожидания и нехватку ресурсов.
Регрессия планирования
Используйте хранилище запросов для поиска медленного запроса и проверки наличия нескольких планов. Начните с представлений «Запросы с регрессией» и «Запросы с наибольшим потреблением ресурсов», описанных в рекомендациях по мониторингу рабочих нагрузок с помощью хранилище запросов.
Неэффективный план выполнения
Откройте фактический план выполнения для инструкции и проверьте наличие сканирований таблиц или индексов, затратных операций поиска по ключу, переполнений хэша или неточных оценок строк. Общие сведения см. в разделе "План выполнения".
Неправильно определённое узкое место
Если запрос не привязан к ЦП, используйте статистику ожидания хранилище запросов и определите узкие места для различения ЦП, памяти, операций ввода-вывода диска, блокировки и давления подключения.
Исправление, примененное в неправильном слое
Примените наименьшее эффективное исправление: добавьте или измените индексы, обновите статистику, уменьшите выбранные столбцы и строки или пакетную большую запись. Если требуется экстренная мера по смягчению последствий, DBA может временно принудительно применить в хранилище запросов заведомо корректный план, пока вы устраняете первопричину.
Использование dbshell для интерактивных запросов
Команда управления Django dbshell открывает интерактивную оболочку SQL, подключенную к базе данных:
python manage.py dbshell
Серверная часть использует sqlcmd при настройке драйвера Microsoft ODBC или isql при использовании FreeTDS. Убедитесь, что инструмент доступен через PATH:
-
Windows:
sqlcmdвходит в состав средств SQL Server, или его можно скачать отдельно. -
Linux и macOS: установка
mssql-tools18из репозитория Microsoft.
Связанный контент
- Справочник по конфигурации mssql-django
- Параметры подключения для mssql-django
- Повторная логика и устойчивость подключений с помощью mssql-django
- Ограничения и неподдерживаемые функции в mssql-django
- Панель мониторинга производительности
- Анализ производительности запросов для базы данных SQL Azure
- Отслеживайте производительность с помощью хранилище запросов
- Анализ фактического плана выполнения
- Устранение неполадок вики-сайта
- FAQ