Share via


Yetersiz Disk alanı tempdb içinde sorun giderme

Bu konu, yordamlar ve öneriler, yetersiz disk alanı nedeniyle oluşan sorunları giderme ve tanılama yardımcı sağlar tempdb veritabanı.Disk alanı yetersiz çalışan tempdb önemli kesintilerini de neden olabilir SQL Server üretim ortamı ve operasyon. tamamlamanızı çalışan uygulamalar yasaklayabilirsiniz

tempdb alanı gereksinimleri

The tempdb system database is a global resource that is available to all users that are connected to an instance of SQL Server.The tempdb database is used to store the following objects: kullanıcı nesneleri iç nesneleri ve sürüm depolar.

Kullanabileceğiniz sys.dm_db_file_space_usage dinamik yönetim görünümü kullanıcı nesneleri iç nesneleri ve sürüm tarafından kullanılan disk alanını izlemek için saklar tempdb dosyaları.Ayrıca, sayfa ayırma veya miktarda kaldırma etkinliğini izlemek için tempdb oturum veya görev düzey, kullanabileceğiniz sys.dm_db_session_space_usage ve sys.dm_db_task_space_usage dinamik yönetimi görünümleri.Bu görünümleri büyük sorgular, geçici tablolar veya büyük miktarda kullanarak tablo değişkenlerini tanımlamak için kullanılan tempdb disk alanı.

Tempdb Disk alanı sorunlarını tanılama

Aşağıdaki tablo , yetersiz disk alanı belirten hata iletileri listeler tempdb veritabanı.Bu hatalar bulunabilir SQL Server hata günlüğüve çalışan bir uygulamaya da verdi.

Hata

Ne zaman oluşturulur

1101 veya 1105

Tüm oturum yer ayrılması gerekir tempdb.

3959

Sürüm deposu dolu.Bu hata genellikle bir günlüğüne 1105 veya 1101 hatadan sonra görünür.

3967

Sürüm deposu olduğundan daraltmak zorunda tempdb dolu.

3958 veya 3966

Bir işlem gerekli sürüm kaydı bulunamıyor tempdb.

tempdb disk alanı sorunlarını da veritabanı olduğunda gösterilir küme için otomatik büyüme ve veritabanının boyutu hızla artırıyor.

Tempdb Disk alanı izleme

Aşağıdaki örnekler, kullanılabilir alan miktarını belirleme tempdbve ve iç sürüm deposu tarafından kullanılan alanı ve kullanıcı nesneleri.

Tutar, boş alanı, tempdb belirleme

Aşağıdaki sorgu megabayt (mb) kullanılabilir tüm dosyalarda boş sayfaları ve toplam boş alan toplam sayısını verir tempdb.

SELECT SUM(unallocated_extent_page_count) AS [free pages], 
(SUM(unallocated_extent_page_count)*1.0/128) AS [free space in MB]
FROM sys.dm_db_file_space_usage;

Sürüm deposu tarafından kullanılan tutarı alanını belirleme

Aşağıdaki sorgu sürüm deposu ve içinde sürüm deposu tarafından kullanılan MB Toplam alan tarafından kullanılan sayfaların toplam sayısını verir tempdb.

SELECT SUM(version_store_reserved_page_count) AS [version store pages used],
(SUM(version_store_reserved_page_count)*1.0/128) AS [version store space in MB]
FROM sys.dm_db_file_space_usage;

En uzun çalışan hareket belirleme

Sürüm deposu alanının çok kullanarak, tempdb, ne en uzun çalışan hareketi mi olduğunu belirlemelidir.Etkin işlemler sırasıyla en uzun çalışan işlem tarafından listelemek için bu sorguyu kullanın.

SELECT transaction_id
FROM sys.dm_tran_active_snapshot_database_transactions 
ORDER BY elapsed_time_seconds DESC;

Bir çevrimiçi dizin işlemi ilgili uzun süren bir işlem büyük sürüm deposu gerektirir.Bu sürüm deposu işlem başlatıldığından bu yana üretilen tüm sürümleri tutar.Çevrimiçi dizin oluşturma işlemleri tamamlamak için uzun bir saat alabilir, ancak çevrimiçi dizin işlemleri için ayrılmış ayrı sürüm deposu kullanılır.Bu nedenle, bu işlemler kaldırılmakta gelen diğer hareketleri sürümlerden engellemez.Daha fazla bilgi için bkz: Satır sürüm oluşturma kaynak kullanımı.

İç nesneleri tarafından kullanılan alan miktarını belirleme

Aşağıdaki sorgu döndürür pages iç nesneleri ve iç nesneleri tarafından kullanılan MB Toplam alan tarafından kullanılan toplam sayısı tempdb.

SELECT SUM(internal_object_reserved_page_count) AS [internal object pages used],
(SUM(internal_object_reserved_page_count)*1.0/128) AS [internal object space in MB]
FROM sys.dm_db_file_space_usage;

Kullanıcı nesneleri tarafından kullanılan alan miktarını belirleme

Toplam kullanıcı nesneleri tarafından kullanılan sayfa sayısı ve kullanıcı nesneleri tarafından kullanılan toplam alanı aşağıdaki sorgu döndürür tempdb.

SELECT SUM(user_object_reserved_page_count) AS [user object pages used],
(SUM(user_object_reserved_page_count)*1.0/128) AS [user object space in MB]
FROM sys.dm_db_file_space_usage;

Boşluk (boş ve kullanılan) toplam miktarını belirleme

Aşağıdaki sorgu tüm dosyalar tarafından kullanılan disk alanının toplam tutarı verir tempdb.

SELECT SUM(size)*1.0/128 AS [size in MB]
FROM tempdb.sys.database_files

Sorgular tarafından kullanılan alanı izleme

En yaygın türlerinden biri tempdb alan kullanım sorunları büyük miktarda disk alanı kullanan büyük sorgularla ilişkili.Genellikle, iş tabloları veya çalışma dosyaları gibi iç nesneleri için bu alan kullanılır.İç nesneleri tarafından kullanılan alanı izleme, ne kadar alanın kullanıldığını bildirir, ancak bu alanı kullanarak sorguyu doğrudan tanımlamaz.

Aşağıdaki yöntemlerden en çok alanı kullanarak sorguları belirlemenize yardımcı tempdb.İlk yöntem toplu iş iş - incelerdüzey veri ve daha az veri İkinci yöntem yoğun.İkinci yöntem belirli sorgu, geçici tablo veya disk alanı kullanan bir tablo değişkeni tanımlamak için kullanılan, ancak daha fazla yanıt almak için toplanan veriler gerekir.

Yöntem 1: Toplu işlem düzeyinde bilgi

toplu iş iş iş istek birkaç sorguları içerir ve yalnızca biri karmaşık bir sorgu ise, genellikle yalnızca belirli sorgu yerine boşluk hangi toplu iş iş tüketen bilmeniz yeterli bilgi budur.

Bu ayarı kullanarak devam etmek için yöntem, bir sql Server Agent işi dan yoklamak için küme olması gerekir sys.dm_db_session_space_usage ve sys.dm_db_task_space_usage birkaç dakika aralığında bir yoklama aralık kullanarak dinamik yönetimi görünümleri.Aşağıdaki örnekte, üç dakikalık bir yoklama aralığı kullanılır.Çünkü her iki görünümlerinden yoklaması gerekir sys.dm_db_session_space_usage geçerli etkin görev ayırma etkinliğini içermez.İki saat aralıklarla tahsis sayfaları arasındaki fark karşılaştırma kaç sayfa aralıkları arasında ayrılan hesaplamak sağlar.

Aşağıdaki örnekler, sql Server Agent iş için gerekli olan sorguları sağlar.

A.Tüm görevlerin her birini çalışmakta, iç nesneleri tarafından tüketilen alanı almaktan oturum.

Görünümü aşağıdaki örnek oluşturur all_task_usage.Sorgulanan, görünümü şu anda tüm çalışan görevleri bulunan iç nesneleri tarafından kullanılan toplam alanı döndürür tempdb.

CREATE VIEW all_task_usage
AS 
    SELECT session_id, 
      SUM(internal_objects_alloc_page_count) AS task_internal_objects_alloc_page_count,
      SUM(internal_objects_dealloc_page_count) AS task_internal_objects_dealloc_page_count 
    FROM sys.dm_db_task_space_usage 
    GROUP BY session_id;
GO

B.Geçerli iç nesneleri tarafından tüketilen alanı almaktan oturum her iki çalıştırma ve tamamlanan görevler

Görünümü aşağıdaki örnek oluşturur all_session_usage.Sorgulanan, görünümü alan çalışan tüm iç nesneleri tarafından kullanılan ve tamamlanan görevler de döndürür tempdb.

CREATE VIEW all_session_usage 
AS
    SELECT R1.session_id,
        R1.internal_objects_alloc_page_count 
        + R2.task_internal_objects_alloc_page_count AS session_internal_objects_alloc_page_count,
        R1.internal_objects_dealloc_page_count 
        + R2.task_internal_objects_dealloc_page_count AS session_internal_objects_dealloc_page_count
    FROM sys.dm_db_session_space_usage AS R1 
    INNER JOIN all_task_usage AS R2 ON R1.session_id = R2.session_id;
GO

Bu görünümler üç dakikalık aralıklarla sorgulandığında sonuç kümeleri aşağıdaki bilgileri sağlamanız varsayalım.

  • AT 17:00, oturum 71 100 sayfa ayrılan ve oturumun başlangıç itibaren 100 sayfadan kaldırıldı.

  • 5:03 PM, oturum 71 20100 sayfaları tahsis ve oturumun başlangıç itibaren 100 sayfadan kaldırıldı.

Bu bilgileri analiz yaparken, iki ölçüm arasındaki anlayabilirsiniz: Oturum 20.000 pages iç nesneleri için ayrılmış ve tüm sayfaları ayırması.Bu, olası bir sorunu gösterir.

Not

Veritabanı Yöneticisi olarak üç dakikadan daha sık yoklamak isteyebilirsiniz.Üç dakikadan daha kısa bir süre için bir sorgu çalışır, ancak sorgu muhtemelen alanında önemli miktarda tüketir değil tempdb.

Sırasında çalışan toplu iş iş belirlemek için saat, kullanma sql Server Profiler'I yakalamak için rpc: tamamlandı ve SQL:BatchCompleted olay sınıfları.

Kullanmaya alternatif SQL Server Profiler çalıştırmak için ise dbcc inputbuffer her üç aşağıdaki örnekte gösterildiği gibi tüm oturumlar dakika sonra.

DECLARE @max int;
DECLARE @i int;
SELECT @max = max (session_id)
FROM sys.dm_exec_sessions
SET @i = 51
  WHILE @i <= @max BEGIN
         IF EXISTS (SELECT session_id FROM sys.dm_exec_sessions
                    WHERE session_id=@i)
         DBCC INPUTBUFFER (@i)
         SET @i=@i+1
         END;

Yöntem 2: Sorgu düzey bilgileri

Bazen sadece giriş arabellek bakan veya SQL Server Profiler olay SQL:BatchCompleted her zaman hangi sorgu çoğu disk alanı kullandığını söylemek tempdb.Bu yanıtı bulmak için aşağıdaki yöntemleri kullanılabilir, ancak bu yöntemleri Yöntem 1'de tanımlanan yordamlara göre daha fazla veri toplama gerektirir.

Bu yöntem ile devam etmek için küme bir sql Server Agent işi dan yokladığı iş sys.dm_db_task_space_usage Dinamik yönetim görünümü.Yoklama aralığı bir kez bir dakika, yöntem 1 karşılaştırıldığında kısa, olmalıdır.Bu kısa süre, çünkü sys.dm_db_task_space_usage (görev) sorgu şu anda çalışıyorsa, veri döndürmez.

yoklama sorgusu görünümü tanımlanan sys.dm_db_task_space_usage Dinamik yönetim görünümü ile katılırsa sys.dm_exec_requests dönmek için sql_handle, statement_start_offset, statement_end_offset, ve plan_handle sütunlar.

CREATE VIEW all_request_usage
AS 
  SELECT session_id, request_id, 
      SUM(internal_objects_alloc_page_count) AS request_internal_objects_alloc_page_count,
      SUM(internal_objects_dealloc_page_count)AS request_internal_objects_dealloc_page_count 
  FROM sys.dm_db_task_space_usage 
  GROUP BY session_id, request_id;
GO
CREATE VIEW all_query_usage
AS
  SELECT R1.session_id, R1.request_id, 
      R1.request_internal_objects_alloc_page_count, R1.request_internal_objects_dealloc_page_count,
      R2.sql_handle, R2.statement_start_offset, R2.statement_end_offset, R2.plan_handle
  FROM all_request_usage R1
  INNER JOIN sys.dm_exec_requests R2 ON R1.session_id = R2.session_id and R1.request_id = R2.request_id;
GO

Sorgu planı önbellekte yer alıyorsa, alabileceğiniz Transact-SQL , sorgu ve sorgu yürütme planında metin xml gösterim planı her saat biçimi.Elde etmek için Transact-SQL sorgusunun yürütülecek olan kullanım metin sql_handle değeri ve sys.dm_exec_sql_text dinamik yönetim işlev.Sorgu planı yürütme elde etmek için plan_handle değeri ve sys.dm_exec_query_plan dinamik yönetim işlev.

SELECT * FROM sys.dm_exec_sql_text(@sql_handle);
SELECT * FROM sys.dm_exec_query_plan(@plan_handle);

Sorgu planı önbellekte değilse, aşağıdaki yöntemlerden birini kullanarak elde etmek için kullanabileceğiniz Transact-SQL metin sorgu ve sorgu yürütme planı.

A.Yoklama yöntem kullanarak

Anket görünümü all_query_usage, ve sorgu metnini elde etmek için aşağıdaki sorguyu çalıştırın:

SELECT R1.sql_handle, R2.text 
FROM all_query_usage AS R1
OUTER APPLY sys.dm_exec_sql_text(R1.sql_handle) AS R2;

Çünkü sql_handle benzersiz her toplu iş iş iş için benzersiz olması gerekir, yinelenen kaydetmek zorunda sql_handle girdi.

Planı tanıtıcı ve xml planı kaydetmek için aşağıdaki sorguyu çalıştırın.

SELECT R1.plan_handle, R2.query_plan 
FROM all_query_usage AS R1
OUTER APPLY sys.dm_exec_query_plan(R1.plan_handle) AS R2;

B.sql Server Profiler olayları kullanma

Yoklama alternatif olarak sys.dm_exec_sql_text ve sys.dm_exec_query_plan işlevleri kullanarak SQL Server Profiler olayları.Sorgu planı ve oluşturulan sorgu metni yakalamak için kullanılan profiler olayları vardır.Örneğin, olay 165 izleme, sql metin, sorgu planları ve sorgu istatistikleri için performans istatistiklerini verir.

Temp tablolar ve tablo değişkenleri tarafından kullanılan alanı izleme

Yoklama sorguları için benzer bir yaklaşım, geçici tablo ve geçici değişkenler tarafından kullanılan alanı izlemek için kullanabilirsiniz.Büyük miktarda geçici tablolar içinde kullanıcı verileri almak veya temp değişkeni uygulamalarının kullanımı sorunları alan neden olabilir tempdb.Bu tablolar veya değişkenleri kullanıcı nesnelerine ait.Kullanabileceğiniz user_objects_alloc_page_count ve user_objects_dealloc_page_count sütunlarında sys.dm_db_session_space_usage Dinamik yönetim görünümü ve yöntemleri daha önce açıklanan izleyin.

Sayfa ayırma ve kaldırma oturum tarafından izlenmesi

Aşağıdaki tablo tarafından döndürülen sonuçlarnı gösteren sys.dm_db_file_space_usage, sys.dm_db_session_space_usage, ve sys.dm_db_task_space_usage dinamik yönetimi görünümleri için belirtilen oturum.Her satır bir ayırma veya miktarda kaldırma faaliyet gösteren tempdb için belirtilen oturum.Etkinlik listelenir olay sütun.Kalan sütunları dinamik yönetimi görünümler sütunlarda döndürülen değerleri gösterir.

Bu senaryo için yaptığınızı varsayar tempdb veritabanı başlar ayrılmamış kapsamlarını 872 sayfalarla ve kullanıcı nesnesindeki 100 sayfadan ayrılmış kapsamlarını.Oturumun kullanıcı için 10 sayfa ayıran tablove bunların tümünü kaldırır.İlk 8 sayfa içinde karıştırılır kapsam.Kalan 2 sayfa içinde Yeknesak olan kapsam.

Olay

dm_db_file_space_usage

unallocated_extent_page_count sütun

dm_db_file_space_usage

user_object_reserved_page_count sütun

dm_db_session_space_usage

ve dm_db_task_space_usage

user_object_alloc_page_count sütun

dm_db_session_space_usage

ve dm_db_task_space_usage

user_object_dealloc_page_count sütun

Start

872

100

0

0

Sayfa 1 karışık varolan tahsiskapsam

872

100

1

0

Sayfa 2 ile 8 ayrılamadı: Yeni tüketen bir karmakapsam

864

80

8

0

Sayfa 9 ayrılamadı: bir yeni birörnek tüketenkapsam

856

108

16

0

Sayfa 10 varolan Yeknesak tahsiskapsam

856

108

16

0

Deallocate sayfa 10 varolan Tekdüzen ölçüde

856

108

16

0

Sayfa 9 ve Yeknesak ayırmasıkapsam

864

100

16

8

Sayfa 8 ayırması

864

100

16

9

Sayfa 1 7 ayırması ve üzerinde karma ayırmasıkapsam

872

100

16

16