SQL Server Sızdıran İşlemler


9

TDS aracılığıyla TCP üzerinden günlük alanı serbest bırakmıyor gibi görünen 50 istemci tarafından erişilen bir veritabanım var. Süreç sayısı beklenen 50 civarında kalır ve bazıları oldukça uzun ömürlüdür (> 120 gün).

Veritabanı şimdi günlük alanı 40 gb (sadece 14 gb veri var), 39 gb ücretsiz. Sürücüdeki alan sınırlamaları nedeniyle, daha makul bir şeye (10gb-ish) küçülmek istiyorum. Yürüttüğümde DBCC SHRINKFILE('db_log', 10000), günlüğün sonunun kullanımda olduğu bir hata döndürür.

Günlüğün sonuna ücretsiz erişim sağlamak için, veritabanını aşağıdaki gibi tek kullanıcı moduna yerleştirmeye çalıştım:

ALTER DATABASE db SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
ALTER DATABASE db SET MULTI_USER
GO

ancak komut dosyası yüzlerce kez tekrarlanan aşağıdaki iletiyi döndürüyor:

Nonqualified transactions are being rolled back. Estimated rollback completion: 100%.

Bu da beni bir yerde inanıyorum, bazı işlemleri yasaklıyorum. Bu kadar çok işlemi bir kerede kasıtlı olarak açacak herhangi bir sürecin farkında değilim, bu yüzden zamanla birikmeleri ve asla kapatılmamaları gerektiğini düşünüyorum.

Soru: Sorun yaratan işlemi veya komut dosyasını nasıl bulabilirim veya günlük neden serbest bırakılmıyor?

sys.dm_tran_active_transactionsanlaşılır amaçlarla makul 18 işlem gösteriyor. sp_whosadece farkında olduğum süreçleri gösterir.


SQL Server Sürümü:

Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) 
Apr  2 2010 15:48:46 
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)

Sunucu Sürümü:

Windows Server 2008 R2 x64 - Datacenter 4 vCPU'lar, 16 GB bellek, Veri ve günlük için diskten geçiş, OS diski VHD

-V (Windows Server 2008 R2 SP1 x64 Datacenter) Çift Intel X5650 (6 çekirdekli, 2,67GHz'de 12 iş parçacığı) 72 GB bellek

Hipervizörün yalnızca üç VM'si vardır ve yüksek kaynak kullanımı göstermez. SQL Server VM, yük altında ~% 40 CPU ve% 99 önbellek isabet gösterir.


Ben bir sql dba değilim ama günlük yedekleme yaptınız mı? serverfault.com/questions/54958/…

@rene, Evet, bundan bahsetmiş olmalıydım, ancak veritabanının her gün tam bir yedekleme ve altı saatte bir günlük yedeklemesi var.

Merhaba Mitch, muhtemelen bu konuyla ilgisiz, ancak bu sorumlu olsaydı şaşırmazdı. Sürümünüz RTM'dir (Üretim Sürümü). Microsoft, diğer tüm yazılım satıcıları gibi, bir sonraki büyük sürümü üründe birkaç küçük kusurla serbest bırakmaya zorlayacaktır. [link] microsoft.com/en-us/download/details.aspx?id=44271 Bu, SQL 2008 R2 için en son Hizmet Paketi'nin bağlantısıdır. Güvenlik, hata düzeltmeleri ve Performans nedenleriyle sunucularınızı güncel tutmak için en iyisi.
DamagedGoods

Yanıtlar:


4

AÇIK işlemleri gösteren bir SQL komutu vardır. (DBCC OPENTRAN)

http://msdn.microsoft.com/en-us/library/ms182792.aspx

Belirtilen veritabanı içinde, en eski etkin işlem ve varsa en eski dağıtılmış ve dağıtılmamış çoğaltılmış işlemlerle ilgili bilgileri görüntüler. Sonuçlar yalnızca etkin bir işlem varsa veya veritabanı çoğaltma bilgileri içeriyorsa görüntülenir


4

Hangi nedenle olursa olsun, günlük dosyasını açık tutan hiçbir şey görünmüyordu. Birden çok günlük yedeklemesi (> 10) çalıştırılarak, günlüğün sonu serbest bırakılır ve daralma meydana gelebilir. Neden olduğundan emin değilim ... ama işe yaradı.

backup log db to disk = '\\l-backup1\drop\2012-12-23_db_log.bak' with stats = 1
go 15
dbcc shrinkfile('db_log', 10240)
go

3

Sorunuzu doğru anlıyorsam, 39Gb ücretsiz 40Gb işlem günlüğünüz var mı? Günlük, daha küçük Sanal Günlük Dosyalarından oluşan dairesel bir yapıdır. Bir VLF her dolduğunda, SQL bir sonraki VLF'yi kullanmaya başlar. (Dosyadaki VLF'lerle aynı sırada olması gerekmez). Günlük dosyasını daralttığınızda günlüğün sonundan boş alan bırakır. Eğer kütüğün aktif kısmı sonunda ise, boşluk bırakılamaz, eğer ortada bir yerde ise, o zaman sadece boşluğun bir kısmını geri kazanabilirsiniz. DBCC LOGINFO, günlükteki tüm VLF'leri ve VLF'nin şu anda etkin bir günlük içerdiğini gösteren bir durumu gösterir. Durum 2'nin aktif ve 0'ın aktif olmadığına inanıyorum. Google'ın gerekirse daha fazla bilgi sağlayabileceğinden eminim.

Sorununuz sadece aktif kısmın şu anda sonunda olması durumunda, en iyi bahsiniz sadece tekrar başlangıç ​​noktasına gelene kadar beklemek ve daha sonra günlüğü küçültmektir. Bu şaşırtıcı bir zaman alabilir, sabırlı olun. Oraya varacak.
Ayrıca, bir VLF'nin HERHANGİ bir kısmı aktifse, tüm VLF'nin aktif tutulduğunu unutmayın.

Bununla birlikte, günlük dosyasının boyutunu izlemelisiniz, eğer beklenmedik bir şekilde tekrar büyürse, nedenle ilgili biraz araştırma yapmanız gerekir. Günlük dosyasının gereksiz yere küçülmesini önlemelisiniz, yeniden büyüdüğünde performansı yavaşlatabilir.

VLF'ler hakkında daha fazla bilgi burada Kimberly Tripps blog gönderisinde bulunabilir .


DBCC LOGINFOemir için teşekkürler , bundan habersizdim. Bununla birlikte, kütüğün yapısının farkındayım ve dosyayı gereksiz yere küçültmeyi düşünmüyorum. Belirtildiği gibi, mevcut yedekleme yapımızda düzenli olarak sadece 1GB günlük kayıt kullanıyoruz ve boş alanların bir kısmını geri almak istiyorum. Sorun, günlüğün sonundaki günlük alanının birkaç hafta bekledikten sonra bile serbest bırakılmamasıdır. Bu süre zarfında, veritabanı birçok tam ve günlük yedeklemesine sahipti, bu da bir şeyin doğal çemberleri önlemek olduğuna inanmamı sağlıyor.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.