Устранение ошибок журнала транзакций с помощью Управляемый экземпляр SQL Azure

Применимо к:Управляемый экземпляр SQL Azure

Если журнал транзакций переполнен и не может принимать новые транзакции, могут появиться ошибки 9002 или 40552. Эти ошибки возникают, когда журнал транзакций базы данных, управляемый Управляемый экземпляр SQL Azure, превышает пороговые значения пространства и не может продолжать принимать транзакции. Эти ошибки похожи на проблемы с полным журналом транзакций в SQL Server, но имеют разные разрешения в SQL Server, База данных SQL Azure и Управляемый экземпляр SQL Azure.

Примечание.

Эта статья посвящена Управляемый экземпляр SQL Azure. Управляемый экземпляр SQL Azure основан на последней стабильной версии ядра СУБД Microsoft SQL Server, поэтому большая часть содержимого аналогична, хотя параметры устранения неполадок и средства могут отличаться от SQL Server.

Дополнительные сведения об устранении неполадок журнала транзакций в База данных SQL Azure см. в статье "Устранение ошибок журнала транзакций с помощью База данных SQL Azure".

Дополнительные сведения об устранении неполадок журнала транзакций в SQL Server см. в разделе Устранение неполадок, связанных с переполнением журнала транзакций (SQL Server ошибка 9002).

Автоматическое резервное копирование и журнал транзакций

В Управляемый экземпляр SQL Azure резервные копии журналов транзакций выполняются автоматически. Сведения о частоте, хранении и других сведениях см. в статье "Автоматические резервные копии". Чтобы отслеживать выполнение автоматического резервного копирования в управляемом экземпляре SQL, просмотрите действие мониторинга резервного копирования.

Расположение и имя файлов базы данных нельзя управлять, но администраторы могут управлять файлами базы данных и параметрами автоматического увеличения файлов. Типичные причины и способы устранения проблем с журналом транзакций примерно те же, что и в SQL Server.

Аналогично SQL Server, журнал транзакций для каждой базы данных усечен при успешном завершении резервного копирования журналов. Усечение журнала удаляет неактивные виртуальные файлы журналов (VLFs) из журнала транзакций, освобождая место внутри файла, но не изменяя размер файла на диске. Затем пустое пространство в файле журнала можно использовать для новых транзакций. Если файл журнала не может быть усечен при создании резервных копий журнала, размер файла журнала увеличивается в соответствии с новыми транзакциями. Если файл журнала увеличивается до максимального предела в Управляемый экземпляр SQL Azure, новые транзакции записи завершаются ошибкой.

В Управляемый экземпляр SQL Azure вы можете приобрести хранилище надстроек независимо от вычислительных ресурсов до предела. Дополнительные сведения см. в разделе "Управление файлами", чтобы освободить больше места.

Усечение журнала транзакций невозможно

Чтобы узнать, что препятствует усечению журнала в конкретном случае, см log_reuse_wait_desc в разделе sys.databases. В сообщении об ожидании повторного использования журнала указаны условия или причины, которые препятствуют усечению журнала транзакций при обычном резервном копировании журнала. Дополнительные сведения см. в разделе о sys.databases (Transact-SQL).

SELECT [name], log_reuse_wait_desc FROM sys.databases;

Следующие значения log_reuse_wait_desc в sys.databases могут указывать на причину, препятствующую усечению журнала транзакций базы данных:

log_reuse_wait_desc Diagnosis Требуется отклик
NOTHING Типичное состояние. Ничто не препятствует усечению журнала. Нет.
CHECKPOINT Для усечения журнала требуется контрольная точка. Редко. Отклик не требуется, если это состояние не сохраняется. Если это состояние сохраняется, создайте обращение в Службу поддержки Azure.
LOG BACKUP Требуется резервное копирование журнала. Отклик не требуется, если это состояние не сохраняется. Если это состояние сохраняется, создайте обращение в Службу поддержки Azure.
ACTIVE BACKUP OR RESTORE Выполняется резервное копирование базы данных. Отклик не требуется, если это состояние не сохраняется. Если это состояние сохраняется, создайте обращение в Службу поддержки Azure.
ACTIVE TRANSACTION Выполнение транзакции блокирует усечение журнала. Файл журнала не может быть усечен из-за активных и (или) незафиксированных транзакций. Ознакомьтесь со следующим разделом.
REPLICATION В Управляемый экземпляр SQL Azure может произойти, если включена реплика или CDC. При устойчивом анализе агентов, участвующих в CDC или реплика tion. Для устранения неполадок CDC создайте запрос заданий в параметре msdb.dbo.cdc_jobs. Если он отсутствует, добавьте запрос посредством sys.sp_cdc_add_job. Сведения об реплика см. в разделе "Устранение неполадок транзакционных реплика tion". Если ошибку не удается устранить, создайте обращение в Службу поддержки Azure.
РЕПЛИКА ДОСТУПНОСТИ Выполняется синхронизация с вторичной репликой. Отклик не требуется, если это состояние не сохраняется. Если это состояние сохраняется, создайте обращение в Службу поддержки Azure.

Усечению журнала препятствует активная транзакция

Самой распространенной причиной того, что журнал транзакций не может принимать новые транзакции, является длительно выполняемая или заблокированная транзакция.

Выполните этот пример запроса, чтобы найти незафиксированные или активные транзакции и их свойства.

  • Возвращает сведения о свойствах транзакций из sys.dm_tran_active_transactions.
  • Возвращает сведения о подключении к сеансу из sys.dm_exec_sessions.
  • Возвращает сведения о запросе (для активных запросов) из sys.dm_exec_requests. Этот запрос также можно использовать для обнаружения заблокированных сеансов. Для этого найдите request_blocked_by. Дополнительные сведения см. в разделе "Сбор сведений о блокировке".
  • Возвращает текст текущего запроса или текст из буфера входных данных с помощью представлений DMV sys.dm_exec_sql_text или sys.dm_exec_input_buffer. Если данные, возвращаемые text полем sys.dm_exec_sql_text , то NULLзапрос не активен, но имеет выдающуюся транзакцию. В этом случае event_info поле sys.dm_exec_input_buffer содержит последнюю инструкцию, переданную в ядро СУБД.
SELECT [database_name] = db_name(s.database_id)
, tat.transaction_id, tat.transaction_begin_time, tst.session_id 
, session_open_transaction_count = tst.open_transaction_count
, transaction_duration_s = datediff(s, tat.transaction_begin_time, sysdatetime())
, input_buffer = ib.event_info
, request_text = CASE  WHEN r.statement_start_offset = 0 and r.statement_end_offset= 0 THEN left(est.text, 4000)
                       ELSE    SUBSTRING ( est.[text],    r.statement_start_offset/2 + 1, 
                                           CASE WHEN r.statement_end_offset = -1 THEN LEN (CONVERT(nvarchar(max), est.[text])) 
                                                ELSE r.statement_end_offset/2 - r.statement_start_offset/2 + 1
                                           END  )  END
, request_status = r.status
, request_blocked_by = r.blocking_session_id
, transaction_state = CASE tat.transaction_state    
                     WHEN 0 THEN 'The transaction has not been completely initialized yet.'
                     WHEN 1 THEN 'The transaction has been initialized but has not started.'
                     WHEN 2 THEN 'The transaction is active - has not been committed or rolled back.'
                     WHEN 3 THEN 'The transaction has ended. This is used for read-only transactions.'
                     WHEN 4 THEN 'The commit process has been initiated on the distributed transaction. This is for distributed transactions only. The distributed transaction is still active but further processing cannot take place.'
                     WHEN 5 THEN 'The transaction is in a prepared state and waiting resolution.'
                     WHEN 6 THEN 'The transaction has been committed.'
                     WHEN 7 THEN 'The transaction is being rolled back.'
                     WHEN 8 THEN 'The transaction has been rolled back.' END 
, transaction_name = tat.name
, transaction_type = CASE tat.transaction_type    WHEN 1 THEN 'Read/write transaction'
                                             WHEN 2 THEN 'Read-only transaction'
                                             WHEN 3 THEN 'System transaction'
                                             WHEN 4 THEN 'Distributed transaction' END
, tst.is_user_transaction
, local_or_distributed = CASE tst.is_local WHEN 1 THEN 'Local transaction, not distributed' WHEN 0 THEN 'Distributed transaction or an enlisted bound session transaction.' END
, transaction_uow    --for distributed transactions. 
, s.login_time, s.host_name, s.program_name, s.client_interface_name, s.login_name, s.is_user_process
, session_cpu_time = s.cpu_time, session_logical_reads = s.logical_reads, session_reads = s.reads, session_writes = s.writes
, observed = sysdatetimeoffset()
FROM sys.dm_tran_active_transactions AS tat 
INNER JOIN sys.dm_tran_session_transactions AS tst  on tat.transaction_id = tst.transaction_id
INNER JOIN Sys.dm_exec_sessions AS s on s.session_id = tst.session_id 
LEFT OUTER JOIN sys.dm_exec_requests AS r on r.session_id = s.session_id
CROSS APPLY sys.dm_exec_input_buffer(s.session_id, null) AS ib 
OUTER APPLY sys.dm_exec_sql_text (r.sql_handle) AS est;

Управление файлами для освобождения пространства

Если журнал транзакций не усекается в Управляемый экземпляр SQL Azure, освобождение места может быть частью решения. Однако большое значение имеет устранение первопричины блокировки усечения файла журнала транзакций. В некоторых случаях временное создание дополнительного места на диске позволяет выполнять длительные транзакции, удалив условие, блокирующее усечение файла журнала транзакций с помощью обычной резервной копии журнала транзакций. Однако освобождение места может обеспечить только временное облегчение до тех пор, пока журнал транзакций снова не будет расти.

В Управляемый экземпляр SQL Azure вы можете приобрести хранилище надстроек независимо от вычислительных ресурсов до предела. Например, в портал Azure перейдите на страницу вычислений и хранилища, чтобы увеличить служба хранилища в ГБ. Сведения об ограничениях размера журнала транзакций см. в разделе об ограничениях ресурсов для Управляемый экземпляр SQL. Дополнительные сведения см. в статье "Управление пространством файлов для баз данных в Управляемый экземпляр SQL Azure".

Хранилище резервных копий не вычитается из места хранения управляемого экземпляра SQL. Хранилище резервных копий не зависит от пространства хранилища экземпляров и не ограничено в размере.

Ошибка 9002: журнал транзакций для базы данных заполнен

9002: The transaction log for database '%.*ls' is full. To find out why space in the log cannot be reused, see the log_reuse_wait_desc column in sys.databases.

Ошибка 9002 возникает в SQL Server и в Управляемый экземпляр SQL Azure по тем же причинам.

Предпринимаемые действия при переполнении журнала транзакций зависят от условий, которые вызвали эту ситуацию.

Чтобы устранить ошибку 9002, попробуйте следующие методы:

  • Журнал транзакций не усечен и вырос, чтобы заполнить все доступное пространство.
    • Так как резервные копии журналов транзакций в Управляемый экземпляр SQL Azure являются автоматическими, что-то другое должно поддерживать усечение действия журнала транзакций. Неполные реплика, CDC или синхронизация группы доступности могут препятствовать усечению, см. раздел "Предотвращение усечения журнала транзакций".
  • Размер зарезервированного хранилища управляемого экземпляра SQL заполнен, и журнал транзакций не может увеличиваться.
  • Размер журнала транзакций имеет фиксированное максимальное значение или автоматический рост отключен и поэтому не может увеличиваться.

Ошибка 40552: сеанс был завершен в связи с чрезмерным использованием объема журнала транзакций

40552: The session has been terminated because of excessive transaction log space usage. Try modifying fewer rows in a single transaction.

Хотя ошибка 9002 чаще, чем ошибка 40552 в Управляемый экземпляр SQL Azure, могут возникать оба варианта.

Чтобы устранить ошибку 40552, попробуйте выполнить следующие методы:

  • Проблема может возникать в любой операции DML, например вставке, обновлении или удалении. Проверьте транзакцию, чтобы избежать ненужных операций записи. Попробуйте сократить количество строк, которые обрабатываются непосредственно, выполнив пакетную обработку или разделение на несколько меньших транзакций. Дополнительные сведения см. в статье о том, как использовать пакетную обработку для повышения производительности приложения.
  • Эта проблема может возникать из-за операций перестроения индекса. Чтобы избежать этой проблемы, убедитесь, что следующая формула верна: (число затрагиваемых строк в таблице), умноженное на (средний размер обновляемого поля в байтах + 80) < 2 гигабайта (ГБ). Для больших таблиц можно создать разделы и выполнить обслуживание индекса только в некоторых разделах таблицы. Дополнительные сведения см. в статье Создание секционированных таблиц и индексов.
  • В случае выполнения массовых вставок с использованием служебной программы bcp.exe или класса System.Data.SqlClient.SqlBulkCopy попробуйте ограничить количество строк, копируемых на сервер при каждой транзакции, с помощью параметра -b batchsize или BatchSize. Дополнительные сведения см. в разделе bcp Utility.
  • Если вы перестроите индекс с ALTER INDEX помощью инструкции, используйте SORT_IN_TEMPDB = ONпараметр и ONLINE = ONRESUMABLE=ON параметры. При возобновлении индексов усечение журнала чаще всего. Дополнительные сведения см. в разделе ALTER INDEX (Transact-SQL).

Следующие шаги