Bu iki SQL Server geri alma işlemi nasıl farklıdır?


13

SQL Server 2008 R2'de, bu iki geri alma nasıl farklıdır:

  1. ALTERBirkaç dakika boyunca bir ifade çalıştırın ve ardından 'Yürütmeyi İptal Et'e basın. Tamamen geri almak birkaç dakika alır.

  2. Aynı ALTERifadeyi çalıştırın , ancak bu LDFdosyanın başarıyla tamamlanması için yeterince büyük olmadığından emin olun . Bir kez LDFsınır karşılanmaktadır ve hiçbir 'Autogrowth izin verilmemiştir, sorgu yürütme hemen durur (ya da bir geri alma olur) Bu hata mesajı ile:

The statement has been terminated.
Msg 9002, Level 17, State 4, Line 1
The transaction log for database 'SampleDB' is full. 
To find out why space in the log cannot be reused, see the 
log_reuse_wait_desc column in sys.databases

Bu ikisi aşağıdaki noktalarda nasıl farklı?

  1. İkinci 'geri alma' neden anlık? Geri alma olarak adlandırılıp adlandırılamayacağından tam olarak emin değilim. Tahminimce, işlem ilerledikçe işlem günlüğü yazılır ve görevi tam olarak tamamlamak için yeterli alan olmadığını fark ettikten sonra, taahhüt olmadan, sadece bir 'son' mesajı ile durur.

  2. İlk geri alma çok zaman aldığında ne olur (geri alma tek iş parçacıklı mıdır)?
    2.1. SQL Server geri dönüp LDFdosyada yapılan girdileri geri alıyor mu?
    2.2. Geri LDFalma işleminin sonunda dosya boyutu küçülür (itibaren DBCC SQLPERF(LOGSPACE))

  3. Başka bir soru: İkinci senaryo sırasında, SQL Server LDFdosyayı hızlı bir şekilde tüketmeye başlar . Benim durumumda, ilk birkaç dakikada (<4 dakika)% 18 kullanımdan% 90 kullanıma yükseldi. Ancak% 99'a ulaştığında,% 99,1 ila% 99,8 arasında dalgalanma gösterirken, 8 dakika daha orada kaldı. Hata atılmadan önce birkaç kez yükselir (% 99.8) ve aşağı (% 99.2) ve tekrar (% 99.7) ve aşağı (% 99.5) yükselir. Perde arkasında neler oluyor?

Bunu daha fazla açıklamaya yardımcı olabilecek tüm MSDN bağlantıları takdir edilmektedir.

Ali Razeghi'nin önerisinde, perfmon ekliyorum: Disk Bytes/sec

Senaryo 1:

Senaryo 1

Senaryo 2:

Senaryo 2


Hızlı bir yorum: dosya boyutu! = Bir dosyada kullanılan alan.
Aaron Bertrand

@Aaron Evet, buna aşinayım. Kullanım ölçmek için DBCC SQLPERF (LOGSPACE) kullandım. Dosya boyutunu 10 GB ile sınırladığım için LDF dosyası tüm süre boyunca aynı kaldı. Dahili kullanım değişir.
ToC

1
Geri alma işlemi tamamlandıktan sonra hata bildirildiğinden , ikinci geri alma işleminin anlık göründüğünden şüpheleniyorum . Bunlar muhtemelen LDF kullanımının oldukça sabit kaldığı 3'te gözlemlediğiniz 8 dakikadır.
mustaccio

@mustaccio Sana katılıyorum ama eserler farklı bir yöne işaret ediyor. Aslında, geri alma gerçekleşmişse, günlük dosyası kullanımı daha küçük bir sayıya geri dönmelidir; ve hata mesajı atıldığında% 99.3'te kalmaz.
ToC

1
Geri alma işleminin günlük alanı gerektirdiğine inanıyorum. Geri alma sırasında günlük dolduğunda DB şüpheli olur. Daha fazla dokunulmaz. Bu, anında geri alma gibi görünür ancak veritabanını tekrar çevrimiçi duruma getirene kadar (kullanılabilir disk alanı olduğunda) geri alma ertelenir .; Ayrıca, günlük dolduğunda SQL Server, G / Ç etkinliğinde ani artışları açıklayabilen kontrol noktası ile yer açmayı deneyebilir.
usr

Yanıtlar:


1

Yukarıda belirtildiği gibi, daha fazla test yaptıktan sonra hesaplanmış bir sonuca vardım. Hepsini burada bir blog gönderisinde özetledim , ancak bazı içerikleri gelecek nesiller için bu gönderiye kopyalayacağım.

Konjektif (bazı testlere dayanarak)

Şu an itibariyle, bunun neden olduğuna dair net bir açıklamam yok. Ancak testler sırasında toplanan eserlere dayalı tahminlerim aşağıdadır.

Geri alma her iki senaryoda da gerçekleşir. Biri açık geri alma (kullanıcı İptal düğmesine basma), diğeri örtük (Sql Server bu kararı dahili olarak verir).

Her iki senaryoda da, günlük dosyasına giden trafik tutarlıdır. Aşağıdaki resimlere bakın:

Senaryo 1:

Senaryo 1:

Senaryo 2:

Senaryo 2

  • Bu düşünme çizgisini güçlendiren bir eser, her iki senaryoda da Sql Trace'yi yakalamaktır.

    • Senaryo 1, 'İptal' düğmesine bastığımızda kendini belli ediyor, geri dönüyor.
    • Senaryo 2'de, 'geri alma' örtük olarak gerçekleştirildikten sonra hata iletisi görüntülenir. Sql Trace'de, ekranda 'SampleDB' veritabanı için işlem günlüğü dolu 'hata mesajını ekranda görünmeden çok önce görüyoruz. Benim tahminim, geri almaların her iki senaryoda da gerçekleşmesidir, ancak geri alma işlemi başarıyla ve tamamen gerçekleştirildikten sonra hata mesajı Senaryo 2 olarak görüntülenir.
  • Senaryo 2, daha da ilerledikçe daha uzun sürüyor gibi görünüyor, bu nedenle geri alma daha uzun sürüyor.

Açıklanamayan davranış:

  • Günlük dosyası kullanımı neden bu kadar farklı?
    • % 90'a, sonra% 85'e, sonra% 99'a kadar yükselir ve orada uzun süre kalır. Bunun birkaç kez yukarı ve aşağı gittiğini görüyorum:% 99.2,% 99.8,% 99.1,% 99.7. Bu neden oluyor?
    • Olası bir açıklama, günlük dosyasını birkaç dakikada bir temizleyen bir arka plan işlemi (Log Flush gibi) olabileceğidir. Ve her başladığında, bazı girişler temizlenir, böylece daha fazla boş alan elde edilir.

Bu davranışı daha iyi açıklamaya yardımcı olacak herhangi bir fikir kabul edilir.


2
Paul Randal ile kontrol edildiğinde , doğru sonuca vardığınızı doğruladı - geri alma her iki durumda da aynıdır.
Paul White 9

0

Aşağıdaki denemeyi denedim ve benzer sonuçlar aldım. Her iki durumda da, fn_dblog () yöntemi geri alma olduğunu gösterir ve Senaryo 2'de Senaryo 1'den daha hızlı gerçekleşir.

Bu arada, hem MDF'yi hem de LDF'yi aynı tekli harici (USB 2.0) diske yerleştirdim.

İlk sonucum, bu durumda geri alma işleminde herhangi bir fark olmadığı ve muhtemelen herhangi bir görünür hız farkının I / O alt sistemiyle ilgili olduğudur. Şu anda benim çalışma hipotezim bu.

Senaryo 1:

  • 1 MB ile başlayan, 4 MB boyutunda büyüyen ve maksimum 100 MB boyutunda bir günlük dosyası içeren bir veritabanı oluşturun.
  • Açık bir işlem açın, 10 saniye çalıştırın ve ardından SSMS içinde el ile iptal edin
  • Fn_dblog () sayısı ve rezerv boyutuna bakın ve DBCC SQLPERF (LOGSPACE)

Senaryo 2:

  • 1 MB ile başlayan, 4 MB boyutunda büyüyen ve maksimum 100 MB boyutunda bir günlük dosyası içeren bir veritabanı oluşturun.
  • Açık bir işlem açın, günlük dolu olana kadar çalıştırın
  • Fn_dblog () sayısı ve rezerv boyutuna bakın ve DBCC SQLPERF (LOGSPACE)

Performans İzleyicisi Sonuçları:

Senaryo 1: *** Senaryo 1 ***

Senaryo 2: *** Senaryo 2 ***

Kod:

KULLANIM [master];
GİT

DATABASEPROPERTYEX (N'SampleDB ', N'Version')> 0
BAŞLA
    ALTER DATABASE [SampleDB] SET SINGLE_USER
        GERİ BİLDİRİM İLE;
    DAMLA VERİTABANI [SampleDB];
SON;
GİT

BİRİNCİ VERİTABANI OLUŞTUR [SampleDB] 
( 
      NAME = N'SampleDB '
    , FILENAME = N'E: \ data \ SampleDB.mdf ' 
    , SIZE = 3MB 
    , FILEGROWTH = 1MB 
)
GİRİŞ YAP 
( 
      NAME = N'SampleDB_log '
    , FILENAME = N'E: \ data \ SampleDB_log.ldf '
    , SIZE = 1MB 
    , MAXSIZE = 100 MB 
    , FILEGROWTH = 4MB 
);
GİT

KULLANIM [SampleDB];
GİT

- Tablo ekle
CREATE TABLE Instagram Hesabındaki Resim ve Videoları dbo.test
(
    c1 CHAR (8000) BOŞ DEĞİL DEFAULT REPLICATE ('a', 8000)
) AÇIK [İLK];
GİT

- Olmadığımızdan emin olun, sahte basit bir kurtarma modeli
YEDEK VERİTABANI SampleDB
DİSK = 'NUL';
GİT

- Günlük dosyasını yedekleyin
YEDEKLEME GÜNLÜĞÜ SampleDB
DİSK = 'NUL';
GİT

- Kullanılan günlük alanını kontrol edin
DBCC SQLPERF (LOGSPACE);
GİT

- fn_dblog () ile kaç kayıt görünür?
SELECT * FROM fn_dblog (NULL, NULL); - Benim durumumda yaklaşık 9

/ **********************************
             SENARYO 1
********************************** /
- Yeni bir işlem açın ve geri alın
İŞLEM BAŞLANGIÇ

    Dbo.test VARSAYILAN DEĞERLERİNE EKLE;
    GO 10000 - Let 10 saniye boyunca çalıştırın ve sonra SSMS sorgu penceresinde cancel tuşuna basın

    - İşlemi iptal et
    - İşlemin tamamlanması birkaç saniye sürmelidir


- İptal işlemi sizin için zaten yaptığı için işlemi geri almanıza gerek yok.
-- Sadece dene. Bu hatayı alacaksınız
Msg 3903, Seviye 16, Durum 1, Satır 1
- GERİ BESLEME İŞLEMİ isteğinin karşılık gelen BAŞLANGIÇ İŞLEMİ yok.
GERİ BİLDİRİM İŞLEMİ;

- Kullanılan günlük alanı nedir? % 100'ün üzerinde.
DBCC SQLPERF (LOGSPACE);
GİT

- fn_dblog () ile kaç kayıt görünür?
SEÇ * 
FROM_dblog'dan (NULL, NULL); - Benim durumumda yaklaşık 91.926

- fn_dblog () tarafından gösterilen toplam günlük rezervi?
TOPLA SEÇ ([Kayıt Rezervi]) AS [Toplam Kayıt Rezervi]
FROM_dblog'dan (NULL, NULL); - Yaklaşık 88,72MB


/ **********************************
             SENARYO 2
********************************** /
- DB'yi havaya uçurun ve baştan başlayın
KULLANIM [master];
GİT

DATABASEPROPERTYEX (N'SampleDB ', N'Version')> 0
BAŞLA
    ALTER DATABASE [SampleDB] SET SINGLE_USER
        GERİ BİLDİRİM İLE;
    DAMLA VERİTABANI [SampleDB];
SON;
GİT

BİRİNCİ VERİTABANI OLUŞTUR [SampleDB] 
( 
      NAME = N'SampleDB '
    , FILENAME = N'E: \ data \ SampleDB.mdf ' 
    , SIZE = 3MB 
    , FILEGROWTH = 1MB 
)
GİRİŞ YAP 
( 
      NAME = N'SampleDB_log '
    , FILENAME = N'E: \ data \ SampleDB_log.ldf '
    , SIZE = 1MB 
    , MAXSIZE = 100 MB 
    , FILEGROWTH = 4MB 
);
GİT

KULLANIM [SampleDB];
GİT

- Tablo ekle
CREATE TABLE Instagram Hesabındaki Resim ve Videoları dbo.test
(
    c1 CHAR (8000) BOŞ DEĞİL DEFAULT REPLICATE ('a', 8000)
) AÇIK [İLK];
GİT

- Olmadığımızdan emin olun, sahte basit bir kurtarma modeli
YEDEK VERİTABANI SampleDB
DİSK = 'NUL';
GİT

- Günlük dosyasını yedekleyin
YEDEKLEME GÜNLÜĞÜ SampleDB
DİSK = 'NUL';
GİT

- Şimdi işlemimizde günlük dosyasını havaya uçuralım
İŞLEM BAŞLANGIÇ
    Dbo.test VARSAYILAN DEĞERLERİNE EKLE;
    GO 10000

- Geri alma asla ateş etmez. Dene. Bir hata alırsınız.
Msg 3903, Seviye 16, Durum 1, Satır 1
- GERİ BESLEME İŞLEMİ isteğinin karşılık gelen BAŞLANGIÇ İŞLEMİ yok.
GERİ BİLDİRİM İŞLEMİ;

- Günlük dosyası% 100 dolu mu? 
DBCC SQLPERF (LOGSPACE);

- fn_dblog () ile kaç kayıt görünür?
SEÇ * 
FROM_dblog'dan (NULL, NULL); - Benim durumumda yaklaşık 91.926
GİT

- fn_dblog () tarafından gösterilen toplam günlük rezervi?
TOPLA SEÇ ([Kayıt Rezervi]) AS [Toplam Kayıt Rezervi]
FROM_dblog'dan (NULL, NULL); - 88.72MB
GİT

Ayrıntılı testler için teşekkür ederim. Daha fazla test yaptıktan sonra benzer bir sonuca vardım, bir blog yazısı yazdım . Benim için Senaryo 2'nin geri çekilmesi daha uzun sürüyor çünkü Senaryo 2'de gerçekleştirilen iş miktarı, Sql Server'ın geri alma ihtiyacının 1. Senaryodan daha fazla olduğunu fark etmeden önce
ToC
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.