SQL veritabanını yedekten geri yüklemek dizinlerini yeniden oluşturuyor mu?


10

SQL veritabanını yedekten geri yüklemek, tablolarını ve dizinlerini sıfırdan yeniden oluşturur mu? Yoksa yedekleme sırasında olduğu gibi aynı fiziksel fiziksel sırada mı tutuyor?

Fark yaratıyorsa, SQL 2000'i Quest Lightspeed sıkıştırılmış yedeklemesiyle kullanıyoruz.

Yanıtlar:


16

Cevap hayır, çünkü hangi yedekleme yazılımı kullanılıyorsa.

Yedekleme, mantıksal bir işlem değil, fiziksel bir işlemdir. Ayrılmış sayfalar içeren tüm uzantıları okur (yani 8 sayfalık bir sayfadan yalnızca bir sayfa ayrılmış olsa da, 64K derecenin tamamını yedekler) ve bunu fiziksel sırayla yapar.

Geri yükleme, mantıksal bir işlem değil, fiziksel bir işlemdir. Veri dosyalarındaki uzantıları doğru yerlerine koyar.

Bir dizini (veya buna benzer bir şeyi) yeniden oluşturmak, günlüğe kaydedilmesi gereken mantıksal bir işlemdir. Yedekleme ve geri yükleme, arabellek havuzundan geçmeden veri dosyalarını doğrudan değiştirir, bu da bunun yapılamamasının bir nedenidir. Bunun yapılamamasının bir başka nedeni, yedekleme ve geri yüklemenin yedeklenen verilerde ne olduğunu anlamadığıdır.

Bununla birlikte, bunun yapılamamasının temel nedeni, bir geri yükleme işlemi sırasında sayfaların hareket ettirilmesinin b-ağacı işaretçileri kırmasıdır. A sayfası B sayfasını gösterir, ancak A sayfası geri yükleme işlemi tarafından taşınırsa, B sayfası A sayfasını işaret edecek şekilde nasıl güncellenir? Hemen güncellenirse, geri yükleme işleminin geri kalanı tarafından üzerine yazılabilir. Ertelenmiş olarak güncellenirse, geri yükleme işlemi A sayfasını veya B sayfasını kaldıran bir işlem günlüğünü geri yüklerse ne olur? Sadece yapılamaz.

Alt satır - yedekleme ve geri yükleme, verileri asla değiştirmeyen fiziksel işlemlerdir.

Bu yardımcı olur umarım!

PS Bu soruyu doğrudan ele almasa da, çeşitli yedeklemelerin dahili olarak nasıl çalıştığını açıklayan July TechNet Magazine için yazdığım makaleye göz atın: SQL Server Yedeklerini Anlama . Eylül dergisi, geri yüklemeleri anlama dizisinde bir sonrakine sahip olacak.


2
Endekslemenin mantıklı bir işlem olduğunu açıkladığınızı seviyorum.
Jim B

Ah, bu mantıklı. Yedekleme, 8k veri sayfasını değil, 64k fiziksel uzantıları kapar.
BradC

Bu saçmalık. Yedekleme işlemleri sık sık yedekledikleri verileri sıkıştırır ve bu da bahsettiğimiz bir tür "değişiklik "tir: Sonuçta, dizinler tablolardan yeniden oluşturulabilir, bunlar gereksiz verilerdir (şemanın yedeklenmesi şartıyla) , elbette). Asıl sebep, veritabanı geliştiricilerinin tembelliktir.
John

1
@John Saçmalık ne diyorsun? Sıkıştırma burada hiçbir yerde belirtilmez - sadece herhangi bir şekilde sıkıştırma ile aynı olmayan dizinleri yeniden oluşturmak (bir geri yükleme sırasında sayfaları veya veritabanındaki konumlarını değiştirmezken, yeniden oluşturma yapar). Geri yükleme sırasında dizinleri sıfırdan yeniden oluşturmak, onları yedeklemeden olduğu gibi geri yüklemeye kıyasla inanılmaz derecede yavaş olacaktır. Sanırım burada bir şeyi yanlış anlıyorsunuz.
Paul Randal

Dizinleri bırakmak ve yeniden oluşturmak bir sıkıştırma türüdür ve sıkıştırma, sıkıştırma türüne bağlı olarak her şeyi değiştirebilir. Görüntü işlemede kayıplı sıkıştırma hala sıkıştırma olarak adlandırılır. Daha küçük alanda verilen bilgileri temsil eden herhangi bir mekanizma bir sıkıştırma biçimidir ve dizinleri bırakmak bunun önemsiz bir örneğidir. Yavaş yeniden inşa süresi gerçekten de gerçek bir argüman olabilir, en azından uygulamaya karşı değerli bir çabaya karşı.
John

6

Bir yerli SQL yedek "hayır" var cevap yüzden yedek dosyaların sadece sayfa-sayfa dökümü vardır. Bir Quest ışık hızı yedeği büyük olasılıkla bir tür sıkıştırma sıkıştırma algoritması kullanır, ancak yine de büyük bir veritabanında çok büyük zaman alan veri dosyalarını veya dizinleri "yeniden" oluşturmaz.


Evet, ama yine de her sayfayı diske yazmak zorunda. Bunları neden parçalanmış bir sırayla değil, mantıksal sırada yazmıyorsunuz? (Belki de bu bir geri yükleme sorusu yerine daha çok bir yedekleme sorusudur : yedekleme sayfaları fiziksel sırayla mı yoksa mantıksal sırayla mı
yazıyor

Verileri dizin sırasına göre yazan bir ürün olduğunu varsayarsak, tablonun hangi sırayla kaydedilmesini istersiniz? Diyelim ki 3 sütunlu bir tablom var product_id, productname ve price. Sayfaları dizine eklenmiş sırayla kaydetmek için sıralanacak doğru sütun hangisidir? BTW, tablonun tamamını (kümelenmiş bir dizin) veya satırların her birini (bileşik dizin) dizine eklemenizi engelleyen hiçbir şey yoktur.
Jim B

@Jim B: Bu kolay. Tablolar kümelenmiş dizin sırasıyla kaydedilir. Kümelenmemiş dizinler anahtar sırayla depolanır. Yığınlar orijinal (sıralanmamış) sırayla korunur. (Aaron ve Paul, yedekleme / geri yükleme işleminin bunu yapmadığından geçerli nedenleri belirtmişlerdir. "Tercih edilen siparişi" anlayamamak, bu nedenlerden biri değildir. )
BradC

Veriler, veritabanı dosyalarına kaydedildiği ile aynı fiziksel sayfa sırasında yedeklenir. Veriler geri yüklendiğinde, yedeklendiği sayfa sırasına göre geri yüklenir. SQL, çeşitli nedenlerle verileri hareket ettirmez. Günlükleri geri yükleyen işlemler ve sayfa zincirleme sorunları ile ilgili sorunlar da dahil olmak üzere, çoklu TB veritabanlarında verileri karıştırmak için gereken ekstra zamandan bahsetmiyoruz.
mrdenny

2

Yedekleme düzenli ve çok sık yapılır (umarım). Böylece tasarımcılar yedeklemenin mümkün olduğunca hızlı olduğundan emin oldular. En hızlı G / Ç nedir? Ardışık. Disklerdeki blokları tam fiziksel sırada okursunuz, en iyi performansa sahip olursunuz.

Neden veritabanı her gece hantal rasgele G / Ç işlemi gerçekleştirmeli ve disklerin kafalarını her yere çöker? Fark, iki büyüklük sırası civarında olacaktır. Bunda muhtemel bir kazanç yok.


Genel noktanıza katılıyorum, ancak temeldeki depolama yapılandırmasına bağlı olarak, rastgele G / Ç, sıralı G / Ç'den (örneğin düzinelerce iğ üzerine yayılmış bir SAN sürücü) daha kötü büyüklük sıraları olmayabilir. Aslında, veri dosyası sabit sürücüde parçalanmışsa, "sıralı" G / Ç bile gerçekten sıralı değildir. Ancak Paul'un puanları yine de bunu geçersiz kılıyor (işaretçileri güncellemeyle ilgili sorun ve bu birleştirme günlüğe geçirilmiş bir işlem olmalı)
BradC

0

Hmmm. BradC, daha önce Firebird / Interbase ile çalıştınız mı - ana yedekleme / geri yükleme yardımcı programı / API, SSMS / EM'nin "Veritabanını Kopyala ..." ile daha çok benzer mi? Eğer öyleyse, MS SQL Server'ın böyle olmadığını bilin.

Bir SQLServer Yedeklemesi daha çok "AS-IS" olarak geri yüklenen bir veritabanı dökümüdür - bu nedenle "başka bir yerde ayır-kopyala-yeniden tak" işlemi için konforlu bir çevrimiçi kısayol gibidir. Geri yüklenen veritabanı orijinal veritabanı dosyasının neredeyse tam bir kopyasıdır (neredeyse geri yüklenen bir veritabanının veritabanı dosyalarının yerleşimini değiştirebildiğiniz için) ...

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.