Nếu bạn sử dụng SQL Server Management Studio (SSMS) hoặc một số GUI khác để quản lý cơ sở dữ liệu của mình, bạn có thể quen với việc sao lưu và khôi phục cơ sở dữ liệu bằng cách sử dụng “trỏ và nhấp”.
Thông thường, điều này liên quan đến việc nhấp chuột phải vào cơ sở dữ liệu và chọn Khôi phục hoặc tương tự, sau đó làm theo lời nhắc (ví dụ:khi khôi phục cơ sở dữ liệu trong Azure Data Studio).
Nhưng nếu bạn cần làm điều đó với T-SQL, bạn có thể sử dụng RESTORE DATABASE
tuyên bố.
Ví dụ
Đây là một ví dụ cơ bản:
RESTORE DATABASE World
FROM DISK = N'/var/opt/mssql/Bak/World.bak'
WITH FILE = 1;
Điều này gần như đơn giản nhất có thể. RESTORE DATABASE
câu lệnh có cú pháp khá phức tạp (như với hầu hết mọi thứ T-SQL), nhưng câu lệnh này là đủ cho một hoạt động khôi phục mặc định, cơ bản.
Trong trường hợp này, tôi đã khôi phục cơ sở dữ liệu có tên Thế giới từ tệp .bak. Tôi đã sử dụng FROM DISK
để xác định rằng đó là từ tệp .bak và tôi đã cung cấp đường dẫn đầy đủ đến tệp đó. Các tùy chọn khác ở đây bao gồm FROM TAPE
và FROM URL
.
Tôi cũng đã bao gồm WITH FILE = 1
ở đây nhưng dù sao đó cũng là giá trị mặc định. Mệnh đề này chỉ định số tệp bộ sao lưu sẽ sử dụng. Tức là sẽ sử dụng bộ sao lưu nào trong tệp (một tệp có thể có nhiều bộ sao lưu).
Nhận danh sách các bộ dự phòng
Bạn có thể sử dụng RESTORE HEADERONLY
để lấy danh sách các bộ sao lưu trong tệp. Cụ thể hơn, nó trả về một tập hợp kết quả của thông tin tiêu đề sao lưu cho tất cả các tập hợp sao lưu.
Ví dụ:
RESTORE HEADERONLY
FROM DISK = N'/var/opt/mssql/Bak/WideWorldImporters-Full.bak';
Điều này trả về rất nhiều cột vì vậy tôi sẽ không trình bày tất cả chúng ở đây.
Một trong các cột được gọi là Vị trí . Điều này sẽ được sử dụng với FILE =
khi khôi phục cơ sở dữ liệu.
Ví dụ với các tùy chọn khác
Dưới đây là một ví dụ với nhiều tùy chọn hơn:
RESTORE DATABASE [WideWorldImporters]
FROM DISK = N'/var/opt/mssql/Bak/WideWorldImporters-Full.bak'
WITH FILE = 1,
MOVE N'WWI_Primary' TO N'/var/opt/mssql/data/WideWorldImporters.mdf',
MOVE N'WWI_UserData' TO N'/var/opt/mssql/data/WideWorldImporters_UserData.ndf',
MOVE N'WWI_Log' TO N'/var/opt/mssql/data/WideWorldImporters.ldf',
MOVE N'WWI_InMemory_Data_1' TO N'/var/opt/mssql/data/WideWorldImporters_InMemory_Data_1',
NOUNLOAD,
STATS = 5;
Đây thực sự là tập lệnh mà Azure Data Studio đã tạo cho tôi khi tôi sử dụng giao diện GUI để bắt đầu hoạt động khôi phục. Khi bạn làm điều đó, Azure Data Studio cung cấp cho bạn tùy chọn chạy khôi phục ngay lập tức hoặc tạo tập lệnh với mã T-SQL mà bạn có thể chạy sau.
Trong trường hợp này, tập lệnh sử dụng MOVE
để di chuyển từng tên tệp logic trong tệp sao lưu, đến vị trí tệp vật lý được chỉ định trên hệ điều hành. Trong trường hợp này, tệp .bak đã sử dụng một vị trí tệp vật lý khác (và sử dụng đường dẫn tệp Windows) và do đó, điều này phải thay đổi để phù hợp với hệ thống của tôi. Xem bên dưới để biết giải thích về cách lấy thông tin này.
NOUNLOAD
thực sự là một tùy chọn băng. Nó đảm bảo rằng băng không bị dỡ ra khỏi ổ đĩa sau khi quá trình khôi phục hoàn tất. Do tôi không khôi phục từ băng, nên tùy chọn này đã bị bỏ qua.
STATS
đối số cho phép bạn đánh giá tiến trình của hoạt động khôi phục. Nó chỉ định rằng một thông báo sẽ được hiển thị mỗi khi một tỷ lệ phần trăm khác hoàn thành. Nếu bạn không bao gồm giá trị phần trăm ở đây, SQL Server sẽ hiển thị thông báo sau khi hoàn thành mỗi 10%.
KHÔI PHỤC LỌC LỌC
Nếu bạn muốn tạo một câu lệnh giống như câu trước đó, sử dụng MOVE
đối số để di chuyển từng tên tệp logic trong tệp sao lưu, đến vị trí tệp vật lý được chỉ định trên hệ điều hành, bạn có thể sử dụng RESTORE FILELISTONLY
để trả về tên tệp logic (và hơn thế nữa).
RESTORE FILELISTONLY
trả về tập kết quả chứa danh sách cơ sở dữ liệu và tệp nhật ký có trong tập sao lưu.
Dưới đây là một ví dụ sử dụng cùng một tệp WideWorldImporters .bak từ ví dụ trước đó:
RESTORE FILELISTONLY
FROM DISK = N'/var/opt/mssql/Bak/WideWorldImporters-Full.bak';
Kết quả (sử dụng đầu ra dọc):
-[ RECORD 1 ]------------------------- LogicalName | WWI_Primary PhysicalName | D:\Data\WideWorldImporters.mdf Type | D FileGroupName | PRIMARY Size | 1073741824 MaxSize | 35184372080640 FileId | 1 CreateLSN | 0 DropLSN | 0 UniqueId | 8d30f4f9-a463-404f-805a-9bd1c634b66b ReadOnlyLSN | 0 ReadWriteLSN | 0 BackupSizeInBytes | 11993088 SourceBlockSize | 512 FileGroupId | 1 LogGroupGUID | NULL DifferentialBaseLSN | 626000002440500037 DifferentialBaseGUID | 0c5a4141-4a09-4b31-8c83-217870278065 IsReadOnly | 0 IsPresent | 1 TDEThumbprint | NULL SnapshotUrl | NULL -[ RECORD 2 ]------------------------- LogicalName | WWI_UserData PhysicalName | D:\Data\WideWorldImporters_UserData.ndf Type | D FileGroupName | USERDATA Size | 2147483648 MaxSize | 35184372080640 FileId | 3 CreateLSN | 37000000095200001 DropLSN | 0 UniqueId | 28d406e0-78ff-4400-9a4b-3a05d136b1f3 ReadOnlyLSN | 0 ReadWriteLSN | 0 BackupSizeInBytes | 434962432 SourceBlockSize | 512 FileGroupId | 2 LogGroupGUID | NULL DifferentialBaseLSN | 626000002440500037 DifferentialBaseGUID | 0c5a4141-4a09-4b31-8c83-217870278065 IsReadOnly | 0 IsPresent | 1 TDEThumbprint | NULL SnapshotUrl | NULL -[ RECORD 3 ]------------------------- LogicalName | WWI_Log PhysicalName | E:\Log\WideWorldImporters.ldf Type | L FileGroupName | NULL Size | 104857600 MaxSize | 2199023255552 FileId | 2 CreateLSN | 0 DropLSN | 0 UniqueId | 6ac6807e-8774-415b-8efc-e8c569b0855e ReadOnlyLSN | 0 ReadWriteLSN | 0 BackupSizeInBytes | 0 SourceBlockSize | 512 FileGroupId | 0 LogGroupGUID | NULL DifferentialBaseLSN | 0 DifferentialBaseGUID | 00000000-0000-0000-0000-000000000000 IsReadOnly | 0 IsPresent | 1 TDEThumbprint | NULL SnapshotUrl | NULL -[ RECORD 4 ]------------------------- LogicalName | WWI_InMemory_Data_1 PhysicalName | D:\Data\WideWorldImporters_InMemory_Data_1 Type | S FileGroupName | WWI_InMemory_Data Size | 0 MaxSize | 0 FileId | 65537 CreateLSN | 624000000336200003 DropLSN | 0 UniqueId | f65663c8-a250-433e-bbe6-e13a5599a607 ReadOnlyLSN | 0 ReadWriteLSN | 0 BackupSizeInBytes | 980090880 SourceBlockSize | 512 FileGroupId | 3 LogGroupGUID | NULL DifferentialBaseLSN | 626000002440500037 DifferentialBaseGUID | 0c5a4141-4a09-4b31-8c83-217870278065 IsReadOnly | 0 IsPresent | 1 TDEThumbprint | NULL SnapshotUrl | NULL
Vì vậy, chúng ta có thể thấy rằng các vị trí thực của tệp này sử dụng đường dẫn tệp Windows. Ví dụ:cái đầu tiên (có tên logic là WWI_Primary ) có vị trí thực là D:\ Data \ WideWorldImporters.mdf .
Trong trường hợp của tôi, tôi đã khôi phục cơ sở dữ liệu vào SQL Server cho Linux (chạy trong vùng chứa Docker trên máy Mac của tôi), vì vậy khi khôi phục tệp .bak này vào hệ thống của mình, tôi phải thay đổi đường dẫn vật lý cho phù hợp với hệ thống của mình.
Tất nhiên, bạn cũng có thể thay đổi đường dẫn tệp khi khôi phục tệp vào máy Windows nếu được yêu cầu.
Cú pháp đầy đủ
Việc sao lưu và khôi phục cơ sở dữ liệu có thể khá liên quan, tùy thuộc vào yêu cầu của bạn. RESTORE
câu lệnh được thiết kế để bao gồm nhiều tình huống khác nhau. Đặc biệt, nó bao gồm các tình huống khôi phục sau:
- Khôi phục toàn bộ cơ sở dữ liệu từ bản sao lưu toàn bộ cơ sở dữ liệu (khôi phục hoàn toàn).
- Khôi phục một phần cơ sở dữ liệu (khôi phục một phần).
- Khôi phục các tệp hoặc nhóm tệp cụ thể vào cơ sở dữ liệu (khôi phục tệp).
- Khôi phục các trang cụ thể vào cơ sở dữ liệu (khôi phục trang).
- Khôi phục nhật ký giao dịch vào cơ sở dữ liệu (khôi phục nhật ký giao dịch).
- Hoàn nguyên cơ sở dữ liệu về thời điểm được chụp nhanh cơ sở dữ liệu.
Cú pháp đầy đủ chứa nhiều tùy chọn, vì vậy nếu yêu cầu của bạn vượt quá phạm vi của bài viết này, hãy xem tài liệu của Microsoft cho RESTORE
chính thức cú pháp và giải thích.
Ngoài ra, hãy đọc Tổng quan về Khôi phục và Phục hồi của Microsoft để biết tổng quan về các cân nhắc và cách tiếp cận khác nhau để khôi phục cơ sở dữ liệu.