SQL Server 2012 Yedeğini yeni DB Adına geri yükle


16

2008 yılında, geri yükleme sihirbazından "Hedef Veritabanı" alanındaki adı değiştirerek yeni bir DB kopyasına yedeklemeyi geri yükleyebileceğinizi hatırlıyorum. İstediğiniz zamana geri yüklenen orijinal DB'nin bir kopyası olan yepyeni bir DB oluşturur. SQL 2012 bunu yapmak için nasıl anladım benim yaşam için değil.

Şimdi anlıyorum (Aaron Bertrand sayesinde) bunun gerçekten değişmediğini ve 2012'nin aslında bu stratejinin ilk başta kötü bir fikir olduğunu daha açık hale getirdiğini anlıyorum!

Yani, ne yapmak gerekir: Yeni bir DB, 'MyDB_Copy', varolan bir DB 'MyDB', yedek dosyalarını kullanarak oluşturun. Her gece tam yedeklemeler (.bak) ve her 15 dakikada bir TLogs (.trn) var. Mevcut 'MyDB'nin etkilenmesini / dokunulmasını istemiyorum, çünkü bu "canlı".

MyDB_Copy ana tam yedekleme dosyasından oluşturulduktan sonra, belirli bir noktaya ulaşmak için birkaç düzine TLog yedeklemesini geri yüklemem gerekiyor.


Siz veya Aaron bunun neden kötü bir fikir olduğunu paylaşabilir misiniz? veya açıklandığı konuya bağlantı?
Thronk

Bunun mantıksal adların değişmemesi ile ilgili bir şey olduğuna inanıyorum ve bu nedenle aynı yerde farklı adlara ve fiziksel dosyalara sahip aynı özdeş mantıksal adlara sahip iki DB ile sonuçlanacaksınız. mantıksal isimlerde. Benim durumumda, geri yüklenen / kopyalanan DB'ler birkaç saatten fazla sürmedi, ama neden harika bir uygulama olmadığını anlayabiliyorum.
NateJ

Yanıtlar:


18

Belgelerdeki Örnek E'yi gevşek bir şekilde temel alarak yeni bir sorgu penceresi açın ve çalıştırın:

RESTORE DATABASE MyDB_Copy FROM DISK = 'C:\blahblah\MyDB.bak'
  WITH REPLACE, RECOVERY,
  MOVE 'MyDB' TO 'C:\blahblah\Data\MyDB_Copy.mdf',
---------------------------------------^^^^^
  MOVE 'MyDB_log' TO 'C:\blahblah\Data\MyDB_Copy.ldf';
-------------------------------------------^^^^^

Mantıksal isimler önemli değildir; fiziksel dosya adları. Bu, mantıksal dosya adlarınızla ve yalnızca iki tanesiyle ilgili varsayımlar yapar; EXEC MyDB..sp_helpfile;emin olmak için çalıştırın .

Eğer günlükleri geri yüklemeniz gerekiyorsa, o zaman değiştirmek RECOVERYiçin NORECOVERY:

  WITH REPLACE, NORECOVERY,
----------------^^

Sonra bir dizi düzenleyebilirsiniz:

RESTORE LOG MyDB_Copy FROM DISK = 'C:\blahblah\file1.trn' WITH NORECOVERY;

Ve sonuncusunda:

RESTORE LOG MyDB_Copy FROM DISK = 'C:\blahblah\fileN.trn' WITH RECOVERY;

Veya yalnızca bir noktaya kadar bir günlüğün bir kısmına ihtiyacınız varsa (LSN'lerin ve saatlerin nerede olduğunu kontrol ettiğinizi varsayalım, böylece tam olarak hangi dosyalara ihtiyacınız olduğunu biliyorsunuz):

RESTORE LOG MyDB_Copy FROM DISK = 'C:\blahblah\fileN.trn' WITH 
  STOPAT = '<some point in time Friday>', RECOVERY;

Yedek farklı bir sunucudan gelmedikçe, önceki sürümlerde çalıştığınız gibi çalışmazsınız. Varsayılan olarak, yeni mdf ve ldf dosyalarını aynı yere koymaya çalışır ve bu mümkün değildir.


Tamam, bu biraz yardımcı oldu. Şimdi DB Cuma gecesi olduğu duruma geri almak için birkaç düzine TRN dosyasını geri yüklemem gerekiyor (tam yedeklemeler sadece günlük olarak gerçekleşiyor; TLog yedekleri her 15 dakikada bir gerçekleşiyor). Örneğinizi kullanarak, ana BAK dosyasından oluşturulan DB aldım, ancak günlüğü geri yüklemek için benzer bir ifade çalışırken yeni bir hata alıyorum. "Hiçbir dosya aktarılmaya hazır olmadığından günlük veya diferansiyel yedeklemesi geri yüklenemez" diyor.
NateJ

@NateJ o zaman tam bir soru sormalısın. :-)
Aaron Bertrand

1
Harika, şimdi yazıyorum! Yardımın için çok teşekkürler. StackOverflow birkaç negatif temsilcisi var bummed ama bu çalışırsa buna değer olacaktır.
NateJ

1
@NateJ Soru taşındığında (veya sonunda olacak) silindiğinden bu temsilciyi geri almalısınız. Bu ben değildim ama sanırım bunun bir versiyonda işe yaradığına dair suçlamanızdan kaynaklanıyordu, ancak şimdi değil, bu sadece olanların yanlış anlaşılması olduğunda ...
Aaron Bertrand

Ah yakaladım. Eskiden işe yarayan bir şey - Tam olarak ne / nasıl olduğunu hatırlamıyor olabilirim, ancak yanlış anlaşıldığına katılıyorum. Meslektaşım yukarı ve aşağı yemin ediyor, ama şimdi düşündüğüme göre, mantıklı değil. GUI'yi kullanarak farklı bir şey yapmış olmalıyız. Bildiğiniz gibi komutları / komut dosyalarını kullanmak bizim için daha iyi olacak gibi hissediyorum. :) Günlükler şimdiye kadar başarıyla geri yükleniyor!
NateJ

0

Aynı veritabanını birden çok kez geri yüklemek için tek yapmanız gereken, o veritabanı için disk dosyalarının adını değiştirmek. Açıkçası, veritabanını SQL Server'daki diğer veritabanlarına da farklı bir ad vermeniz gerekir. SSMS'de geri yükleme için .bak dosyasını seçip veritabanı adını yazdıktan sonra, soldaki "Sayfa seç" bölümünde 'Dosyalar'ı tıklatıp disk dosyalarının adını değiştirmeniz yeterlidir.

Şerefe Doug

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.