SQL Server 2012 Khôi phục bản sao lưu sang Tên DB mới


16

Tôi dường như nhớ rằng, vào năm 2008, bạn có thể khôi phục bản sao lưu thành bản sao mới của DB, bằng cách thay đổi tên trong trường "Cơ sở dữ liệu đích" từ trình hướng dẫn khôi phục. Nó sẽ tạo ra một DB hoàn toàn mới, đó là bản sao của DB gốc được khôi phục đến thời điểm mà bạn muốn. Tôi đã không tìm ra cách để SQL 2012 thực hiện điều này.

Bây giờ, tôi hiểu (nhờ Aaron Bertrand) rằng điều này không thực sự thay đổi, và năm 2012 thực sự làm cho tôi rõ ràng hơn rằng chiến lược này là một ý tưởng tồi ngay từ đầu!

Vì vậy, điều tôi cần làm là: Tạo một DB mới, 'MyDB_Copy', từ một DB hiện có, 'MyDB', bằng cách sử dụng các tệp sao lưu của nó. Chúng tôi có các bản sao lưu đầy đủ hàng đêm (.bak) và TLogs cứ sau 15 phút (.trn). Tôi không muốn 'MyDB' hiện tại bị ảnh hưởng / chạm vào, bởi vì nó "sống".

Sau khi MyDB_Copy được tạo từ tệp sao lưu chính đầy đủ, sau đó tôi cần khôi phục vài chục bản sao lưu TLog để đưa nó đến một thời điểm nhất định.


Bạn có thể hoặc Aaron chia sẻ lý do tại sao đây là một ý tưởng tồi? hoặc liên kết đến vấn đề mà nó được giải thích?
Thronk

Tôi tin rằng có một cái gì đó về tên logic không bị thay đổi, và do đó bạn sẽ kết thúc với hai DB ở cùng một nơi có tên và tệp vật lý khác nhau nhưng tên logic giống nhau, gây ra sự cố cho các kế hoạch bảo trì phụ thuộc về tên logic. Trong tình huống của tôi, những DB được khôi phục / sao chép đó không bao giờ tồn tại quá vài giờ, nhưng tôi có thể thấy tại sao nó không phải là một thực tiễn tuyệt vời.
NateJ

Câu trả lời:


18

Dựa vào ví dụ E trong tài liệu , mở một cửa sổ truy vấn mới và chạy:

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

Các tên logic không quan trọng; tên tập tin vật lý là. Điều này đưa ra các giả định về tên tệp logic của bạn và chỉ có hai; chạy EXEC MyDB..sp_helpfile;để chắc chắn

Nếu bạn cần khôi phục nhật ký, sau đó thay đổi RECOVERYthành NORECOVERY:

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

Sau đó, bạn có thể phát hành một loạt:

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

Và cuối cùng:

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

Hoặc nếu bạn chỉ cần một phần đăng nhập cho đến một thời điểm (Tôi giả sử bạn đã kiểm tra LSN và thời gian ở đâu để bạn biết chính xác tệp nào bạn cần):

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

Cách bạn nói đã làm việc trong các phiên bản trước sẽ không bao giờ hoạt động, trừ khi bản sao lưu đến từ một máy chủ khác. Theo mặc định, nó sẽ cố gắng đặt các tệp mdf và ldf mới vào cùng một vị trí và điều này là không thể.


Được rồi, điều đó đã giúp một chút. Bây giờ tôi cần khôi phục vài chục tệp TRN để đưa DB trở lại trạng thái vào tối thứ Sáu (các bản sao lưu đầy đủ chỉ diễn ra hàng ngày; các bản sao lưu TLog diễn ra cứ sau 15 phút). Sử dụng mẫu của bạn, tôi đã nhận được DB được tạo từ tệp BAK chính, nhưng tôi gặp một lỗi mới khi thử một câu lệnh tương tự để khôi phục nhật ký. Nó nói "không thể khôi phục nhật ký hoặc sao lưu vi sai vì không có tệp nào sẵn sàng để tiến hành".
NateJ

@NateJ bạn nên hỏi một câu hỏi đầy đủ sau đó. :-)
Aaron Bertrand

1
Tuyệt vời, tôi đang gõ nó ngay bây giờ! Cám ơn rất nhiều về sự giúp đỡ của bạn. Tôi cảm thấy thất vọng vì tôi đã có một vài đại diện tiêu cực tại StackOverflow nhưng nếu điều này hoạt động thì nó sẽ rất xứng đáng.
NateJ

1
@NateJ Bạn nên lấy lại đại diện đó vì câu hỏi đã bị xóa khi nó được di chuyển (hoặc cuối cùng sẽ). Đó không phải là tôi nhưng tôi nghi ngờ đó là vì lời buộc tội của bạn rằng nó đã hoạt động trong một phiên bản nhưng bây giờ thì không, khi đó rõ ràng chỉ là một sự hiểu lầm về những gì đang xảy ra ...
Aaron Bertrand

Oh tôi đã nhận được. Một cái gì đó giống như nó được sử dụng để làm việc - tôi có thể không nhớ chính xác những gì / làm thế nào, nhưng tôi đồng ý rằng nó đã bị hiểu lầm. Đồng nghiệp của tôi chửi thề lên xuống, nhưng bây giờ tôi nghĩ về nó, nó không có ý nghĩa gì. Chúng ta phải làm một cái gì đó khác đi, bằng cách sử dụng GUI. Tôi cảm thấy như sử dụng các lệnh / script như bạn đề xuất sẽ tốt hơn cho chúng tôi. :) Các bản ghi đang khôi phục lại, thành công cho đến nay!
NateJ

0

Tất cả những gì bạn cần làm để khôi phục cùng một cơ sở dữ liệu nhiều lần là thay đổi tên của các tệp đĩa cho cơ sở dữ liệu đó. Rõ ràng bạn cũng cần cung cấp cho cơ sở dữ liệu một tên khác với bất kỳ cơ sở dữ liệu nào khác trong SQL Server. Trong SSMS sau khi bạn đã chọn tệp .bak để khôi phục và nhập tên cho cơ sở dữ liệu, sau đó bạn nhấp vào 'Tệp' trong phần "Chọn trang" ở bên trái và chỉ cần thay đổi tên của các tệp đĩa.

Chúc mừng Doug

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.