Sql-Server

Azuredb 數據庫“tempdb”已達到其大小配額

  • January 16, 2018

我們正在 S3 層上執行 V12 Azure 數據庫實例。數據庫上仍有大約 100GB 的可用空間。當使用在不同的非 Azure SQL 伺服器上執行的 SSIS 載入 85MB XML 文件並將其直接插入到 azure 數據庫中時,插入在目標數據庫上崩潰並出現以下錯誤。

數據庫“tempdb”已達到其大小配額。分區或刪除數據、刪除索引或查閱文件以獲取可能的解決方案。

tempdb 是否有任何限制,或者知道為什麼這可能會崩潰?85MB的文件怎麼可能填滿數據庫的剩餘空間。似乎以tempdb某種方式隱藏,我如何監控它的使用情況?

限制取決於您的服務試用者,在此情況下,數據庫不少於 250 GB,但附加到此數據庫的 tempdb 僅為 32 MB。您可以在此處查看其他可用資源Azure SQL 數據庫資源限制和有關 Azure tempdb 的資訊,此處為 SQL 數據庫中的 Tempdb 數據庫

有幾個選項可讓您調查 tempdb 的情況。它是隱藏的,但您仍然可以查詢 sys 對像以檢索有關此類數據庫的資訊。嘗試檢查以下資源:

當您發現什麼正在消耗 tempdb 資源時,您應該能夠修復它或使用其他資訊擴展您的問題。

正如您所說,您的文件是 85 MB,我們可以看到它超過了最大 tempdb 數據大小。嘗試一次處理較小的數據塊。在這種情況下,您還應該考慮 BULK 插入。

您可以執行以下命令來檢索有關哪些任務(在 Azure V12 數據庫中)正在使用 Tempdb(從您的 userDB 執行)的資訊:

SELECT es.host_name , es.login_name , es.program_name
    , st.dbid as QueryExecContextDBID, DB_NAME(st.dbid) as QueryExecContextDBNAME
    , st.objectid as ModuleObjectId
    , SUBSTRING(st.text, er.statement_start_offset/2 + 1
                       ,(CASE WHEN er.statement_end_offset = -1 
                              THEN LEN(CONVERT(nvarchar(max),st.text))*2 
                              ELSE er.statement_end_offset
                         END - er.statement_start_offset)/2
               ) as Query_Text
    , tsu.session_id ,tsu.request_id, tsu.exec_context_id
    , (tsu.user_objects_alloc_page_count - tsu.user_objects_dealloc_page_count) as OutStanding_user_objects_page_counts
    , (tsu.internal_objects_alloc_page_count - tsu.internal_objects_dealloc_page_count) as OutStanding_internal_objects_page_counts
    , er.start_time, er.command, er.open_transaction_count
    , er.percent_complete, er.estimated_completion_time
    , er.cpu_time, er.total_elapsed_time, er.reads,er.writes
    , er.logical_reads, er.granted_query_memory 
FROM tempdb.sys.dm_db_task_space_usage tsu  
JOIN sys.dm_exec_requests er 
   ON tsu.session_id = er.session_id 
  AND tsu.request_id = er.request_id  
JOIN sys.dm_exec_sessions es 
   ON tsu.session_id = es.session_id   
CROSS APPLY sys.dm_exec_sql_text(er.sql_handle) st 
WHERE (tsu.internal_objects_alloc_page_count 
     +tsu.user_objects_alloc_page_count) > 0 
ORDER BY (tsu.user_objects_alloc_page_count -
         tsu.user_objects_dealloc_page_count)
      + (tsu.internal_objects_alloc_page_count - 
         tsu.internal_objects_dealloc_page_count) DESC  

引用自:https://dba.stackexchange.com/questions/147987