Bagaimana cara mengembalikan ke database yang berbeda di sql server?

224

Saya memiliki cadangan Database1 dari seminggu yang lalu. Pencadangan dilakukan setiap minggu di penjadwal dan saya mendapatkan .bakfile. Sekarang saya ingin mengutak-atik beberapa data sehingga saya harus mengembalikannya ke database yang berbeda - Database2 .

Saya telah melihat pertanyaan ini: Kembalikan database SQL Server di pc yang sama dengan nama yang berbeda dan langkah yang disarankan adalah mengubah nama db asli, tetapi saya tidak memiliki pilihan itu karena saya berada di server produksi dan saya benar-benar tidak dapat melakukannya.

Apakah ada cara lain untuk mengembalikannya ke Database2, atau setidaknya, bagaimana cara menelusuri data file .bak itu?

Terima kasih.

ps: jawaban kedua dari tautan di atas tampak menjanjikan tetapi terus berakhir dengan kesalahan:

Restore Filelist berakhir secara tidak normal

LocustHorde
sumber

Jawaban:

304

Anda dapat membuat db baru kemudian menggunakan "Restore Wizard" yang mengaktifkan opsi Timpa atau;

Lihat kontennya;

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

catat nama logis dari .mdf & .ldf dari hasilnya, lalu;

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

Untuk membuat database MyTempCopydengan isi your.bak.

Contoh (mengembalikan cadangan db yang disebut 'creditline' ke '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.
sumber
5
Hai, saya sepertinya melewatkan sesuatu, terus melempar kesalahan backkup set holds a backup of a database other than existing "tmp" database, yang saya mengerti. Haruskah toungkapan itu menjadi jalur fisik yang sebenarnya MyTempCopy?
LocustHorde
Aneh, itu toadalah lokasi db & log untuk database baru, perbarui contoh di atas
Alex K.
52
Bagi siapa pun yang mencoba ini, jangan buat MyTempCopy, itu dibuat selama pemulihan.
Blazes
3
bekerja hanya dengan opsi REPLACE, RECOVERY, dalam kasus saya (SQL2012) cr. dba.stackexchange.com/questions/51489/...
dc2009
7
Harus menggunakan REPLACE, RECOVERY untuk menyelesaikannya. Jadi ini akan menjadi: 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:

Untuk database yang ada yang ingin Anda "pulihkan: dari cadangan database yang berbeda, ikuti langkah-langkah ini:

  1. Dari bilah alat, klik tombol Monitor Aktivitas.
  2. Klik proses. Saring berdasarkan database yang ingin Anda pulihkan. Matikan semua proses yang berjalan dengan mengklik kanan pada setiap proses dan memilih "matikan proses".
  3. Klik kanan pada basis data yang ingin Anda pulihkan, dan pilih Tugas -> Pulihkan -> Dari Basis Data.
  4. Pilih tombol radio "Dari Perangkat:".
  5. Pilih ... dan pilih file cadangan dari database lain yang ingin Anda pulihkan.
  6. Pilih set cadangan yang ingin Anda pulihkan dengan memilih kotak centang di sebelah kiri set cadangan.
  7. Pilih Pilihan".
  8. Pilih Timpa basis data yang ada (DENGAN PENGGANTIAN)
  9. Penting: Ubah baris "Kembalikan Sebagai" nama file Data ke nama file dari database yang ada yang ingin Anda timpa atau berikan nama baru.
  10. Lakukan hal yang sama dengan nama file file log.
  11. Verifikasi dari Layar Monitor Aktivitas bahwa tidak ada proses baru yang muncul. Jika ya, bunuh mereka.
  12. Klik OK.
Daniel Byrne
sumber
12
MS SQL Server 2010?
Tandai
3
Ada beberapa tangkapan layar di sini stackoverflow.com/questions/3829271/…
Tomas Kubes
Meskipun seorang programmer saya lebih suka menggunakan wizard ini. Lebih mudah dan bersih.
v1n1akabozo
1
Langkah kuncinya adalah # 8 bagi saya. Daniel terima kasih.
jbooker
Sql 2014 .. Langkah 6a: Ubah database Tujuan ke database yang ingin Anda pulihkan. Langkah 9 & 10: Ini harus dijaga untuk Anda dengan mengubah database Tujuan. Tapi periksa ini dengan pergi ke File dan memeriksa nama file seperti yang dijelaskan dalam langkah asli 9 & 10.
JzInqXc9Dg
49

Untuk SQL Server 2012, menggunakan Sql Server Management Studio, saya menemukan langkah-langkah ini dari halaman Microsoft berguna untuk mengembalikan ke file database dan nama yang berbeda: (ref: http://technet.microsoft.com/en-us/library/ms175510 .aspx )

Catatan langkah 4 dan 7 penting untuk diatur agar tidak menimpa basis data yang ada.


Untuk mengembalikan database ke lokasi baru, dan secara opsional mengganti nama database

  1. Menyambungkan ke contoh yang sesuai dari Mesin Database SQL Server, dan kemudian di Object Explorer, klik nama server untuk memperluas pohon server.
  2. Klik kanan Database , dan kemudian klik Pulihkan Database . Kotak dialog Pulihkan Basis Data terbuka.
  3. Pada halaman Umum , gunakan bagian Sumber untuk menentukan sumber dan lokasi set cadangan untuk dipulihkan. Pilih salah satu dari opsi berikut:

    • Basis data

      • Pilih database yang akan dipulihkan dari daftar drop-down. Daftar hanya berisi basis data yang telah dicadangkan sesuai dengan riwayat cadangan msdb .

        Catatan Jika cadangan diambil dari server yang berbeda, server tujuan tidak akan memiliki informasi riwayat cadangan untuk database yang ditentukan. Dalam hal ini, pilih Perangkat untuk secara manual menentukan file atau perangkat yang akan dipulihkan.

    • Alat

      • Klik tombol browse (...) untuk membuka kotak dialog Pilih perangkat cadangan . Di kotak Jenis media cadangan , pilih salah satu dari jenis perangkat yang terdaftar. Untuk memilih satu atau beberapa perangkat untuk kotak Media cadangan , klik Tambah . Setelah Anda menambahkan perangkat yang Anda inginkan ke kotak daftar Media cadangan , klik OK untuk kembali ke halaman Umum . Dalam kotak daftar Sumber: Perangkat: Basis Data , pilih nama basis data yang harus dipulihkan.

        Catatan Daftar ini hanya tersedia ketika Perangkat dipilih. Hanya basis data yang memiliki cadangan pada perangkat yang dipilih yang akan tersedia.

  4. Di bagian Tujuan , kotak Database secara otomatis diisi dengan nama database yang akan dipulihkan. Untuk mengubah nama database, masukkan nama baru di kotak Database .
  5. Di kotak Pulihkan ke , biarkan default sebagai Ke cadangan terakhir diambil atau klik pada Timeline untuk mengakses kotak dialog Timeline Backup untuk secara manual memilih titik waktu untuk menghentikan tindakan pemulihan.
  6. Di kotak cadangan Cadangan untuk memulihkan , pilih cadangan yang akan dipulihkan. Kotak ini menampilkan cadangan yang tersedia untuk lokasi yang ditentukan. Secara default, rencana pemulihan disarankan. Untuk mengganti rencana pemulihan yang disarankan, Anda dapat mengubah pilihan di kisi. Cadangan yang bergantung pada pemulihan cadangan sebelumnya secara otomatis tidak dipilih ketika cadangan sebelumnya tidak dipilih.
  7. Untuk menentukan lokasi baru file database, pilih halaman File , lalu klik Pindahkan semua file ke folder . Berikan lokasi baru untuk folder File data dan folder File log . Atau Anda dapat menyimpan folder yang sama dan hanya mengganti nama database dan nama file log.
Membusuk
sumber
3
Yang ini bekerja seperti pesona; terima kasih khusus untuk langkah 4 & 7
Anatoly Yakimchuk
Selain itu, saya harus membuka tab 'Opsi' dan memeriksa 'Timpa basis data yang ada (DENGAN PENGGANTIAN)' ... Kemudian berhasil.
John Kurtz
1
@JohnKurtz Anda tidak perlu melakukan itu jika Anda memulihkan ke database baru.
Rots
Saya sudah membuat database kosong untuk dipulihkan. Itu pasti bedanya.
John Kurtz
1
Dikonfirmasi bahwa itu berfungsi seperti yang dijelaskan jika Anda memasukkan nama database yang tidak ada di Langkah 4. Dikonfirmasi bahwa jika Anda memilih database yang berbeda yang sudah ada, Anda harus memeriksa 'Timpa database yang ada (DENGAN PENGGANTIAN)' on ' Tab Opsi. Terima kasih atas kesabaran Anda!
John Kurtz
34

Sebenarnya, tidak perlu mengembalikan database dalam istilah SQL Server asli, karena Anda "ingin bermain-main dengan beberapa data" dan "menelusuri data dari file .bak itu"

Anda dapat menggunakan ApexSQL Restore - alat SQL Server yang melampirkan cadangan basis data SQL asli dan terkompresi dan cadangan log transaksi sebagai basis data langsung , dapat diakses melalui SQL Server Management Studio, Visual Studio atau alat pihak ketiga lainnya. Hal ini memungkinkan melampirkan cadangan log lengkap atau tunggal, ganda, dan penuh transaksi

Selain itu, saya pikir Anda dapat melakukan pekerjaan saat alat ini dalam mode percobaan yang berfungsi penuh (14 hari)

Penafian: Saya bekerja sebagai Teknisi Dukungan Produk di ApexSQL

Ivan Stankovic
sumber
9

Inilah yang saya buat bersama dari berbagai posting untuk menyalin database menggunakan cadangan dan memulihkan dengan memindahkan untuk memperbaiki lokasi fisik dan sql tambahan untuk memperbaiki nama logis.

/**
 * 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
sumber
Halo NateN, saya ingin mengembalikan file .bak (yang ada di mesin lokal saya d: drive path) ke DB lain. Saya mencoba kode ini untuk pengujian unit tetapi memberikan kesalahan .. "Akses eksklusif tidak dapat diperoleh karena database sedang digunakan. "tidak dapat Kembalikan db .. bisakah Anda membantu saya bagaimana melakukannya ..?
Victor Athoti.
Basis data yang Anda pulihkan tidak dapat digunakan oleh proses lain. Saya tidak yakin cara skrip membunuh semua proses mengakses database.
Nathan Niesen
Halo NateN, Sekarang berfungsi dengan baik, saya menggunakan contoh kode Anda dan kemudian saya membuat perubahan kecil pada kode itu kemudian bekerja dengan baik .... Sekali lagi terima kasih telah memberikan kode sampel ...
Victor Athoti.
1
Untuk sql2014 dan seterusnya, DECLARE @BackupFiles...baris ini membutuhkan kolom tambahan:SnapshotURL nvarchar(360)
fiat
3

Ini sebenarnya sedikit lebih sederhana daripada mengembalikan ke server yang sama. Pada dasarnya, Anda hanya berjalan melalui opsi "Restore Database". Ini adalah tutorial untuk Anda:

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

Terutama karena ini adalah pengembalian non-produksi, Anda dapat merasa nyaman hanya mencobanya tanpa terlalu mengkhawatirkan detailnya. Cukup letakkan file SQL Anda di tempat yang Anda inginkan di server baru Anda dan berikan nama apa pun yang Anda inginkan dan Anda bisa melakukannya.

IAmTimCorey
sumber
HI, saya harus mengembalikan ke server yang sama, database yang berbeda ... (Restore db memiliki nama yang berbeda)
LocustHorde
Maaf, saya salah membaca pertanyaan. Prinsip dasar yang sama berlaku, Anda hanya perlu memastikan nama baru dan nama file (mdf, ldf, dll.) Berbeda.
IAmTimCorey
3

Jika tidak ada database saya menggunakan kode berikut:

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
sumber
3
  • Saya memiliki kesalahan yang sama dengan topik ini ketika saya memulihkan database baru menggunakan database lama. (menggunakan .bak memberikan kesalahan yang sama)

  • Saya Mengubah nama database lama dengan nama database baru (sama gambar ini). Itu berhasil.

masukkan deskripsi gambar di sini

Nguyen Duc Hai
sumber
2
Lain kali, harap hapus nama bank
Danh
1

Berikut adalah cara mengembalikan cadangan sebagai db tambahan dengan nama db unik.

Untuk SQL 2005 ini bekerja sangat cepat. Saya yakin versi yang lebih baru akan bekerja sama.

Pertama, Anda tidak harus mengambil db asli Anda offline. Tapi demi keamanan, saya suka. Dalam contoh saya, saya akan me-mount klon dari database "penagihan" saya dan akan dinamai "billingclone".

1) Buat cadangan database penagihan yang baik

2) Untuk keamanan, saya mengambil yang asli luring sebagai berikut:

3) Buka jendela Permintaan baru

**PENTING! Biarkan jendela permintaan ini terbuka sampai Anda semua selesai! Anda harus mengembalikan db dari jendela ini!

Sekarang masukkan kode berikut:

-- 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) Selanjutnya, di Studio Manajemen, klik Database di Object Explorer, pilih "Restore Database"

4) masukkan nama baru di bidang "Ke Basis Data". Yaitu billingclone

5) Di Sumber untuk Pemulihan, klik "Dari Perangkat" dan klik tombol ... navigasi

6) Klik Tambah dan arahkan ke cadangan Anda

7) Beri tanda centang di sebelah Pulihkan (Pilih set cadangan untuk dipulihkan)

8) selanjutnya pilih halaman OPSI di sudut LH atas

9) Sekarang edit nama file database di RESTORE AS. Lakukan ini untuk db dan log. Yaitu billingclone.mdf dan billingclone_log.ldf

10) sekarang tekan OK dan tunggu tugas selesai.

11) Tekan refresh di Explorer Obyek Anda dan Anda akan melihat db baru Anda

12) Sekarang Anda dapat menempatkan db tagihan Anda kembali online. Gunakan jendela permintaan yang sama dengan yang Anda gunakan untuk membuat penagihan offline. Gunakan perintah ini:

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

selesai!

gim
sumber
1
  1. buat salinan dari basis data Anda dengan opsi "salin basis data" dengan nama berbeda
  2. backup database yang baru disalin
  3. kembalikan!
sedras
sumber