Yedek iç - SQL Server'da kilitleme ve performans yükü açısından bir yedekleme işi çalışırken ne olur?


13

MySQL için ben veritabanı SQL Tablolar tablo tablo yedekleme olduğunu biliyorum, bu kilitleme ile sonuçlanır ve yedekleme sırasında sütunları güncellerseniz bütünlük sorunları ile sonuçlanabilir.

Anladığım kadarıyla bu Microsoft SQL Server için geçerli değildir, ancak SQL Server bunu nasıl işler? Db'yi tutarlı tutmak için dahili dondurma var mı?

Ayrıca, yedeklemenin tek iş parçacıklı olduğunu duydum, tek bir dosyaya yedeklediğinizi varsayarak sadece bir çekirdek kullanıyor. Ayrıca, çok çekirdekli bir makineniz olduğunu varsayarız, örneğin 16 çekirdek veya en azından birden fazla sayıda.

Kişisel deneyimlerime göre, yedek alırken hiçbir zaman sorun yaşamadım, ne kilitleme ne de genel gider sorunları, ancak deneyimim sınırlı. Bu yüzden her zaman sunucu özelliklerinde yedek sıkıştırmayı açmanızı öneririm.

Bir yedekleme işi çalışırken ne olur? Ayrıca farklı sürümler için önemli farklılıklar var mı? örneğin 2008, 2012 ve 2014 (lisanslar değil).


4
Bu Paul Randall makalesi, backuplar hakkında
James Anderson

Yanıtlar:


9

Tüm puanlarınız yedek efsanelerle kaplıdır - Paul Randal

30-01) yedekleme işlemleri engellemeye neden oluyor

Hayır. Yedekleme işlemleri kullanıcı nesnelerini kilitlemez . Yedeklemeler, G / Ç alt sisteminde gerçekten ağır bir okuma yüküne neden olur, bu nedenle iş yükü engellenmiş gibi görünebilir , ancak gerçekte değildir. Sadece yavaşlıyor. Toplu olarak kaydedilen uzantıları almak zorunda olan bir yedeklemenin, bir denetim noktası işlemini engelleyebilecek bir dosya kilidi alacağı özel bir durum vardır - ancak DML hiçbir zaman engellenmez.

Ayrıca, yedeklemenin tek iş parçacıklı olduğunu duydum, tek bir dosyaya yedeklediğinizi varsayarak sadece bir çekirdek kullanıyor.

Tek bir dosyaya veya cihaza yapılan bir yedeklemede 1 yazarlık iş parçacığı kullanılır. Birden çok dosya / cihaza yedekliyorsanız (birden fazla .bak dosyası olsun) her dosya / cihaz için bir yazıcı iş parçacığı olacaktır.

Yedekleme performansını artırmanın en kolay yolu, yedekleme şeridi olarak bilinen yedekleme işleminin paralel olmasına izin vermektir. Varsayılan olarak, okunan her sürücü harfi veya bağlama noktası için tek bir veri okuyucu iş parçacığı ve yazılan her yedekleme aygıtı için tek bir veri yazıcı iş parçacığı vardır.

Kontrol

  1. SQL Server 2008 Microsoft Sertifikalı Ana (MCM) Hazırlık videoları özellikle Yedek Dahili.
  2. Yedek Dahili Bir Bakış ve Yedekleme ve Geri Yükleme Verimi Nasıl İzlenir (Bölüm 1) - By: Jonathan Kehayias
  3. Yedek Dahili Bir Bakış ve Yedekleme ve Geri Yükleme Verimi Nasıl İzlenir (Bölüm 2) - By: Jonathan Kehayias

7

Paul'un yedek iç kısımlarla ilgili makalesi mükemmeldir ve okumalısınız. Başkalarının söylediklerine ekleme ve sorunuzun belirli bir bölümünü vurgulama

Ayrıca, yedeklemenin tek iş parçacıklı olduğunu duydum, tek bir dosyaya yedeklediğinizi varsayarak sadece bir çekirdek kullanıyor. Ayrıca, çok çekirdekli bir makineniz olduğunu varsayarız, örneğin 16 çekirdek veya en azından birden fazla sayıda.

Yedekleme işlemi can use parallelismancak bu hatırlıyorum değil , SQL Server Doktoru tarafından tahrik paralellik onun yedek veri dosyasını okumak zorunda ve yedekleme oluşturulan yedekleme dosyaları veri dosyası ve miktarını yazar nerede yerden dahil olan disk sayısını tarafından tahrik.

MAXDOPSQL Server yedeklemesi alırken ipucu kullanamazsınız

Basit TSQL yedekleme işlemi için SSMS'de yürütme planı oluşturamazsınız.

SQL Server'da sorgu iyileştirici tarafından yönlendirilen paralellik temel olarak ilgili operatörler içindir (aslında daha karmaşıktır ancak basitlik açısından bunu alabilirsiniz) çünkü yedekleme işlemi, optimizer tarafından çalıştırılan paralelliği kullanamayacağı için herhangi bir operatör içermez.

Technet Wiki'de SQL Server yedekleme sırasında paralelliğin açıklanması için basit örnekler kullandığım Yedekleme ve paralellik hakkında bir makale yazdım . Sonuç aşağıdadır

  1. Veritabanı dosyaları birden çok diskte ise, verileri okumak için aygıt sürücüsü başına iş parçacığında yedekleme işlemi başlatılır. Aynı şekilde, birden fazla sürücü / bağlama noktasında geri yükleme yapılırsa, yedekleme işlemi her sürücü / bağlama noktası için bir iş parçacığı başlatır

  2. Aynı sürücüye birden çok yedek kopyasını dökseniz bile, dökülen yedek dosya başına bir iş parçacığımız olur.

  3. Yedeklemeyle ilişkili paralellik, çizgilerle ilgilidir. Her şerit kendi işçi iş parçacığını alır ve yedekleme / geri yüklemenin paralel işlemler olarak düşünmesi gereken tek şey budur.

  4. Maksimum paralellik derecesinin yedekleme işlemi üzerinde hiçbir etkisi yoktur.

Bu konuda Paul ve Bob Dorr'dan uzman görüşü aldım.

Bir yedekleme işi çalışırken ne olur? Ayrıca farklı sürümler için önemli farklılıklar var mı? örneğin 2008, 2012 ve 2014 (lisanslar değil).

Bob Dorr'un bu blog.msdn makalesini okumanızı öneririm . Vurguladığı bazı önemli noktalar

  1. Bir yedekleme başladığında, arabellek havuzunun dışındaki bellekten ayrılan bir dizi arabellek oluşturur. Hedef, her tampon için genellikle 4 MB'dir, bu da yaklaşık 4 ila 8 tamponla sonuçlanır. Hesaplamayla ilgili ayrıntılar şu adreste bulunur: http://support.microsoft.com/kb/904804/en-us

  2. Tamponlar, serbest ve veri kuyrukları arasında geçiş yapar. Okuyucu ücretsiz bir arabellek çeker, veriyle doldurur ve veri kuyruğuna yerleştirir. Yazar (lar) doldurulmuş veri tamponlarını veri kuyruğundan alır, arabelleği işler ve ücretsiz listeye döndürür.

  3. Her yedekleme cihazı başına bir yazıcı alırsınız, her biri veri kuyruğundan alınır. Bu yüzden dört (4) diske spesifikasyona sahip bir yedekleme komutunda dört yazar ve bir okuyucu bulunur. Okuyucu yazarlara ayak uydurabilmesi için zaman uyumsuz G / Ç kullanır.

Etkinleştirebilirsiniz trace flags 3213 and 3605, her ikisi de belgesizdir, bu yüzden lütfen test ortamında kullanın ve SQL Server hata günlüğüne hangi ilginç iletinin atıldığını görün. Aşağıdaki gibi bir şey görünecektir

Memory limit: 249MB
BufferCount:                7
Sets Of Buffers:            1
MaxTransferSize:            1024 KB
Min MaxTransferSize:        64 KB
Total buffer space:         7 MB
Tabular data device count:  1
Fulltext data device count: 0
Filestream device count:    0
TXF device count:           0
Filesystem i/o alignment:   512
Media Buffer count:            7
Media Buffer size:          1024KB

Çeşitli sürümler için yedekleme kodunda herhangi bir önemli değişikliklerin farkında değilim, bu tür şeyler belgelenmiyor. Ben sadece SQL Server 2012 SP1 Cumulative Update 2,TSQL veya SMO kullanarak SQL Server'dan Windows Azure Blob depolama hizmetinden yedekleme ve geri yükleme etkinleştirmek tanıtılan geliştirme hakkında biliyorum . Burada okuyun


4

Temel olarak, SQL Server diskteki tüm sayfaların kirli bir kopyasını yapar. Bu sayfalar, eşzamanlı etkinlik varsa veya önceden kontrol edilmemiş etkinlik olmadığında büyük olasılıkla tutarsızdır.

Daha sonra SQL Server, güncel olmayan sayfaları en son sürüme getirmek ve geri yükleme sırasında her şeyi tutarlı hale getirmek için gerekli olan işlem günlüğünün gerekli bölümünü de kopyalar.

Yedekleme işleminin çok iş parçacıklılığıyla konuşamıyorum. Paralel olmasını bekliyorum. 10 GB / sn'lik bir IO alt sisteminde başka bir 10 TB veritabanını nasıl yedekleyebilirsiniz?


Cevap için teşekkür ederim, ancak bazı şeyler net değil. Kurtarma modelini, yedekleme işi sırasında kesme gibi basit veya çalıştırma ifadelerine ayarladıysam ne olur? Bu SQL sunucusunun bunu tutarlı bir duruma getiremeyeceği anlamına gelmiyor mu?
RayofCommand

Yedekleme sırasında etkili günlük modeli dolu. SQL Server, BASİT isteseniz bile, her şeyi ileriye taşıyabilmelidir. Tabloları kesmek, kaydedilmiş ve işlem görmüş bir işlemdir, orada sorun yoktur. DDL işlemseldir.
usr
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.