Trong các bài viết trước của tôi, tôi đã giải thích cách tạo và cấu hình tính năng FILESTREAM trong phiên bản máy chủ SQL. Hơn nữa, tôi đã trình bày cách tạo một bảng có cột FILESTREAM và nóng để chèn và xóa dữ liệu khỏi nó.
Trong bài viết này, tôi sẽ giải thích cách sao lưu và khôi phục cơ sở dữ liệu hỗ trợ FILESTREAM. Hơn nữa, tôi sẽ trình bày cách khôi phục nhóm tệp FILESTREAM mà không làm cơ sở dữ liệu ngoại tuyến.
Như tôi đã giải thích trong các bài viết trước của mình, khi chúng ta bật FILESTREAM trên phiên bản SQL Server, chúng ta cần tạo một vùng chứa FILESTREAM có nhóm tệp FILESTREAM. Khi chúng tôi sao lưu cơ sở dữ liệu hỗ trợ FILESTREAM, bản sao lưu của nhóm tệp FILESTREAM sẽ được đưa vào bộ sao lưu. Khi chúng tôi khôi phục cơ sở dữ liệu, SQL Server sẽ khôi phục cơ sở dữ liệu và vùng chứa FILESTREAM và các tệp trong đó.
Khi chúng tôi sao lưu cơ sở dữ liệu hỗ trợ FILESTREAM, nó sẽ:
- Sao lưu tất cả các tệp dữ liệu có sẵn của cơ sở dữ liệu.
- Sao lưu nhóm tệp FILESTREAM và các tệp trong đó.
- T-Log sao lưu.
SQL Server cung cấp sự linh hoạt để chỉ sao lưu vùng chứa FILESTREAM. Nếu các tệp trong vùng chứa FILESTREAM bị hỏng, chúng tôi không cần khôi phục toàn bộ cơ sở dữ liệu. Chúng tôi chỉ có thể khôi phục nhóm tệp FILESTREAM.
Trong bản demo này, tôi sẽ:
- Giải thích cách sao lưu toàn bộ cơ sở dữ liệu FS và chỉ sao lưu vùng chứa FILESTREAM.
- Giải thích cách khôi phục cơ sở dữ liệu hỗ trợ FILESTREAM.
- Cách khôi phục vùng chứa FILESTREAM trực tuyến và ngoại tuyến. Lưu ý:Phiên bản SQL Server Enterprise và phiên bản dành cho nhà phát triển hỗ trợ khôi phục ONLINE.
Thiết lập demo:
Trong bản demo này, tôi sẽ sử dụng:
- Cơ sở dữ liệu :SQL Server 2017
- Phần mềm :Studio quản lý SQL Server.
Sao lưu cơ sở dữ liệu đã bật FILESTREAM
Để chứng minh quá trình sao lưu, tôi đã tạo cơ sở dữ liệu hỗ trợ FILESTREAM có tên FileStream_Demo . Nó có một bảng FILESTREAM có tên Document_Content .
Sao lưu toàn bộ cơ sở dữ liệu
Sao lưu cơ sở dữ liệu hỗ trợ FILESTREAM là một quá trình đơn giản. Để tạo một bản sao lưu đầy đủ của nó, hãy thực thi tập lệnh T-SQL sau.
BACKUP DATABASE [FileStream_Demo] TO DISK = N'E:\Backups\FileStream_Demo.bak' WITH NOFORMAT, NOINIT, NAME = N'FileStream_Demo-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10 GO
Sau đây là nhật ký sao lưu được tạo bằng cách thực hiện lệnh sao lưu ở trên:
/*Begin Backup DataFile*/ Processed 568 pages for database 'FileStream_Demo', file 'FileStream_Demo' on file 1. /*Begin backup of FILESTREAM container*/ 10 percent processed. 20 percent processed. 30 percent processed. 40 percent processed. 50 percent processed. 60 percent processed. 70 percent processed. 80 percent processed. 90 percent processed. Processed 111106 pages for database 'FileStream_Demo', file 'Dummy-Documents' on file 1. /*Begin backup of FILESTREAM container*/ Processed 4 pages for database 'FileStream_Demo', file 'FileStream_Demo_log' on file 1. 100 percent processed. BACKUP DATABASE successfully processed 111677 pages in 18.410 seconds (47.391 MB/sec).
Như tôi đã đề cập ở phần đầu của bài viết, đầu tiên, máy chủ SQL thực hiện sao lưu tệp dữ liệu chính, sau đó là tệp dữ liệu thứ cấp và cuối cùng là Nhật ký giao dịch. Như bạn có thể thấy trong nhật ký sao lưu, Đầu tiên, sao lưu máy chủ SQL tệp dữ liệu chính, sau đó nhóm tệp FILESTREAM và dữ liệu được liên kết với nó và cuối cùng là nhật ký giao dịch.
Sao lưu vùng chứa FILESTREAM
Như tôi đã đề cập ở đầu bài viết, chúng ta cũng có thể tạo bản sao lưu của vùng chứa FILESTREAM. Để tạo bản sao lưu của vùng chứa FILESTREAM, hãy thực thi tập lệnh T-SQL sau.
BACKUP DATABASE [FileStream_Demo] FILEGROUP = N'Dummy-Documents' TO DISK = N'E:\Backups\FS_Container.bak' WITH NOFORMAT, NOINIT, NAME = N'FileStream_Demo-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10 GO
Khôi phục cơ sở dữ liệu đã bật FILESTREAM
Khi chúng tôi khôi phục cơ sở dữ liệu FILESTREAM, SQL sẽ khôi phục vùng chứa FileStream cùng với tất cả các tệp trong vùng chứa FILESTREAM.
Để khôi phục cơ sở dữ liệu, hãy thực hiện các tác vụ sau:
- Trong SSMS, nhấp chuột phải vào cơ sở dữ liệu và chọn Khôi phục cơ sở dữ liệu .
- Trong hộp thoại Khôi phục, chọn Thiết bị và nhấp vào Duyệt qua . Một hộp thoại khác sẽ mở ra, Trong hộp thoại, nhấp vào Thêm .
- Trong Định vị tệp sao lưu hộp thoại, điều hướng qua cấu trúc thư mục, nhấp vào một bản sao lưu thích hợp và nhấp vào OK .
- Sau khi tải thông tin sao lưu trong Bộ sao lưu để khôi phục chế độ xem lưới, nhấp vào OK để bắt đầu khôi phục quy trình.
Ngoài ra, bạn có thể khôi phục cơ sở dữ liệu bằng cách thực hiện lệnh sau:
USE [master] RESTORE DATABASE [FileStream_Demo] FROM DISK = N'E:\Backups\FileStream_Demo.bak' WITH FILE = 1, NOUNLOAD, STATS = 5 GO
Kịch bản khôi phục cơ sở dữ liệu đã bật FILESTREAM
Quá trình khôi phục nhóm tệp FILESTREAM giống như quá trình khôi phục nhóm tệp.
Để tạo kịch bản khôi phục, hãy tạo cơ sở dữ liệu hỗ trợ FILESTREAM có tên FileStream-Demo . Cơ sở dữ liệu có một bảng FILESTREAM có tên Document_Content . Chèn một số dữ liệu và tệp ngẫu nhiên trong Document_Content bảng.
Thực thi truy vấn sau để điền chi tiết các tệp được chèn vào bảng.
SELECT RootDirectory, FileName, FileAttribute, FileCreateDate, FileSize, FileStreamCol.PathName() AS FilePath FROM Document_Content order by filesize desc
Kết quả như sau:
Sau đây là ảnh chụp màn hình của vùng chứa FILESTREAM:
Đầu tiên, tạo một bản sao lưu đầy đủ của cơ sở dữ liệu. Đối với điều này, hãy thực hiện lệnh sau.
BACKUP DATABASE [FileStream_Demo] TO DISK = N'E:\Backups\Full_FileStream_Demo_20180810.bak' WITH NOFORMAT, NOINIT,NAME = N'FileStream_Demo-Full Database Backup'
Thứ hai, tạo bản sao lưu FILEGROUP của nhóm tệp FILESTREAM có tên Tài liệu giả bằng cách thực hiện lệnh sau:
BACKUP DATABASE [FileStream_Demo] FILEGROUP = N'Dummy-Documents' TO DISK = N'E:\Backups\FileStream_Filegroup_Demo.bak' WITH NOFORMAT, NOINIT, NAME = N'FileStream_Demo-Full FILEGROUP Backup'
Để tạo lỗi FILESTREAM, hãy xóa một số tệp khỏi vùng chứa FILESTREAM. Sau khi các tệp đó bị xóa, hãy thử truy xuất dữ liệu từ “Document_Content” bằng cách thực hiện lệnh sau:
Use FileStream_Demo Go select * from Document_Content
Bạn sẽ gặp lỗi sau:
Msg 233, Level 20, State 0, Line 122 A transport-level error has occurred when receiving results from the server. (provider: Shared Memory Provider, error: 0 - No process is on the other end of the pipe.)
Xem ảnh chụp màn hình sau:
Bây giờ, chúng ta cần khôi phục vùng chứa FILESTREAM để khắc phục lỗi này. Chúng tôi đã tạo một bản sao lưu và sao lưu đầy đủ của Tài liệu giả nhóm tệp.
Chúng tôi có thể khôi phục toàn bộ vùng chứa FILESTREAM bằng cách khôi phục nhóm tệp FILESTREAM. Tôi sẽ hiển thị:
- Khôi phục ngoại tuyến nhóm tệp FILESTREAM.
- Khôi phục trực tuyến nhóm tệp FILESTREAM.
Khôi phục ngoại tuyến Nhóm tệp vùng chứa FILESTREAM
Vì tôi đã xóa các tệp khỏi vùng chứa FILESTREAM, chúng tôi không cần khôi phục toàn bộ cơ sở dữ liệu. Do đó, thay vì khôi phục toàn bộ cơ sở dữ liệu, chúng tôi sẽ khôi phục nhóm tệp duy nhất. Để làm điều đó, trước tiên, hãy tạo bản sao lưu Tail-Log để nắm bắt các thay đổi dữ liệu chưa được sao lưu. Bản sao lưu Tail-log phải được thực hiện bằng cách sử dụng tùy chọn NORECOVERY để đưa cơ sở dữ liệu về trạng thái khôi phục và điều đó mang lại khả năng áp dụng các bản sao lưu trên cơ sở dữ liệu. Để làm điều đó, hãy thực hiện truy vấn sau:
backup log [FileStream_Demo] to disk ='E:\Backups\FileStream_Filegroup_Demo_Log_1.trn' With NORECOVERY
Sau khi tạo bản sao lưu Tail-log, cơ sở dữ liệu sẽ ở chế độ khôi phục. Bây giờ, chúng ta có thể áp dụng sao lưu FILEGROUP trên cơ sở dữ liệu với tùy chọn NORECOVERY. Đối với điều này, hãy thực hiện lệnh sau:
use master go RESTORE DATABASE [FileStream_Demo] FILE='Dummy-Documents' FROM DISK = N'E:\Backups\FileStream_Filegroup_Demo.bak' WITH NORECOVERY,REPLACE;
Bây giờ áp dụng sao lưu Nhật ký đuôi với tùy chọn PHỤC HỒI. Đối với điều này, hãy thực hiện lệnh sau:
RESTORE LOG [FileStream_Demo] FROM DISK = N'E:\Backups\FileStream_Filegroup_Demo_Log_1.trn'
Sau khi sao lưu khôi phục, cơ sở dữ liệu sẽ trực tuyến và tất cả các tệp sẽ được khôi phục trong vùng chứa FILESTREAM. Để xác minh nó, hãy thực hiện lệnh sau:
SELECT RootDirectory, FileName, FileAttribute, FileCreateDate, FileSize, FileStreamCol.PathName() AS FilePath FROM Document_Content order by filesize desc
Kết quả của truy vấn trên như sau:
Khôi phục trực tuyến nhóm tệp FILESTREAM
Sử dụng phiên bản doanh nghiệp máy chủ SQL, chúng tôi có thể khôi phục bản sao lưu khi cơ sở dữ liệu trực tuyến. Ví dụ:nếu tệp F1 của nhóm tệp phụ FG-1 bị hỏng, thì chúng tôi có thể khôi phục tệp F1 trong khi cơ sở dữ liệu vẫn trực tuyến. Trình tự khôi phục của khôi phục ngoại tuyến và khôi phục trực tuyến giống nhau.
Như đã đề cập ở trên, để thực hiện khôi phục trực tuyến nhóm tệp FILESTREAM, hãy tạo Tài liệu giả datafile ngoại tuyến. Đối với điều này, hãy thực hiện lệnh sau.
use master go Alter database [FileStream_Demo] MODIFY FILE (NAME='Dummy-Documents',OFFLINE)
Để xác minh trạng thái của tệp, hãy thực hiện truy vấn sau:
Use [FileStream_Demo] Go select File_id, type_desc,name, physical_name,state_desc,size from FileStream_Demo.sys.database_files
Kết quả như sau:
Chúng tôi đã sao lưu Tài liệu giả nhóm tệp. Do đó, khi tệp dữ liệu ngoại tuyến, hãy khôi phục bản sao lưu FILEGROUP trên cơ sở dữ liệu với tùy chọn NORECOVERY. Đối với điều này, hãy thực hiện lệnh sau:
use master go RESTORE DATABASE [FileStream_Demo] FILE='Dummy-Documents' FROM DISK = N'E:\Backups\FileStream_Filegroup_Demo.bak' WITH NORECOVERY,REPLACE;
Bây giờ, hãy tạo một bản sao lưu Nhật ký của cơ sở dữ liệu để đảm bảo rằng điểm mà tệp dữ liệu ngoại tuyến được ghi lại. Đối với điều này, hãy thực hiện lệnh sau:
backup log [FileStream_Demo] to disk ='E:\Backups\FileStream_Filegroup_Demo_Log1.trn'
Thực hiện lệnh sau để khôi phục bản sao lưu T-Log cuối cùng.
use master go RESTORE LOG [FileStream_Demo] FROM DISK = N'E:\Backups\FileStream_Filegroup_Demo_Log1.trn'
Khi bản sao lưu Nhật ký khôi phục, tất cả các tệp trong vùng chứa FILESTREAM sẽ được khôi phục và nhóm tệp sẽ trực tuyến. Để xác minh điều đó, hãy thực hiện truy vấn sau:
Use [FileStream_Demo] Go select File_id, type_desc,name, physical_name,state_desc,size from FileStream_Demo.sys.database_files
Kết quả như sau:
Sau khi sao lưu được khôi phục, cơ sở dữ liệu sẽ trực tuyến và tất cả các tệp sẽ được khôi phục trong vùng chứa FILESTREAM. Để xác minh nó, hãy thực hiện lệnh sau:
SELECT RootDirectory, FileName, FileAttribute, FileCreateDate, FileSize, FileStreamCol.PathName() AS FilePath FROM Document_Content order by filesize desc
Kết quả như sau:
Tóm tắt
Trong bài viết này, tôi đã giải thích:
- Cách sao lưu và khôi phục cơ sở dữ liệu hỗ trợ FILESTREAM và nhóm tệp FILESTREAM.
- Cách khôi phục nhóm tệp FILESTREAM trực tuyến và ngoại tuyến.