Jak przywrócić do innej bazy danych na serwerze SQL?

224

Mam kopię zapasową Database1 sprzed tygodnia. Kopia zapasowa jest wykonywana co tydzień w harmonogramie i otrzymuję .bakplik. Teraz chcę majstrować przy niektórych danych, więc muszę je przywrócić do innej bazy danych - Database2 .

Widziałem to pytanie: przywróć bazę danych SQL Server na tym samym komputerze o innej nazwie i zalecanym krokiem jest zmiana nazwy oryginalnej bazy danych , ale nie mam tej opcji, ponieważ jestem na serwerze produkcyjnym i naprawdę nie mogę tego zrobić.

Czy istnieje jakiś inny sposób przywrócenia go Database2, lub przynajmniej, w jaki sposób mogę przeglądać dane tego pliku .bak?

dzięki.

ps: druga odpowiedź z powyższego linku wyglądała obiecująco, ale wciąż kończy się błędem:

Przywracanie listy plików kończy się nieprawidłowo

LocustHorde
źródło

Odpowiedzi:

304

Możesz utworzyć nową bazę danych, a następnie użyć „Kreatora przywracania” włączającego opcję Zastąp lub;

Zobacz zawartość;

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

zanotuj logiczne nazwy plików .mdf i .ldf z wyników, a następnie;

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

Aby utworzyć bazę danych MyTempCopyz zawartością your.bak.

Przykład (przywraca kopię zapasową bazy danych o nazwie „linia kredytowa” do „MyTempCopy”;

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).
Alex K.
źródło
5
Cześć, wydaje mi się, że czegoś mi brakuje, to wciąż rzuca błąd backkup set holds a backup of a database other than existing "tmp" database, co rozumiem. Czy towyrażenie powinno być faktyczną ścieżką fizyczną MyTempCopy?
LocustHorde
Dziwne, tojest to lokalizacja db & log dla nowej bazy danych, przykład aktualizacji powyżej
Alex K.
52
Jeśli ktoś spróbuje tego, nie twórz MyTempCopy, jest on tworzony podczas przywracania.
Płonie
3
działał tylko z opcją WYMIANA, ODZYSKIWANIE, opcje w moim przypadku (SQL2012) cr. dba.stackexchange.com/questions/51489/…
dc2009
7
Należy użyć WYMIANA, ODZYSKIWANIA, aby to rozwiązać. Tak więc byłoby to: 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:

W przypadku istniejącej bazy danych, którą chcesz „przywrócić: z kopii zapasowej innej bazy danych, wykonaj następujące kroki:

  1. Na pasku narzędzi kliknij przycisk Monitor aktywności.
  2. Kliknij procesy. Filtruj według bazy danych, którą chcesz przywrócić. Zabij wszystkie uruchomione procesy, klikając prawym przyciskiem myszy każdy proces i wybierając „zabij proces”.
  3. Kliknij prawym przyciskiem myszy bazę danych, którą chcesz przywrócić, i wybierz Zadania -> Przywróć -> Z bazy danych.
  4. Wybierz przycisk radiowy „Z urządzenia:”.
  5. Wybierz ... i wybierz plik kopii zapasowej innej bazy danych, z której chcesz przywrócić.
  6. Wybierz zestaw kopii zapasowych, z którego chcesz przywrócić, zaznaczając pole wyboru po lewej stronie zestawu kopii zapasowych.
  7. Wybierz opcje".
  8. Wybierz opcję Zastąp istniejącą bazę danych (Z WYMIANA)
  9. Ważne: zmień nazwę pliku danych wiersza „Przywróć jako” na nazwę istniejącej bazy danych, którą chcesz zastąpić, lub po prostu nadaj jej nową nazwę.
  10. Zrób to samo z nazwą pliku dziennika.
  11. Na ekranie Monitora aktywności sprawdź, czy nie pojawiły się nowe procesy. Jeśli tak, zabij ich.
  12. Kliknij OK.
Daniel Byrne
źródło
12
MS SQL Server 2010?
Mark
3
Tutaj jest kilka zrzutów ekranu stackoverflow.com/questions/3829271/...
Tomas Kubes,
Pomimo tego, że jestem programistą, wolę korzystać z tego kreatora. Łatwiejsze i czystsze.
v1n1akabozo
1
Kluczowy krok to dla mnie numer 8. Dziękuję Daniel.
jbooker
Sql 2014 .. Krok 6a: Zmień docelową bazę danych na bazę danych, którą chcesz przywrócić. Krok 9 i 10: Trzeba o to zadbać, zmieniając docelową bazę danych. Ale sprawdź to dwukrotnie, przechodząc do plików i sprawdzając nazwy plików zgodnie z opisem w oryginalnym kroku 9 i 10.
JzInqXc9Dg
49

W przypadku SQL Server 2012, używając Sql Server Management Studio, uznałem te kroki ze strony Microsoft za przydatne do przywrócenia do innego pliku bazy danych i nazwy: (zob .: http://technet.microsoft.com/en-us/library/ms175510 .aspx )

Uwaga: kroki 4 i 7 są ważne, aby nie zastępować istniejącej bazy danych.


Aby przywrócić bazę danych do nowej lokalizacji i opcjonalnie zmień nazwę bazy danych

  1. Połącz się z odpowiednią instancją aparatu bazy danych SQL Server, a następnie w Eksploratorze obiektów kliknij nazwę serwera, aby rozwinąć drzewo serwerów.
  2. Kliknij prawym przyciskiem myszy Bazy danych , a następnie kliknij Przywróć bazę danych . Zostanie otwarte okno dialogowe Przywróć bazę danych .
  3. Na stronie Ogólne użyj sekcji Źródło, aby określić źródło i lokalizację zestawów kopii zapasowych do przywrócenia. Wybierz jedną z następujących opcji:

    • Baza danych

      • Wybierz bazę danych do przywrócenia z listy rozwijanej. Lista zawiera tylko bazy danych, których kopie zapasowe utworzono zgodnie z historią kopii zapasowej msdb .

        Uwaga Jeśli kopia zapasowa zostanie pobrana z innego serwera, serwer docelowy nie będzie posiadał informacji o historii kopii zapasowej dla określonej bazy danych. W takim przypadku wybierz opcję Urządzenie, aby ręcznie określić plik lub urządzenie do przywrócenia.

    • Urządzenie

      • Kliknij przycisk Przeglądaj (...), aby otworzyć okno dialogowe Wybierz urządzenia kopii zapasowej . W polu Typ nośnika kopii zapasowej wybierz jeden z wymienionych typów urządzeń. Aby wybrać jedno lub więcej urządzeń dla pola Nośnik kopii zapasowej , kliknij Dodaj . Po dodaniu wybranych urządzeń do pola listy Nośniki kopii zapasowej kliknij przycisk OK, aby powrócić do strony Ogólne . W polu listy Źródło: Urządzenie: baza danych wybierz nazwę bazy danych, którą chcesz przywrócić.

        Uwaga Ta lista jest dostępna tylko po wybraniu Urządzenie. Dostępne będą tylko bazy danych, które mają kopie zapasowe na wybranym urządzeniu.

  4. W sekcji Miejsce docelowe pole Baza danych jest automatycznie wypełniane nazwą bazy danych do przywrócenia. Aby zmienić nazwę bazy danych, wprowadź nową nazwę w polu Baza danych .
  5. W polu Przywróć do pozostaw wartość domyślną jako Do ostatniej wykonanej kopii zapasowej lub kliknij Oś czasu, aby uzyskać dostęp do okna dialogowego Oś czasu kopii zapasowej , aby ręcznie wybrać punkt w czasie, aby zatrzymać akcję odzyskiwania.
  6. W zestawach kopii zapasowych do przywracania siatki wybierz kopie zapasowe do przywrócenia. Ta siatka wyświetla kopie zapasowe dostępne dla określonej lokalizacji. Domyślnie sugerowany jest plan naprawy. Aby zastąpić sugerowany plan odzyskiwania, możesz zmienić opcje w siatce. Kopie zapasowe, które zależą od przywrócenia wcześniejszej kopii zapasowej, są automatycznie odznaczane po odznaczeniu wcześniejszej kopii zapasowej.
  7. Aby określić nową lokalizację plików bazy danych, wybierz stronę Pliki , a następnie kliknij opcję Przenieś wszystkie pliki do folderu . Podaj nową lokalizację folderu pliku danych i folderu pliku dziennika . Alternatywnie możesz zachować te same foldery i po prostu zmienić nazwę bazy danych i nazw plików dziennika.
Zgnilizna
źródło
3
Ten działa jak urok; specjalne podziękowania za kroki 4 i 7
Anatolij Jakimczuk
Dodatkowo musiałem przejść do zakładki „Opcje” i zaznaczyć „Zastąp istniejącą bazę danych (Z WYMIANA)” ... Potem zadziałało.
John Kurtz
1
@JohnKurtz nie powinieneś tego robić, jeśli przywracasz do nowej bazy danych.
Rots
Utworzyłem już pustą bazę danych do przywrócenia. To musi być różnica.
John Kurtz
1
Potwierdzono, że działa on tak, jak opisano, jeśli w kroku 4 wprowadzisz nazwę nieistniejącej bazy danych. Potwierdził, że jeśli wybierzesz inną bazę danych, która już istnieje, musisz zaznaczyć opcję „Zastąp istniejącą bazę danych (Z WYMIENĄ)” na „ Karta Opcje. Dziękuję za cierpliwość!
John Kurtz
34

W rzeczywistości nie ma potrzeby przywracania bazy danych w natywnych warunkach SQL Server, ponieważ „chcesz bawić się danymi” i „przeglądać dane tego pliku .bak”

Możesz użyć ApexSQL Restore - narzędzia SQL Server, które dołącza zarówno rodzime, jak i natywnie skompresowane kopie zapasowe bazy danych SQL oraz kopie dzienników transakcji jako bazy danych na żywo , dostępne za pośrednictwem SQL Server Management Studio, Visual Studio lub dowolnego innego narzędzia zewnętrznego. Umożliwia dołączanie pojedynczych lub wielu pełnych kopii zapasowych, różnicowych i dzienników transakcji

Ponadto uważam, że możesz wykonać zadanie, gdy narzędzie jest w pełni funkcjonalnym trybie próbnym (14 dni)

Oświadczenie: Pracuję jako inżynier wsparcia produktu w ApexSQL

Ivan Stankovic
źródło
9

Oto, co zebrałem razem z różnych postów, aby skopiować bazę danych za pomocą kopii zapasowej i przywracania z przeniesieniem, aby naprawić fizyczną lokalizację i dodatkową sql, aby naprawić logiczną nazwę.

/**
 * 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);
Nathan Niesen
źródło
Witaj NateN, chcę przywrócić mój plik .bak (który istnieje w mojej lokalnej maszynie d: ścieżka dysku) do innej bazy danych. Próbowałem tego kodu do testów jednostkowych, ale daje błąd. ”Nie można uzyskać dostępu wyłącznego, ponieważ baza danych jest w użyciu. "nie można przywrócić db .. czy możesz mi pomóc, jak to zrobić ...?
Victor Athoti.
Przywracana baza danych nie może być używana przez inny proces. Nie jestem pewien, jak wykonać skrypt, zabijając wszystkie procesy uzyskujące dostęp do bazy danych.
Nathan Niesen
Witaj NateN, teraz działa dobrze, używam twojego przykładowego fragmentu kodu, a następnie wprowadziłem małe zmiany w tym kodzie, a następnie działa dobrze ... Jeszcze raz dziękuję za podanie przykładowego kodu ...
Victor Athoti.
1
W przypadku wersji sql2014 i późniejszych DECLARE @BackupFiles...wiersz wymaga dodatkowej kolumny:SnapshotURL nvarchar(360)
fiat
3

Jest to w rzeczywistości nieco prostsze niż przywracanie na tym samym serwerze. Zasadniczo wystarczy przejść przez opcje „Przywróć bazę danych”. Oto samouczek dla Ciebie:

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

Zwłaszcza, że ​​jest to przywracanie nieprodukcyjne, możesz czuć się swobodnie po prostu wypróbowując go, nie martwiąc się zbytnio o szczegóły. Po prostu umieść swoje pliki SQL tam, gdzie chcesz, na nowym serwerze i nadaj im dowolną nazwę, którą chcesz i możesz już iść.

IAmTimCorey
źródło
HI, muszę przywrócić na tym samym serwerze, innej bazie danych ... (Baza danych przywracania ma inną nazwę)
LocustHorde
Przepraszam, źle odczytałem pytanie. Obowiązują te same podstawowe zasady, wystarczy upewnić się, że nowa nazwa i nazwy plików (mdf, ldf itp.) Są różne.
IAmTimCorey
3

Jeśli nie istnieje baza danych, używam następującego kodu:

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
Konstantin Chernov
źródło
3
  • Mam ten sam błąd, co w tym temacie podczas przywracania nowej bazy danych przy użyciu starej bazy danych. (użycie .bak daje ten sam błąd)

  • Zmieniłem nazwę starej bazy danych na nazwę nowej bazy danych (to samo na tym zdjęciu). Zadziałało.

wprowadź opis zdjęcia tutaj

Nguyen Duc Hai
źródło
2
Następnym razem, proszę usunąć nazwę banku
Danh
1

Oto jak przywrócić kopię zapasową jako dodatkową bazę danych o unikalnej nazwie.

W przypadku SQL 2005 działa to bardzo szybko. Jestem pewien, że nowsze wersje będą działać tak samo.

Po pierwsze, nie musisz wyłączać oryginalnej bazy danych w trybie offline. Ale ze względów bezpieczeństwa lubię. W moim przykładzie zamierzam zamontować klon mojej bazy danych „billingowych”, która będzie nosić nazwę „billingclone”.

1) Zrób dobrą kopię zapasową bazy danych rozliczeń

2) Ze względów bezpieczeństwa wziąłem oryginał offline w następujący sposób:

3) Otwórz nowe okno zapytania

**WAŻNY! Pozostaw to okno zapytania otwarte, dopóki nie skończysz! Musisz przywrócić db z tego okna!

Teraz wprowadź następujący kod:

-- 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) Następnie w Management Studio kliknij rt bazy danych w Object Explorer, wybierz „Przywróć bazę danych”

4) wprowadź nową nazwę w polu „Do bazy danych”. IE billingclone

5) W polu Źródło do przywracania kliknij „Z urządzenia” i kliknij przycisk… nawiguj

6) Kliknij Dodaj i przejdź do kopii zapasowej

7) Umieść znacznik wyboru obok pozycji Przywróć (wybierz zestawy kopii zapasowych do przywrócenia)

8) następnie wybierz stronę OPCJE w górnym lewym rogu

9) Teraz edytuj nazwy plików bazy danych w RESTORE AS. Zrób to zarówno dla bazy danych, jak i dziennika. IE billingclone.mdf i billingclone_log.ldf

10) teraz naciśnij OK i poczekaj na zakończenie zadania.

11) Naciśnij odśwież w Eksploratorze obiektów, a zobaczysz nową db

12) Teraz możesz przywrócić swój system rozliczeniowy z powrotem do trybu online. Skorzystaj z tego samego okna zapytań, którego użyłeś do rozliczenia offline. Użyj tego polecenia:

-- 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;

Gotowe!

gim
źródło
1
  1. zrób kopię ze swojej bazy danych z opcją „kopiuj bazę danych” o innej nazwie
  2. wykonaj kopię zapasową nowej skopiowanej bazy danych
  3. przywróć to!
sedras
źródło