Sql sunucusunda farklı bir veritabanına nasıl geri yüklenir?


224

Bir hafta önce Veritabanı1 bir yedek var . Yedekleme, zamanlayıcıda haftalık olarak yapılır ve bir .bakdosya alırım . Şimdi bazı verilerle uğraşmak istiyorum, bu yüzden farklı bir veritabanına geri yüklemem gerekiyor - Veritabanı2 .

Bu soruyu gördüm: SQL Server veritabanını farklı adla geri yükleyin ve önerilen adım orijinal db'yi yeniden adlandırmaktır, ancak üretim sunucusunda olduğum ve gerçekten yapamadığım için bu seçeneğin dışındayım.

Geri yüklemenin Database2veya en azından en azından, bu .bak dosyasının verilerine nasıl göz atabilirim?

Teşekkürler.

ps: yukarıdaki bağlantıdan ikinci cevap umut verici görünüyordu ama hatayla sonlandırılıyor:

Geri Yükle Filist listesi anormal olarak sona eriyor

Yanıtlar:


304

Yeni bir db oluşturabilir ve ardından Üzerine Yaz seçeneğini etkinleştirerek "Geri Yükleme Sihirbazı" nı kullanabilirsiniz;

İçeriği görüntüleme;

RESTORE FILELISTONLY FROM DISK='c:\your.bak'

sonuçlardan .mdf & .ldf dosyasının mantıksal adlarını not edin, ardından;

RESTORE DATABASE MyTempCopy FROM DISK='c:\your.bak'
WITH 
   MOVE 'LogicalNameForTheMDF' TO 'c:\MyTempCopy.mdf',
   MOVE 'LogicalNameForTheLDF' TO 'c:\MyTempCopy_log.ldf'

MyTempCopyİçeriği ile veritabanı oluşturmak your.bak.

Örnek ('creditline' adlı bir db'nin yedeğini 'MyTempCopy' 'ye geri yükler;

RESTORE FILELISTONLY FROM DISK='e:\mssql\backup\creditline.bak'

>LogicalName
>--------------
>CreditLine
>CreditLine_log

RESTORE DATABASE MyTempCopy FROM DISK='e:\mssql\backup\creditline.bak'
WITH 
   MOVE 'CreditLine' TO 'e:\mssql\MyTempCopy.mdf',
   MOVE 'CreditLine_log' TO 'e:\mssql\MyTempCopy_log.ldf'

>RESTORE DATABASE successfully processed 186 pages in 0.010 seconds (144.970 MB/sec).

5
Merhaba, bir şey eksik gibi görünüyor, hatayı atmaya devam ediyor backkup set holds a backup of a database other than existing "tmp" database, ki anlıyorum. toİfade gerçek fiziksel yol olmalı mı MyTempCopy?
LocustHorde

Garip, toyeni veritabanı için db & log konumudur, yukarıdaki güncelleme örneği
Alex K.

52
Bunu deneyen başka biri için MyTempCopy oluşturmayın, geri yükleme sırasında oluşturulur.
Blazes

3
sadece benim durumumda (SQL2012) cr DEĞİŞTİR, KURTARMA, seçenekleri ile çalıştı. dba.stackexchange.com/questions/51489/…
dc2009

7
Bunu çözmek için REPLACE, RECOVERY kullanmalısınız. Bu şöyle olur: RESTORE DATABASE MyTempCopy FROM DISK='e:\mssql\backup\creditline.bak' WITH REPLACE, RECOVERY, MOVE 'CreditLine' TO 'e:\mssql\MyTempCopy.mdf', MOVE 'CreditLine_log' TO 'e:\mssql\MyTempCopy_log.ldf'
Raihan

67

SQL Server 2008 R2:

"Geri yüklemek: farklı bir veritabanının yedeklemesinden" varolan bir veritabanı için şu adımları izleyin:

  1. Araç çubuğundan, Etkinlik Monitörü düğmesini tıklayın.
  2. Tıklama işlemleri. Geri yüklemek istediğiniz veritabanına göre filtreleyin. Her bir işleme sağ tıklayarak ve "kill process" i seçerek çalışan tüm işlemleri öldürün.
  3. Geri yüklemek istediğiniz veritabanına sağ tıklayın ve Görevler -> Geri Yükle -> Veritabanından seçeneğini belirleyin.
  4. "Cihazdan:" radyo düğmesini seçin.
  5. ... seçeneğini belirleyin ve geri yüklemek istediğiniz diğer veritabanının yedek dosyasını seçin.
  6. Yedekleme kümesinin solundaki onay kutusunu seçerek geri yüklemek istediğiniz yedekleme kümesini seçin.
  7. "Seçenekler" i seçin.
  8. Mevcut veritabanının üzerine yaz'ı seçin (DEĞİŞTİR)
  9. Önemli: "Farklı Geri Yükle" Satır Verileri dosya adını, üzerine yazmak istediğiniz varolan veritabanının dosya adıyla değiştirin veya yeni bir ad verin.
  10. Günlük dosyası dosya adıyla da aynısını yapın.
  11. Etkinlik Monitörü Ekranından, yeni işlemlerin ortaya çıkmadığını doğrulayın. Eğer öyleyse, onları öldür.
  12. Tamam'ı tıklayın.

12
MS SQL Server 2010?
Mark

3
Burada bazı ekran görüntüleri var stackoverflow.com/questions/3829271/…
Tomas Kubes

Programcı olmasına rağmen bu sihirbazı kullanmayı tercih ederim. Daha kolay ve daha temiz.
v1n1akabozo

1
Anahtar adım benim için # 8 idi. Teşekkürler Daniel.
jbooker

Sql 2014 .. Adım 6a: Hedef veritabanını geri yüklemek istediğiniz veritabanına değiştirin. Adım 9 & 10: Hedef veritabanını değiştirerek bununla ilgilenmelisiniz. Ancak Dosyalar'a gidip orijinal adım 9 ve 10'da açıklandığı gibi dosya adlarını kontrol ederek bunu iki kez kontrol edin
JzInqXc9Dg

49

SQL Server 2012 için, Sql Server Management Studio'yu kullanarak, Microsoft sayfasındaki bu adımları farklı bir veritabanı dosyasına ve adına geri yüklemek için yararlı buldum: (ref: http://technet.microsoft.com/en-us/library/ms175510 .aspx )

Not adımlar 4 ve 7 varolan veritabanını üzerine yazmak böylece ayarlanmamış için önemlidir.


Bir veritabanını yeni bir konuma geri yüklemek ve isteğe bağlı olarak veritabanını yeniden adlandırmak için

  1. SQL Server Veritabanı Altyapısı'nın uygun örneğine bağlanın ve sonra Nesne Gezgini'nde, sunucu ağacını genişletmek için sunucu adını tıklatın.
  2. Veritabanları'nı sağ tıklatın ve sonra Veritabanını Geri Yükle'yi tıklatın . Restore Veritabanı iletişim kutusu açılır.
  3. On Genel sayfasında, kullanmak Kaynak geri yüklemek için yedekleme setleri kaynağı ve konumunu belirlemek için bölüm. Aşağıdaki seçeneklerden birini belirleyin:

    • Veri tabanı

      • Açılır listeden geri yüklenecek veritabanını seçin. Liste yalnızca msdb yedekleme geçmişine göre yedeklenmiş veritabanlarını içerir .

        Not Yedekleme farklı bir sunucudan alınırsa, hedef sunucu belirtilen veritabanı için yedekleme geçmişi bilgisine sahip olmaz. Bu durumda, geri yüklenecek dosyayı veya cihazı manuel olarak belirlemek için Cihaz'ı seçin.

    • cihaz

      • Yedekleme aygıtlarını seç iletişim kutusunu açmak için gözat (...) düğmesine tıklayın . In Yedekleme ortam türü kutusunda, listelenen aygıt türlerinden birini seçin. İçin bir ya da daha fazla cihazı seçmek için Yedekleme ortamı kutusu, tıklayın ekleyin . İstediğiniz aygıtları Yedekleme ortamı liste kutusuna ekledikten sonra , Genel sayfasına dönmek için Tamam'ı tıklatın . In Cihaz:: Kaynak Veritabanı liste kutusundan, restore edilmelidir veritabanının adını seçin.

        Not Bu liste yalnızca Cihaz seçildiğinde kullanılabilir. Yalnızca seçilen cihazda yedekleri olan veritabanları kullanılabilir.

  4. Gelen Hedef bölümünde, Veritabanı kutusu otomatik veritabanının adı restore edilecek doldurulur. Veritabanının adını değiştirmek için Veritabanı kutusuna yeni adı girin .
  5. In için Restore kutusu gibi varsayılan bırakın çekilen son yedekleme için veya tıklayın Timeline erişimine Yedekleme Timeline elle kurtarma eylemi durdurmak için zamanında bir nokta seçmek için iletişim kutusunu.
  6. Geri yüklenecek yedekleme kümeleri kılavuzunda geri yüklenecek yedekleri seçin. Bu ızgara, belirtilen konum için kullanılabilir yedeklemeleri görüntüler. Varsayılan olarak bir kurtarma planı önerilir. Önerilen kurtarma planını geçersiz kılmak için ızgaradaki seçimleri değiştirebilirsiniz. Önceki bir yedeklemenin geri yüklenmesine dayanan yedeklemeler, önceki yedeklemenin seçimi kaldırıldığında otomatik olarak kaldırılır.
  7. Veritabanı dosyalarının yeni konumunu belirtmek için Dosyalar sayfasını seçin ve ardından Tüm dosyaları klasöre yeniden yerleştir'i tıklatın . Veri dosyası klasörü ve Günlük dosyası klasörü için yeni bir konum sağlayın . Alternatif olarak aynı klasörleri koruyabilir ve veritabanını ve günlük dosyası adlarını yeniden adlandırabilirsiniz.

3
Bu bir cazibe gibi çalışır; Adım 4 ve 7 için özel teşekkürler
Anatoly Yakimchuk

Ayrıca, 'Seçenekler' sekmesine gidip 'Mevcut veritabanının üzerine yaz (REPLACE İLE)' seçeneğini işaretlemem gerekiyordu ... Sonra çalıştı.
John Kurtz

1
@JohnKurtz, yeni bir veritabanına geri yüklüyorsanız bunu yapmanız gerekmez.
Rots

Zaten geri yüklemek için boş bir veritabanı oluşturmuştum. Fark bu olmalı.
John Kurtz

1
4. Adımda var olmayan bir veritabanının adını girerseniz açıklandığı gibi çalıştığını doğruladı. Zaten var olan farklı bir veritabanı seçerseniz, 'Var olan veritabanının üzerine yaz (DEĞİŞTİR)' seçeneğini işaretlemeniz gerektiğini doğruladı. Seçenekler 'Sekmesi. Sabrınız için teşekkürler!
John Kurtz

34

Aslında, "bazı verilerle uğraşmak istiyorum" ve "bu .bak dosyasının verilerine göz atmak" için veritabanını yerel SQL Server terimleriyle geri yüklemeye gerek yoktur.

Hem yerel hem de yerel olarak sıkıştırılmış SQL veritabanı yedeklemelerini ve işlem günlüğü yedeklemelerini SQL Server Management Studio, Visual Studio veya başka bir üçüncü taraf aracıyla erişilebilen canlı veritabanları olarak ekleyen bir SQL Server aracı olan ApexSQL Restore'u kullanabilirsiniz . Tek veya çoklu tam, diferansiyel ve işlem günlüğü yedeklerinin eklenmesine izin verir

Ayrıca, araç tamamen işlevsel deneme modundayken (14 gün) işi yapabileceğinizi düşünüyorum.

Feragatname: ApexSQL'de Ürün Destek Mühendisi olarak çalışıyorum


9

İşte fiziksel konum ve mantıksal adı düzeltmek için ek sql düzeltmek için hareket ile yedekleme ve geri yükleme kullanarak bir veritabanı kopyalamak için çeşitli mesajlardan birlikte Arnavut kaldırımı.

/**
 * Creates (or resets) a Database to a copy of the template database using backup and restore.
 *
 * Usage: Update the @NewDatabase value to the database name to create or reset.
 */

DECLARE @NewDatabase SYSNAME = 'new_db';

-- Set up
USE tempdb;

DECLARE @TemplateBackups SYSNAME = 'TemplateBackups';
DECLARE @TemplateDatabase SYSNAME = 'template_db';
DECLARE @TemplateDatabaseLog SYSNAME = @TemplateDatabase + '_log';

-- Create a backup of the template database
BACKUP DATABASE @TemplateDatabase TO DISK = @TemplateBackups WITH CHECKSUM, COPY_ONLY, FORMAT, INIT, STATS = 100;

-- Get the backup file list as a table variable
DECLARE @BackupFiles TABLE(LogicalName nvarchar(128),PhysicalName nvarchar(260),Type char(1),FileGroupName nvarchar(128),Size numeric(20,0),MaxSize numeric(20,0),FileId tinyint,CreateLSN numeric(25,0),DropLSN numeric(25, 0),UniqueID uniqueidentifier,ReadOnlyLSN numeric(25,0),ReadWriteLSN numeric(25,0),BackupSizeInBytes bigint,SourceBlockSize int,FileGroupId int,LogGroupGUID uniqueidentifier,DifferentialBaseLSN numeric(25,0),DifferentialBaseGUID uniqueidentifier,IsReadOnly bit,IsPresent bit,TDEThumbprint varbinary(32));
INSERT @BackupFiles EXEC('RESTORE FILELISTONLY FROM DISK = ''' + @TemplateBackups + '''');

-- Create  the backup file list as a table variable
DECLARE @NewDatabaseData VARCHAR(MAX);
DECLARE @NewDatabaseLog VARCHAR(MAX);

SELECT @NewDatabaseData = PhysicalName FROM @BackupFiles WHERE Type = 'D';
SELECT @NewDatabaseLog = PhysicalName FROM @BackupFiles WHERE Type = 'L';

SET @NewDatabaseData = REPLACE(@NewDatabaseData, @TemplateDatabase, @NewDatabase);
SET @NewDatabaseLog = REPLACE(@NewDatabaseLog, @TemplateDatabase, @NewDatabase);

RESTORE DATABASE @NewDatabase FROM DISK = @TemplateBackups WITH CHECKSUM, RECOVERY, REPLACE, STATS = 100,
   MOVE @TemplateDatabase TO @NewDatabaseData,
   MOVE @TemplateDatabaseLog TO @NewDatabaseLog;

-- Change Logical File Name
DECLARE @SQL_SCRIPT VARCHAR(MAX)='
    ALTER DATABASE [{NewDatabase}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
    ALTER DATABASE [{NewDatabase}] MODIFY FILE (NAME=N''{TemplateDatabase}'', NEWNAME=N''{NewDatabase}'');
    ALTER DATABASE [{NewDatabase}] MODIFY FILE (NAME=N''{TemplateDatabase}_log'', NEWNAME=N''{NewDatabase}_log'');
    ALTER DATABASE [{NewDatabase}] SET MULTI_USER WITH ROLLBACK IMMEDIATE;
    SELECT name AS logical_name, physical_name FROM SYS.MASTER_FILES WHERE database_id = DB_ID(N''{NewDatabase}'');
';
SET @SQL_SCRIPT = REPLACE(@SQL_SCRIPT, '{TemplateDatabase}', @TemplateDatabase);
SET @SQL_SCRIPT = REPLACE(@SQL_SCRIPT, '{NewDatabase}', @NewDatabase);
EXECUTE (@SQL_SCRIPT);

Merhaba NateN, ben (benim yerel makine d: sürücü yolunda bulunan) benim .bak dosyayı başka bir DB için geri yüklemek istiyorum .i birim testi için bu kodu denedim ama hata veriyor .. "veritabanı çünkü özel erişim elde edilemedi db. geri yüklenemiyor .. lütfen bana nasıl yapılacağını söyleyebilir misiniz?
Victor Athoti.

Geri yüklediğiniz veritabanı başka bir işlem tarafından kullanılamaz. Nasıl bir veritabanına erişerek tüm işlemleri öldürme komut dosyası emin değilim.
Nathan Niesen

Merhaba NateN, Şimdi iyi çalışıyor, ben örnek kod parçasını kullanın ve sonra bu kodda küçük değişiklikler yaptım sonra iyi çalışıyor .... Bir kez daha örnek kod sağladığınız için teşekkür ederiz ...
Victor Athoti.

1
Sql2014 ve ötesi için, DECLARE @BackupFiles...hattın fazladan bir sütuna ihtiyacı vardır:SnapshotURL nvarchar(360)
fiat

3

Aslında aynı sunucuya geri yüklemekten biraz daha basittir. Temel olarak, "Veritabanını Geri Yükle" seçeneklerinden geçmeniz yeterlidir. İşte size bir eğitim:

http://www.techrepublic.com/blog/window-on-windows/how-do-i-restore-a-sql-server-database-to-a-new-server/454

Özellikle bu üretim dışı bir geri yükleme olduğundan, ayrıntılar hakkında çok fazla endişelenmeden denemekte rahatlayabilirsiniz. SQL dosyalarınızı yeni sunucunuzda istediğiniz yere koyun ve istediğiniz adı verin ve gitmekte fayda var.



Üzgünüm, soruyu yanlış okudum. Aynı temel ilkeler geçerlidir, sadece yeni ad ve dosya adlarının (mdf, ldf, vb.) Farklı olduğundan emin olmanız gerekir.
IAmTimCorey

3

Hiçbir veritabanı yoksa aşağıdaki kodu kullanın:

ALTER PROCEDURE [dbo].[RestoreBackupToNewDB]    
         @pathToBackup  varchar(500),--where to take backup from
         @pathToRestoreFolder  varchar(500), -- where to put the restored db files 
         @newDBName varchar(100)
    AS
    BEGIN

            SET NOCOUNT ON
            DECLARE @fileListTable TABLE (
            [LogicalName]           NVARCHAR(128),
            [PhysicalName]          NVARCHAR(260),
            [Type]                  CHAR(1),
            [FileGroupName]         NVARCHAR(128),
            [Size]                  NUMERIC(20,0),
            [MaxSize]               NUMERIC(20,0),
            [FileID]                BIGINT,
            [CreateLSN]             NUMERIC(25,0),
            [DropLSN]               NUMERIC(25,0),
            [UniqueID]              UNIQUEIDENTIFIER,
            [ReadOnlyLSN]           NUMERIC(25,0),
            [ReadWriteLSN]          NUMERIC(25,0),
            [BackupSizeInBytes]     BIGINT,
            [SourceBlockSize]       INT,
            [FileGroupID]           INT,
            [LogGroupGUID]          UNIQUEIDENTIFIER,
            [DifferentialBaseLSN]   NUMERIC(25,0),
            [DifferentialBaseGUID]  UNIQUEIDENTIFIER,
            [IsReadOnly]            BIT,
            [IsPresent]             BIT,
            [TDEThumbprint]         VARBINARY(32) -- remove this column if using SQL 2005
            )
            INSERT INTO @fileListTable EXEC('RESTORE FILELISTONLY FROM DISK ='''+ @pathToBackup+'''')
            DECLARE @restoreDatabaseFilePath NVARCHAR(500)
            DECLARE @restoreLogFilePath NVARCHAR(500)
            DECLARE @databaseLogicName NVARCHAR(500)
            DECLARE @logLogicName NVARCHAR(500)
            DECLARE @pathSalt uniqueidentifier = NEWID()

            SET @databaseLogicName = (SELECT LogicalName FROM @fileListTable WHERE [Type]='D') 
            SET @logLogicName = (SELECT LogicalName FROM @fileListTable WHERE [Type]='L')           
            SET @restoreDatabaseFilePath= @pathToRestoreFolder + @databaseLogicName + convert(nvarchar(50), @pathSalt) + '.mdf'
            SET @restoreLogFilePath= @pathToRestoreFolder + @logLogicName + convert(nvarchar(50), @pathSalt) + '.ldf'

            RESTORE DATABASE @newDBName FROM DISK=@pathToBackup     
            WITH 
               MOVE @databaseLogicName TO @restoreDatabaseFilePath,
               MOVE @logLogicName TO @restoreLogFilePath

            SET NOCOUNT OFF
    END

3
  • Eski bir veritabanı kullanarak yeni bir veritabanı geri yüklerken bu konuyla aynı hatayla karşılaşıyorum. (.bak kullanmak aynı hatayı verir)

  • Eski veritabanının adını yeni veritabanı adıyla değiştirdim (aynı resim). İşe yaradı.

resim açıklamasını buraya girin


2
Bir dahaki sefere lütfen bankanın adını silin
Danh

1

Benzersiz bir db adıyla ek bir db olarak yedeklemeyi nasıl geri yükleyeceğiniz aşağıda açıklanmıştır.

SQL 2005 için bu çok hızlı bir şekilde çalışır. Yeni sürümlerin de aynı şekilde çalışacağından eminim.

İlk olarak, orijinal db'nizi çevrimdışına almak zorunda değilsiniz. Ama güvenlik uğruna sevdim. Örneğimde, "faturalandırma" veritabanımın bir kopyasını yükleyeceğim ve buna "faturalandırma klonu" adı verilecek.

1) Faturalandırma veritabanının iyi bir yedeğini alın

2) Güvenlik için orijinali şu şekilde çevrimdışı aldım:

3) Yeni bir Sorgu penceresi açın

**ÖNEMLİ! Tamam olana kadar bu sorgu penceresini açık tutun! Bu pencereden db'yi geri yüklemeniz gerekiyor!

Şimdi aşağıdaki kodu girin:

-- 1) free up all USER databases
USE master;
GO
-- 2) kick all other users out:
ALTER DATABASE billing SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
-- 3) prevent sessions from re-establishing connection:
ALTER DATABASE billing SET OFFLINE;

3) Ardından, Management Studio'da, rt Nesne Gezgini'nde Veritabanları'nı tıklatın, "Veritabanını Geri Yükle" yi seçin

4) "Veritabanına" alanına yeni bir ad girin. IE faturalandırma klonu

5) Geri Yükleme Kaynağı'nda, "Cihazdan" seçeneğini tıklayın ve ... gezinme düğmesini tıklayın

6) Ekle'yi tıklayın ve yedeklemenize gidin

7) Geri Yükle'nin yanına bir onay işareti koyun (Geri yüklenecek yedekleme kümelerini seçin)

8) sonra üst sol köşedeki SEÇENEKLER sayfasını seçin

9) Şimdi veritabanı dosyası adlarını RESTORE AS'de düzenleyin. Bunu hem db hem de günlük için yapın. IE billingclone.mdf ve billingclone_log.ldf

10) şimdi Tamam'a basın ve görevin tamamlanmasını bekleyin.

11) Nesne Gezgini'nde yenile düğmesine bastığınızda yeni db'nizi göreceksiniz

12) Şimdi faturalandırma db'nizi tekrar çevrimiçi yapabilirsiniz. Faturalandırmayı çevrimdışına almak için kullandığınız sorgu penceresinin aynısını kullanın. Bu komutu kullanın:

-- 1) free up all USER databases
USE master; GO
-- 2) restore access to all users:
ALTER DATABASE billing SET MULTI_USER WITH ROLLBACK IMMEDIATE;GO
-- 3) put the db back online:
ALTER DATABASE billing SET ONLINE;

bitmiş!


1
  1. farklı adla "veritabanını kopyala" seçeneğiyle veritabanınızdan bir kopya oluşturun
  2. yeni kopyalanan veritabanını yedekle
  3. geri yükle!
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.