Kesalahan 3154 saat memulihkan cadangan menggunakan WITH REPLACE

16

Saya memiliki SQL 2012 dengan SP1 diinstal di komputer saya. Saya membuat cadangan dari database test.bak.

Saya memiliki database dengan nama test2yang merupakan database yang sama, tetapi datanya berubah.

Saya ingin memulihkan test.bakmelalui test2database.

Saya selalu mendapatkan kesalahan:

Kesalahan 3154: Kumpulan cadangan menyimpan cadangan dari basis data selain dari basis data yang ada.

Saya mencoba:

  1. Saya langsung klik test2 -> Restore database -> From device

    Saya memilih test.bakdan memeriksa With Replacetetapi saya mendapatkan kesalahan.

  2. Kemudian saya mencoba mengklik kanan test2 -> Restore file and filegroups

    Saya memilih test.bakdan memeriksa With Replacetetapi saya mendapatkan kesalahan.

Saya bisa menghapus database lama saya dan kemudian mengembalikan cadangan saya dengan nama yang tepat, tetapi ketika saya menggunakan SQL 2008, saya tidak punya masalah memulihkan database yang sudah ada.

Tampaknya karena saya menggunakan SQL2012, saya mendapatkan banyak kesalahan ini!

Danielle Paquette-Harvey
sumber

Jawaban:

12

Anda harus menggunakan WITH REPLACEdan secara umum menghindari penggunaan barang point-and-click di Management Studio - mereka tidak fleksibel dan sering memiliki bug.

Ini bekerja untuk saya:

USE [master];
GO

CREATE DATABASE test;
GO

CREATE DATABASE test2;
GO

BACKUP DATABASE test TO DISK = 'c:\temp\test.bak' WITH INIT, COMPRESSION;
GO

RESTORE DATABASE test2
  FROM DISK = 'c:\temp\test.bak'
  WITH REPLACE,
  MOVE 'test' TO 'c:\temp\test2.mdf',
  MOVE 'test_log' TO 'c:\temp\test2.ldf';

Anda juga harus memastikan kapan Anda membuat cadangan basis data yang Anda gunakan WITH INITdan / atau tidak mengarahkan perangkat ke file yang sudah berisi cadangan (karena itu mungkin bukan basis data yang sama dengan yang Anda cadangkan sekarang - terutama jika Anda menggunakan kembali nama seperti test...).

Aaron Bertrand
sumber
@ AaronBertrand fyi, fitur itu memang ada. Apa yang biasanya saya lakukan adalah menggunakan UI dan skrip untuk memastikan semuanya baik-baik saja. Ada yang banyak bug, ya.
usr
2

1) Gunakan WITH REPLACEsaat menggunakan RESTOREperintah.

2) DROPdatabase lama yang bertentangan dan mengembalikan lagi menggunakan RESTOREperintah.

Tidak ada masalah dengan versi SQL Server. Seperti yang ditunjukkan Aaron, saya juga dapat memulihkan database dari 2008 hingga 2012 dan versi yang sama juga.

Kin Shah
sumber
2

Anda sedang memulihkan database yang salah. Jangan menganggapnya sebagai "memulihkan test2dengan cadangan dari test", pikirkan "pulihkan cadangan testnamun ubah nama menjadi test2". Anda dapat memilih tugas pemulihan dari testdan memasukkan test2bidang "Ke basis data:".

Seperti yang disebutkan Harun, pelajari naskahnya alih-alih mengandalkan penyihir - lebih jelas apa yang terjadi di mana.

SQLFox
sumber
2

Anda masih bisa melakukan ini tetapi membutuhkan langkah ekstra.

Buka dialog pengembalian, buat pilihan seperti biasa sesuai kebiasaan 2008. Jika database asli adalah DB, maka pilih perangkat DB.bak untuk Sumber dan ubah nama Tujuan menjadi DBTest. Kemudian di bawah Select A Page (sudut kiri atas) Anda di mana Anda melihat General / Files / Options - pilih Files. Lihat di kotak. Anda akan melihat kolom untuk Nama File Asli dan Mengembalikan Sebagai Nama File. Secara manual memperluas yang terakhir dan ketik nama baru (jika nama asli dari database adalah DB dan Anda ingin membuat DBTest maka ubah .... \ DB.mdf ke ... \ DBTest.mdf, dll.)

Ini akan menerima file .bak Anda untuk DB sebagai sumber dan DBTest sebagai tujuannya. Anda mungkin juga perlu pergi ke halaman Opsi dan memilih Dengan Ganti. Saya perlu karena alasan lain, jadi saya tidak bisa mengujinya tanpa opsi ini.

Debby
sumber
2

Jawaban yang benar, seperti yang ditunjukkan, adalah menggunakan WITH REPLACEopsi.

Saya hanya ingin menunjukkan bahwa Anda bisa mendapatkan kesalahan dalam pertanyaan bahkan ketika menggunakan WITH REPLACE, jika Anda mencoba untuk memulihkan dari cadangan diferensial (tanpa yang penuh).

Brimstedt
sumber
Mungkin saya tidak memiliki cukup poin untuk berkomentar pada saat jawaban ini, saya hanya ingin menunjukkan bahwa Anda bisa mendapatkan kesalahan bahkan ketika menggunakan "DENGAN PENGGANTIAN" jika Anda mencoba untuk memulihkan dari cadangan diferensial (tanpa yang lengkap)
Brimstedt
0

Semoga ini berhasil.

  1. Setelah Anda mengatur path untuk mengembalikan file.
  2. Klik "Opsi" di sebelah kiri.
  3. Centang kotak - "Tutup koneksi yang ada ke database tujuan".
  4. Klik OK. masukkan deskripsi gambar di sini
Vinu M Shankar
sumber
-4

Tolong hentikan server Anda yang berjalan dan kemudian kembalikan db, itu akan membantu Anda. :)

Dupinder Singh
sumber