SQL Server 2012 Kembalikan cadangan ke Nama DB baru

16

Sepertinya saya ingat bahwa, pada 2008, Anda bisa mengembalikan cadangan ke salinan baru DB, dengan mengubah nama di bidang "Destination Database" dari restore-wizard. Itu akan membuat DB baru, yang merupakan salinan dari DB asli yang dikembalikan ke titik waktu yang Anda inginkan. Saya belum seumur hidup saya menemukan cara untuk membuat SQL 2012 melakukan ini.

Sekarang, saya mengerti (terima kasih kepada Aaron Bertrand) bahwa ini tidak benar-benar berubah, dan bahwa 2012 sebenarnya membuatnya lebih jelas bagi saya bahwa strategi ini adalah ide yang buruk!

Jadi, yang perlu saya lakukan adalah ini: Buat DB baru, 'MyDB_Copy', dari DB yang ada, 'MyDB', dengan menggunakan file cadangannya. Kami memiliki cadangan lengkap malam (.bak) dan setiap TLogs 15 menit (.trn). Saya tidak ingin 'MyDB' yang ada terpengaruh / tersentuh sama sekali, karena ini "langsung".

Setelah MyDB_Copy dibuat dari file cadangan lengkap utama, saya kemudian perlu mengembalikan beberapa lusin cadangan TLog untuk mendapatkannya ke titik waktu tertentu.

NateJ
sumber
Bisakah Anda atau Harun berbagi mengapa ini adalah ide yang buruk? atau tautan ke masalah di mana dijelaskan?
Thronk
Saya percaya ini adalah sesuatu tentang nama-nama logis yang tidak berubah, dan dengan demikian Anda akan berakhir dengan dua DB di tempat yang sama yang memiliki nama dan file fisik yang berbeda tetapi nama-nama yang identik, yang menyebabkan masalah untuk rencana pemeliharaan yang bergantung pada nama-nama logis. Dalam situasi saya, DB yang dipulihkan / disalin tidak pernah bertahan lebih dari beberapa jam, tetapi saya bisa melihat mengapa itu bukan praktik yang bagus.
NateJ

Jawaban:

18

Berdasarkan longgar pada Contoh E dalam dokumentasi , buka jendela permintaan baru dan jalankan:

RESTORE DATABASE MyDB_Copy FROM DISK = 'C:\blahblah\MyDB.bak'
  WITH REPLACE, RECOVERY,
  MOVE 'MyDB' TO 'C:\blahblah\Data\MyDB_Copy.mdf',
---------------------------------------^^^^^
  MOVE 'MyDB_log' TO 'C:\blahblah\Data\MyDB_Copy.ldf';
-------------------------------------------^^^^^

Nama logis tidak penting; nama file fisiknya. Ini membuat asumsi tentang nama file logis Anda dan hanya ada dua; lari EXEC MyDB..sp_helpfile;untuk memastikan.

Jika Anda perlu memulihkan log, maka ubah RECOVERYke NORECOVERY:

  WITH REPLACE, NORECOVERY,
----------------^^

Kemudian Anda dapat mengeluarkan serangkaian:

RESTORE LOG MyDB_Copy FROM DISK = 'C:\blahblah\file1.trn' WITH NORECOVERY;

Dan yang terakhir:

RESTORE LOG MyDB_Copy FROM DISK = 'C:\blahblah\fileN.trn' WITH RECOVERY;

Atau jika Anda hanya memerlukan sebagian dari log hingga titik waktu (saya berasumsi Anda telah memeriksa di mana LSN dan waktu berada sehingga Anda tahu persis file mana yang Anda butuhkan):

RESTORE LOG MyDB_Copy FROM DISK = 'C:\blahblah\fileN.trn' WITH 
  STOPAT = '<some point in time Friday>', RECOVERY;

Cara Anda mengatakan bekerja di versi sebelumnya tidak akan pernah berhasil, kecuali jika cadangannya berasal dari server yang berbeda. Secara default akan mencoba untuk menempatkan file mdf dan ldf baru di tempat yang sama persis, dan ini tidak mungkin.

Aaron Bertrand
sumber
Oke, itu sedikit membantu. Sekarang saya perlu mengembalikan beberapa lusin file TRN untuk mendapatkan DB kembali ke keadaan pada hari Jumat malam (backup penuh hanya terjadi setiap hari; backup TLog terjadi setiap 15 menit). Dengan menggunakan sampel Anda, saya mendapatkan DB yang dibuat dari file BAK utama, tetapi saya mendapatkan kesalahan baru ketika mencoba pernyataan serupa untuk mengembalikan log. Ia mengatakan "cadangan log atau diferensial tidak dapat dipulihkan karena tidak ada file yang siap untuk rollforward".
NateJ
@NateJ Anda harus mengajukan pertanyaan lengkap. :-)
Aaron Bertrand
1
Luar biasa, saya mengetiknya sekarang! Terima kasih banyak atas bantuan Anda. Saya kecewa bahwa saya mendapat beberapa perwakilan negatif di StackOverflow tetapi jika ini berhasil itu akan sangat berharga.
NateJ
1
@NateJ Anda harus mendapatkan perwakilan itu kembali karena pertanyaannya telah dihapus ketika dimigrasikan (atau akan pada akhirnya). Itu bukan saya, tetapi saya menduga itu karena tuduhan Anda bahwa ini bekerja dalam satu versi tetapi tidak sekarang, ketika itu jelas hanya kesalahpahaman tentang apa yang terjadi ...
Aaron Bertrand
Oh, aku mengerti. Sesuatu seperti dulu bekerja - saya mungkin tidak ingat persis apa / bagaimana, tapi saya setuju bahwa itu disalahpahami. Kolega saya bersumpah atas dan ke bawah, tetapi sekarang setelah saya memikirkannya, itu tidak masuk akal. Kita harus melakukan sesuatu yang berbeda, menggunakan GUI. Saya merasa ingin menggunakan perintah / skrip seperti yang Anda sarankan akan lebih baik bagi kami. :) Log sedang dipulihkan sekarang, berhasil sejauh ini!
NateJ
0

Yang perlu Anda lakukan untuk memulihkan database yang sama beberapa kali adalah mengubah nama file disk untuk database itu. Jelas Anda perlu memberikan nama yang berbeda untuk database lain di SQL Server juga. Di SSMS setelah Anda memilih file .bak untuk dipulihkan dan mengetik nama untuk basis data, Anda kemudian klik 'File' di bagian "Select a page" di sebelah kiri dan cukup ubah nama file disk tersebut.

Cheers Doug

Doug
sumber