Çevrimiçi sayfa geri yükleme 1000 sınırına ulaştı


13

(O zamandan beri giderildi I / O hatası nedeniyle) yolsuzluktan zarar görmüş bir veritabanını kurtarmak için görevlendirildi. Ben veritabanı veya ne içeriğine aşina değilim.

Eski bir (~ 3 hafta) tam yedekleme ve bir dizi işlem günlüğü verildi ... ancak eksik işlem günlükleri var, bu yüzden sadece belirli bir tarihe kadar kurtarabilirim. 2,5 haftalık veri kaybı var (ve bu veritabanına sürekli olarak çok fazla veri ekleniyor).

Ayrıca bozuk veritabanı (erişilebilir, ancak bir sürü sayfa bozuk / eksik ile) verildi.

Tipik DBCC CHECKDBkomutları denedim ( repair_allow_data_lossbaşka bir şey işe yaramazsa yine de son çare olacağım).

Birçok gelir ve veritabanına gider sonra (db 1.5 terabayt küçük bir canavar ve yaptığım her şey yavaş ve biraz zaman alır), bozuk sayfalar için bilinen son iyi yedek bir çevrimiçi sayfa geri yükleme yapmaya çalıştım.

Bunu yapmak için, çıktıdan birçok RESTORE DATABASE <foo> PAGE='pages' FROM DISK='<bar.bak>'komut oluşturan bir senaryo yaptım DBCC CHECKDB(normalde regex ve farklı) ... şimdiye kadar iyi, bu 1000 sayfa sınırına ulaştığım bir noktaya kadar çalıştı geri yükleme komutu başına dosya başına (bu db'de 8 dosya vardır).

Bu yüzden "çevrimiçi geri yüklemeyi tamamlamamı" istiyor, ancak bunu nasıl yapacağım konusunda bir kaybım var ... Bir kuyruk günlüğüm veya başladığım tam yedeklemeden daha eksiksiz bir şeyim yok, bu yüzden Temelde sayfaların geri kalanında denemeye devam etmek için geri yüklemeyi nasıl tamamlayacağımı bilmiyorum.

Bir denedim RESTORE DATABASE <foo> WITH RECOVERYama bu da işe yaramadı, bana sahip olmayan bir günlük istiyor.

Buradan nasıl bir şey kurtarmaya çalışabileceğime dair herhangi bir ipucu var mı? Ya da daha fazla sayfayı kurtarmaya çalışabilmek için çevrimiçi geri yüklemeyi nasıl "tamamlayabilirim"? Çevrimdışı geri yüklemeyi denersem aynı sorunu yaşar mıyım (temelde WITH NORECOVERYher şeye ekler ve sonunda geri getirmeyi dener miyim?)

Veritabanını elle çalışmak temel olarak geri alınamaz ... milyonlarca satır içeren yüzlerce tablo var ve bunların ne olduğunun açık bir anlamı yok. Bozuk DB SELECTbirkaç milyon satır sonra sorgularda başarısız olacak ama nerede çalışabilir emin değilim. Tüm kümelenmemiş dizinleri yeniden oluşturmayı denedim, ancak satır verileri ile bozuk sayfalar var, bu yüzden de işe yaramadı.

Bazı veri kaybı kabul edilebilir, ancak DB'de tutarlılık en azından sağlanmaya çalışılmalıdır.

Bozuk veritabanı -still- çevrimiçi ve istemciler üzerinde çalışıyor (bu yüzden yeni veri almaya devam ediyor), bu yüzden laboratuvar tezgahında yaptığım herhangi bir işlem daha sonra üretim veritabanında yeniden üretilebilir olmalıdır (kesinti bunun için zor olacak).

Bu SQL Server 2014 Enterprise

PS: Ben DBA değilim ... Ben bir programcıyım, ancak müşteri bazı "uzman" sql felaket kurtarma hizmetleri denedi ve pes ettiler, bu yüzden ona bakmak ve ben yapabilir miyim görmek istendi birşeyler yap.


Güncelleme : birçok testten sonra sayfa sayfa geri yükleme işleminin sorunsuz olduğunu düşündük, bu yüzden bu fikirden vazgeçtik. Bunun için bazı otomatik araçlar yaparak (yine yüzlerce ve yüzlerce tablo var) manuel bir kurtarma (bozuk tablolardan eksik kayıtları elle seçme ve bilinen son iyi yedeklemeye ekleme) için gidiyoruz.

Yanıtlar:


16

Standart prosedür:

  1. Geri yüklenmesi gereken sayfa kimliklerini edinin.
  2. Tam veritabanıyla sayfa geri yüklemesi başlatın.
  3. En son diferansiyel yedeklemeyi uygulayın.
  4. Sonraki günlük yedeklerini uygulayın.
  5. Yeni günlük yedeklemesi oluşturun.
  6. Yeni lob yedeklemesini geri yükleyin.

Yeni günlük yedeklemesi uygulandıktan sonra sayfa geri yükleme işlemi tamamlanır ve sayfalar kullanılabilir hale gelir.

Örnek Geri Yükleme

RESTORE DATABASE <database> PAGE='1:57, 1:202, 1:916, 1:1016'  
   FROM <file_backup_of_file_B>   
   WITH NORECOVERY;  
RESTORE LOG <database> FROM <log_backup>   
   WITH NORECOVERY;  
RESTORE LOG <database> FROM <log_backup>   
   WITH NORECOVERY;   
BACKUP LOG <database> TO <new_log_backup>;   
RESTORE LOG <database> FROM <new_log_backup> WITH RECOVERY;  
GO  

Başvuru: Sayfaları Geri Yükle (SQL Server) (Microsoft Belgeleri) Başvuru: Bildirimleri GERİ YÜKLE (Transact-SQL) (Microsoft Belgeleri)

Ancak, TLOG yedeklemelerinizde delikler vardır ve yukarıdaki yordamla geri yükleme, veritabanınızı istemediğiniz bir duruma geri getirebilir.


Karmaşık bir durumdasınız.

  1. Veritabanınızda bozuk sayfalar var ve şirketiniz sürekli olarak sorunlu bir veritabanına yeni veriler ekliyor. Bu, veritabanının tamamen kapalı kalmasına neden olabilir. Do Eğer bu riske atmak ister?

  2. Birisi sorumlu tutulacak ve ne kadar çok düzeltmeye çalışırsanız, sonunda o kişi olabileceğinize karar vermek için daha fazla yönetim eğilimi gösterebilir. Do Eğer bu riske atmak ister?

  3. Çalışılmadığınız bir rolü üstlenerek kendinizi zor bir duruma sokuyorsunuz. Ne şirketinizin DBA'larının ne de dış danışmanınızın yapabileceği bir şey elde etmeye çalışıyorsunuz. Asil bir jest gibi görünse de, kendinizi riske atıyorsunuz. Asla yerine getiremeyeceğiniz bir şeyi "örtük olarak" vaat etmiş olabilirsiniz. Do Eğer bu riske atmak ister?

  4. Veritabanı ile çalışan biri bozuk verileri sorguladığında, muhtemelen bir hata iletisi alırlar. Günlük işler zaten etkileniyor. Kaçınılmaz olanla ne kadar uzun süre beklerseniz, o kadar fazla verimlilik etkilenir. Do Eğer bu riske atmak ister? (Bu soru yönetim ile de gündeme getirilebilir)

  5. Şirketinizin yedekleme prosedürü hatalı görünüyor (aksi halde TLOG yedekleri nasıl eksik olurdu?) Ve hala üretim veritabanınızı sorun yokmuş gibi çalıştırıyorsunuz. Do Eğer bu riske atmak ister?

Size verebileceğim en iyi öneri, üretimi durdurmak ve Microsoft'u aramak! Ya da en azından Microsoft'u arayın ve muhtemelen üretimi durdurun.

Yazılarım aşırı ihtiyatlı ve bakış açınızdan biraz dramatize görünse de, şahsen benzer bir durumda verilerin kaybolduğu DBA gibi bir deneyim ile bağlantı kurabilirim. Biz sadece yarım gün verilerini kaybetti, ama biz vardı çevreleyen sistemleriyle verilerin yeniden senkronize bir sürü .

Ne kadar beklerseniz iyileşme o kadar pahalı hale gelebilir.


Sayfa geri yükleme sınırlaması gelince, burada resmi belgelerden bir alıntı:

Maksimum sayfa sayısı bir geri yükleme dizisindeki herhangi bir tek dosya içine geri yüklenebilir 1000 . Ancak, bir dosyada az sayıda hasarlı sayfa varsa, sayfalar yerine tüm dosyayı geri yüklemeyi düşünün.

( Vurgu benim)

Başvuru: RESTORE Deyimleri - Bağımsız Değişkenler (Transact-SQL) (Microsoft Belgeleri)


Her şey normale döndüğünde, DBA'lar ve / veya harici danışmanlar veritabanınız için farklı bir yedekleme / geri yükleme politikası / prosedürü uygulamayı düşünebilirler. 7x24 olması gerektiği için, herhangi bir durum için yeterli geri yükleme kapasitesi sağlamayan bir yedekleme prosedürüne sahip olma riskiyle karşılaşamazsınız.


2
Endişelerinizin çoğunu zaten gündeme getirdim ve hallettim (bir şey ters giderse, üretim durdurulmalıdır, vb.) Kesinlikle sorumlu değilim. Bu konuda kendimi çok netleştirdim, ancak orada hiçbir kontrolüm veya kararım yok. Aşırı tedbirli veya dramatize olduğunu düşünmüyorum ... Bence temelde yanlış yapıyorlar ve sadece burada yardım etmeye çalışıyorum, ama kendinden ödün vermeden. 1000 sayfa sınırını anlıyorum, ancak bunun tek bir geri yükleme komutu olacağını umuyordum (çevrimiçi yaptığımdan beri, bir sırada olmadığımı umuyordum ... Dokümanları temizleyemedim) .
Jcl

1

Görüyorum ki veri kurtarma "uzmanları" ile çalışmak dahil olmak üzere farklı yöntemler denedim bu bozuk veritabanı özellikle 1 TB büyüklüğünde. Bu, süreci çok daha zorlaştırır ve zamana karşı bir yarış yapar. Deneyimli bir DBA olarak, çoğu zaman geri yüklenebilecek iyi yedeklemelerin olduğu benzer durumlarla karşılaştım. Kötü yedekleri ve bozuk veritabanını devralma durumunda, Stellar Phoenix SQL Veritabanı Onarımı aracı adlı üçüncü taraf bir araca büyük ölçüde güveniyorum . Bu araç, bozuk veritabanlarını (.mdf ve .ndf) onarmakla ünlüdür. Aracın birkaç işlevi aşağıdadır:

  • Bozuk SQL Veritabanı (.mdf ve .ndf) dosyalarını onarır
  • Tabloları, tetikleyicileri, dizinleri, anahtarları, kuralları ve saklı yordamları kurtarır
  • SQL Veritabanından silinen kayıtların kurtarılmasını gerçekleştirir

  • Daha Sonra Aşamada Kurtarma Gerçekleştirmek için Veritabanının Tarama Sonuçlarını Kaydeder

  • Onarılan dosyanın MSSQL, HTML, XLS ve CSV formatlarında kaydedilmesini sağlar
  • MS SQL Server 2016, 2014, 2012,2008 ve daha eski sürümleri destekler

Araç, .mdf ve .ndf dosyalarının çevrimdışı olmasını gerektirir, bu nedenle bozuk PROD veritabanının bir kopyasına sahip olmanız ve SQL Server hizmetlerini durdurmanız gerekmez.

En iyi bölüm, onarılmış veritabanının dışa aktarılamaması / kaydedilmemesi dışında, aracın tam işlevselliğini sağlamasıdır. Yine de kurtarılan tüm veritabanı nesnelerini ve onarım işleminin farklı aşamaları hakkında ayrıntılı bilgi sağlayan kapsamlı onarım günlük dosyasını görüntüleyebilirsiniz.

Indirmek ve yardımcı olup olmadığını görmek için çekinmeyin. Buradan indirin

Ayrıca, aracın bu sitede nasıl çalıştığı hakkında bir blog yazdım: samosql blogs

Teşekkürler ve HTH günün KAHRAMANI yapmak için!

PS. Bu fırtına bittiğinde, yönetime özellikle böyle bir veritabanı için yedekleme prosedürlerinin büyük bir revizyonu olması gerektiğini söylemeyi unutmayın. Bu senaryonun tekrarı kesinlikle kabul edilemez! :)

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.