Jak przywrócić do innej bazy danych w sql server?

Mam kopię zapasową Database1 sprzed tygodnia. Kopia zapasowa jest wykonywana co tydzień w schedulerze i dostaję plik .bak. Teraz chcę poszperać z niektórymi danymi, więc muszę przywrócić je do innej bazy danych - Database2 .

Widziałem takie pytanie: Przywróć bazę danych SQL Server na tym samym komputerze o innej nazwie i zalecanym krokiem jest zmiana nazwy oryginalnego db, ale jestem poza tą opcją, ponieważ jestem na serwerze produkcyjnym i nie mogę naprawdę zrobić to.

Czy Jest jakiś inny sposób na przywrócenie go do Database2, albo przynajmniej jak przeglądać dane z tego .akta bak?

Dzięki.

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

Restore Filelist kończy się nieprawidłowo

Author: Community, 2011-06-07

9 answers

Możesz utworzyć nowy db, a następnie użyć "Kreatora przywracania", włączającego opcję nadpisania lub;

Zobacz zawartość;

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

Zwróć uwagę na logiczne nazwy .mdf & ldf from the results, then;

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 {[3] } z zawartością your.bak.

W tym celu należy wykonać następujące czynności:]}
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).
 252
Author: Alex K.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-01 15:48:34

SQL Server 2008 R2:

Dla 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 na każdym procesie i wybierając "Zabij proces".
  3. Kliknij prawym przyciskiem myszy bazę danych, którą chcesz przywrócić, i wybierz zadania-->Przywróć-- > z Baza 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 Zastąp istniejącą bazę danych (z zastąp) Ważne:
  9. Zmień nazwę pliku danych wierszy" Przywróć jako " na nazwę pliku istniejącej bazy danych, którą chcesz zastąpić lub nadaj mu nową nazwę.
  10. zrób to samo z nazwą pliku dziennika.
  11. Sprawdź na ekranie monitora aktywności, czy nie powstały żadne nowe procesy. Jeśli tak, zabij ich.
  12. Kliknij OK.
 60
Author: Daniel Byrne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-22 19:34:39

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

Uwaga kroki 4 i 7 są ważne, aby ustawić tak, aby nie nadpisywać istniejącej bazy danych.


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

  1. Połącz się z odpowiednią instancją silnika 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 Source, aby określić źródło i lokalizację zestawów kopii zapasowych do przywrócenia. Wybierz jeden z następujące opcje:

    • Baza danych

      • Wybierz bazę danych do przywrócenia z listy rozwijanej. Lista zawiera tylko bazy danych, które zostały zarchiwizowane zgodnie z msdb historia kopii zapasowej.

        Uwaga Jeśli kopia zapasowa jest pobrana z innego serwera, serwer docelowy nie będzie miał informacji o historii kopii zapasowej dla podanej bazy danych. W takim przypadku wybierz urządzenie, aby ręcznie określ plik lub urządzenie do Przywróć.

    • Urządzenie

      • Kliknij Przeglądaj (...) przycisk, aby otworzyć Wybierz urządzenia kopii zapasowej okno dialogowe. W polu Typ nośnika kopii zapasowej wybierz jeden z wymienione typy urządzeń. Aby wybrać jedno lub więcej urządzeń dla backup media box, kliknij Dodaj. Po dodaniu urządzeń do listy nośników kopii zapasowych Kliknij OK , aby powrócić do ogólne strona. W w polu listy Source: Device: Database wybierz nazwę bazy danych, która ma zostać przywrócona.

        Uwaga Ta lista jest dostępna tylko po wybraniu urządzenia. Tylko bazy danych, które mają kopie zapasowe na wybranym urządzeniu będą bądź dostępny.

  4. w sekcji Destination pole baza danych jest automatycznie wypełniane nazwą bazy danych, która ma zostać przywrócona. Aby zmienić nazwę bazy danych, Wprowadź nową nazwę w Baza Danych box.
  5. w polu Przywróć do , pozostaw domyślną wartość do ostatniej wykonanej kopii zapasowej lub kliknij oś czasu , aby uzyskać dostęp do kopii zapasowej Oś czasu okno dialogowe, aby ręcznie wybrać punkt w czasie, aby zatrzymać akcja odzyskiwania.
  6. w siatce zestawów kopii zapasowych do przywrócenia Wybierz kopie zapasowe do przywrócenia. Ta siatka wyświetla kopie zapasowe dostępne dla określonego miejsce. Domyślnie, a proponowany jest plan naprawczy. Aby obejść sugerowany plan odzyskiwania umożliwia zmianę zaznaczenia w siatce. Kopie zapasowe, które zależą od przywrócenia wcześniejszej kopii zapasowej, to automatycznie wyłącza zaznaczenie, gdy wcześniejsza kopia zapasowa jest wyłączona.
  7. aby określić nową lokalizację plików bazy danych, wybierz stronę Files , a następnie kliknij Przenieś wszystkie pliki do folderu . Podaj nową lokalizację folderu pliku danych i pliku dziennika folder . Alternatywnie możesz zachować te same foldery i po prostu zmienić nazwę bazy danych i plików dziennika.
 37
Author: Rots,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-16 02:22:00

W rzeczywistości nie ma potrzeby przywracania bazy danych w natywnych warunkach SQL Server, ponieważ "chcesz majstrować z niektórymi danymi" i " przeglądać dane z tego.plik bak "

Możesz użyć ApexSQL Restore – narzędzie SQL Server, które dołącza zarówno natywne, jak i natywnie skompresowane kopie zapasowe baz danych SQL oraz kopie zapasowe dzienników transakcji jako żywe bazy danych, dostępne za pośrednictwem SQL Server Management Studio, Visual Studio lub innego narzędzia innej firmy. Umożliwia dołączanie jedno lub wiele kopii zapasowych pełnych, różnicowych i dziennika transakcji

Ponadto, myślę, że można wykonać zadanie, gdy narzędzie jest w pełni funkcjonalny tryb próbny (14 dni)

Zastrzeżenie: pracuję jako inżynier wsparcia produktu w ApexSQL

 34
Author: Ivan Stankovic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-24 18:25:04

Oto, co połączyłem z różnych postów, aby skopiować bazę danych za pomocą kopii zapasowej i przywracania z move, aby naprawić fizyczną lokalizację i dodatkowy 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);
 7
Author: NateN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-07 14:50:14

W rzeczywistości jest to nieco prostsze niż przywracanie na ten sam serwer. 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ę komfortowo po prostu go wypróbować, nie martwiąc się zbytnio o szczegóły. Po prostu umieść swoje pliki SQL tam, gdzie chcesz Twój nowy serwer i nadaj mu dowolną nazwę i jesteś gotowy.

 3
Author: IAmTimCorey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-07 15:08:49

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
 2
Author: Konstantin Chernov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-02 00:25:09

Oto jak przywrócić kopię zapasową jako dodatkowy db z unikalną nazwą db.

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

Po pierwsze, nie musisz wyłączać oryginalnego db. Ale ze względu na bezpieczeństwo, Lubię. W moim przykładzie zamierzam zamontować klon mojej bazy danych "billing" i będzie on nazwany "billingclone".

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

2) dla bezpieczeństwa wziąłem oryginał offline jako "follows": {]}

3) Otwórz nowe okno zapytania

**ważne! Zachowaj to okno zapytania otwarte, dopóki nie skończysz! Musisz przywrócić db z tego okna!

Wpisz teraz 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, rt kliknij bazy danych w Object Explorer, wybierz "Przywróć bazę danych"

4) Wprowadź nową nazwę w polu "do bazy danych". I. E. billingclone

5) w źródle przywracania, kliknij "z urządzenia" i kliknij ... przycisk nawigacyjny

6) Kliknij Dodaj i przejdź do kopii zapasowej

7) zaznacz pole wyboru obok opcji Przywróć (Wybierz zestawy kopii zapasowych do przywrócenia)

8) Następnie wybierz stronę opcji w górnym rogu LH

9) Teraz edytuj nazwy plików bazy danych w Przywróć jako. Zrób to zarówno dla db, jak i dziennika. I. E. 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 nowy db

12) Teraz możesz umieść swój db rozliczeniowy z powrotem online. Użyj tego samego okna zapytań, którego użyłeś do połączenia rozliczeń w trybie 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;
Zrobione!
 1
Author: gim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-24 04:42:20
  • Mam ten sam błąd co ten temat, gdy przywracam nową bazę danych za pomocą starej bazy danych. (używ .bak podaje ten sam błąd)

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

Tutaj wpisz opis obrazka

 1
Author: Nguyen Duc Hai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-27 23:48:52