Bối cảnh
Chúng tôi đang phát triển một hệ thống với cơ sở dữ liệu lớn ở phía dưới. Nó là một cơ sở dữ liệu MS SQL chạy trên SQL Server 2008 R2. Tổng kích thước của cơ sở dữ liệu là khoảng 12 GB.
Trong số này, khoảng 8,5 GB nằm trong một bảng BinaryContent
. Như tên cho thấy, đây là một bảng nơi chúng tôi lưu trữ các tệp đơn giản, dưới bất kỳ hình thức nào, trực tiếp trong bảng dưới dạng BLOB. Gần đây, chúng tôi đã thử nghiệm khả năng di chuyển tất cả các tệp này ra khỏi cơ sở dữ liệu vào hệ thống tệp bằng cách sử dụng FILESTREAM.
Chúng tôi đã thực hiện các sửa đổi cần thiết cho cơ sở dữ liệu của mình mà không gặp sự cố nào và hệ thống của chúng tôi vẫn hoạt động tốt sau khi di chuyển. Các BinaryContent
bảng trông gần như thế này:
CREATE TABLE [dbo].[BinaryContent](
[BinaryContentID] [int] IDENTITY(1,1) NOT NULL,
[FileName] [varchar](50) NOT NULL,
[BinaryContentRowGUID] [uniqueidentifier] ROWGUIDCOL NOT NULL
) ON [PRIMARY] FILESTREAM_ON [FileStreamContentFG]
ALTER TABLE [dbo].[BinaryContent] ADD [FileContentBinary] [varbinary](max) FILESTREAM NULL
ALTER TABLE [dbo].[BinaryContent] ADD CONSTRAINT [DFBinaryContentRowGUID] DEFAULT (newsequentialid()) FOR [BinaryContentRowGUID]
Với mọi thứ nằm trong PRIMARY
nhóm tệp, ngoại trừ trường FileBinaryContent
nằm trong nhóm tệp riêng biệt FileStreamContentFG
.
Kịch bản
Từ quan điểm của một nhà phát triển, chúng tôi thường muốn có một bản sao mới của cơ sở dữ liệu từ môi trường sản xuất của chúng tôi, để có thể làm việc với dữ liệu mới nhất. Trong những trường hợp đó, chúng tôi hiếm khi quan tâm đến các tệp được lưu trữ trong BinaryContent (hiện đang sử dụng FILESTREAM).
Chúng tôi có điều này gần như làm việc như chúng tôi muốn. Chúng tôi sao lưu cơ sở dữ liệu, không có luồng tệp như thế này:
BACKUP DATABASE FileStreamDB
FILEGROUP = 'PRIMARY'
TO DISK = 'c:\backup\FileStreamDB_WithoutFS.bak' WITH INIT
Và khôi phục nó như thế này:
RESTORE DATABASE FileStreamDB
FROM DISK = 'c:\backup\FileStreamDB_WithoutFS.bak'
Điều này có vẻ hoạt động tốt, và hệ thống của chúng tôi hoạt động miễn là chúng tôi tránh các phần sử dụng FileBinaryContent
trường. Ví dụ, chúng tôi có thể chạy truy vấn sau mà không gặp sự cố:
SELECT TOP 10 [BinaryContentID],[FileName],[BinaryContentRowGUID]
--,[FileContentBinary]
FROM [dbo].[BinaryContent]
Đương nhiên, nếu tôi không bình luận dòng trên, bao gồm FileContentBinary
trong truy vấn, tôi gặp lỗi:
Dữ liệu đối tượng lớn (LOB) cho bảng "dbo.BinaryContent" nằm trong nhóm tệp ngoại tuyến ("FileStreamContentFG") không thể truy cập được.
Xử lý hệ thống của chúng tôi các file mà nội dung được thiết lập để null
, vì vậy những gì tôi sẽ thích làm là một cái gì đó như thế này:
UPDATE [dbo].[BinaryContent]
SET [FileContentBinary] = null
Nhưng điều này tất nhiên mang lại cho tôi lỗi tương tự như trên. Tại thời điểm này tôi bị mắc kẹt.
Câu hỏi
Có cách nào để tôi có thể khôi phục cơ sở dữ liệu mà không phải khôi phục mọi thứ từ FileStreamContentFG
nhóm tệp không? Hoặc bằng cách cập nhật các giá trị thành null khi tôi đang thử ở trên hoặc mặc định thành null khi tệp bị thiếu hoặc một cái gì đó?
Hay có lẽ tôi đang tiếp cận vấn đề một cách sai lầm?
Bản chất tôi là một nhà phát triển và không có nhiều kiến thức như một DBA, vì vậy, xin lỗi nếu tôi đang xem xét một số điều tầm thường ở đây.