Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Lưu trữ tệp trong cơ sở dữ liệu SQL bằng FILESTREAM - Phần 1

FILESTREAM đã được Microsoft giới thiệu vào năm 2008. Mục đích là để lưu trữ và quản lý các tệp phi cấu trúc hiệu quả hơn. Trước khi FILESTREAM được giới thiệu, các phương pháp sau được sử dụng để lưu trữ dữ liệu trong máy chủ SQL:

  1. Các tệp không có cấu trúc có thể được lưu trữ trong cột VARBINARY hoặc IMAGE của bảng SQL Server. Cách tiếp cận này hiệu quả để duy trì tính nhất quán trong giao dịch và giảm độ phức tạp trong việc quản lý tệp, nhưng khi ứng dụng khách đọc dữ liệu từ bảng SQL, nó sẽ sử dụng bộ nhớ SQL dẫn đến hiệu suất kém.
  2. Thay vì lưu trữ toàn bộ tệp trong bảng SQL, hãy lưu trữ vị trí thực của tệp không có cấu trúc trong Bảng SQL. Cách tiếp cận này giúp cải thiện hiệu suất rất lớn, nhưng nó không đảm bảo tính nhất quán của giao dịch hơn nữa việc quản lý tệp cũng khó khăn.

Tính năng FILESTREAM rất hiệu quả vì nó cho phép lưu trữ các tệp BLOB trong hệ thống tệp NT và duy trì tính nhất quán của giao dịch. Khi một ứng dụng khách đọc dữ liệu từ vùng chứa FILESTREAM, thay vì sử dụng bộ nhớ của bộ đệm SQL Server, nó sử dụng bộ đệm hệ thống Nthe T để cải thiện hiệu suất.

FILESTREAM không phải là một kiểu dữ liệu. Đây là một thuộc tính có thể được chỉ định cho cột VARBINARY (MAX). Khi cột VARBINARY (MAX) được gán cho thuộc tính FILESTREAM, nó được gọi là cột FILESTREAM. Dữ liệu được lưu trữ trong cột FILESTREAM sẽ được lưu trữ trong hệ thống NT dưới dạng tệp đĩa và con trỏ của tệp được lưu trữ trong bảng. Cột VARBINARY (tối đa) với thuộc tính FILESTREAM được gán không có giới hạn lưu trữ 2 GB trong bảng. Do đó, chúng tôi cũng có thể lưu trữ các tệp lớn.

Trong bài viết này, tôi sẽ chứng minh như sau:

  1. Cách bật tính năng FILESTREAM.
  2. Cách tạo và định cấu hình nhóm tệp FILESTREAM và vùng chứa dữ liệu FILESTREAM.
  3. Cách lưu trữ và truy cập dữ liệu từ các bảng đã bật FILESTREAM.

Bản trình diễn:

Trong bản demo này, tôi sẽ sử dụng:

  1. Máy chủ Cơ sở dữ liệu :SQL Server 2017
  2. Phần mềm :SQL Server Management Studio
  3. Cơ sở dữ liệu :FileStream_Demo

Định cấu hình quyền truy cập FILESTREAM trong Cơ sở dữ liệu máy chủ SQL

Để định cấu hình FileStream trong SQL Server, hãy thực hiện các thay đổi sau đối với SQL Server.

  1. Bật tính năng FILESTREAM từ Trình quản lý cấu hình máy chủ SQL.
  2. Bật cấp truy cập teh FILESTREAM trên phiên bản SQL Server.
  3. Tạo nhóm tệp FILESTREAM và vùng chứa FileStream để lưu trữ dữ liệu BLOB.

Bật tính năng FILESTREAM

Để bật FileStream trên bất kỳ cơ sở dữ liệu nào, trước tiên hãy bật tính năng FileStream trên phiên bản SQL Server. Để làm điều đó, hãy mở trình quản lý cấu hình SQL Server, nhấp chuột phải vào Phiên bản SQL, chọn Thuộc tính , như thể hiện trong hình ảnh sau:

Một hộp thoại để định cấu hình thuộc tính máy chủ sẽ mở ra. Chuyển sang FILESTREAM chuyển hướng. Chọn Bật FILESTREAM để truy cập T-SQL . Chọn Bật FILESTREAM để truy cập I / O rồi chọn Cho phép ứng dụng khách từ xa truy cập vào dữ liệu FILESTREAM . Trong tên chia sẻ Windows hộp văn bản, cung cấp tên của thư mục để lưu trữ các tệp. Xem hình ảnh sau:

Nhấp vào OK và khởi động lại dịch vụ SQL.

Bật cấp độ truy cập FILESTREAM trên phiên bản máy chủ SQL

Sau khi tính năng FILESTREAM được bật, hãy thay đổi cấp độ truy cập FILESTREAM. Để thay đổi cấp độ truy cập FileStream, hãy thực hiện truy vấn sau:

EXEC sp_configure filestream_access_level, 2
RECONFIGURE

Trong truy vấn trên, các tham số bên dưới là giá trị hợp lệ:

0 nghĩa là hỗ trợ FILESTREAM cho phiên bản SQL bị vô hiệu hóa.

1 nghĩa là hỗ trợ FILESTREAM cho T-SQL được bật.

2 nghĩa là hỗ trợ FILESTREAM cho truy cập phát trực tuyến T-SQL và Win32 được bật.

Bạn có thể thay đổi cấp độ truy cập FILESTREAM bằng cách sử dụng SQL Server Management Studio. Để làm điều đó, hãy nhấp chuột phải vào kết nối SQL Server>> chọn Thuộc tính >> Trong hộp thoại thuộc tính máy chủ, chọn Cấp độ truy cập dòng tệp từ hộp thả xuống và chọn Đã bật toàn quyền truy cập , như thể hiện trong hình ảnh sau:

Sau khi tham số được thay đổi, hãy khởi động lại các dịch vụ SQL Server.

Thêm nhóm tệp FILESTREAM và tệp dữ liệu

Sau khi FILESTREAM được bật, hãy thêm nhóm tệp FILESTREAM và vùng chứa FILESTREAM.

Để làm điều đó, hãy nhấp chuột phải vào FileStream-Demo cơ sở dữ liệu>> chọn Thuộc tính >> Trong ngăn bên trái của Thuộc tính cơ sở dữ liệu hộp thoại, chọn Nhóm tệp >> Trong lưới FILESTREAM, nhấp vào Thêm nhóm tệp nút>> Đặt tên nhóm tệp là Tài liệu giả . Xem hình ảnh sau:

Sau khi nhóm tệp được tạo, trong hộp thoại Thuộc tính cơ sở dữ liệu, hãy chọn tệp và nhấp vào nút Thêm. Lưới tệp cơ sở dữ liệu cho phép. Trong cột Tên lôgic, hãy cung cấp tên, - Tài liệu giả . Chọn Dữ liệu FILESTREAM trong Loại tệp thả cái hộp xuống. Chọn Tài liệu giả trong Nhóm tệp cột. Trong Đường dẫn , cung cấp vị trí thư mục nơi các tệp sẽ được lưu trữ (E:\ Dummy-Documents). Xem hình ảnh sau:

Ngoài ra, bạn có thể thêm nhóm tệp FILESTREAM và vùng chứa bằng cách thực hiện Truy vấn T-SQL sau:

USE [master]
GO
ALTER DATABASE [FileStream_Demo] ADD FILEGROUP [Dummy-Documents] CONTAINS FILESTREAM
GO
ALTER DATABASE [FileStream_Demo] ADD FILE ( NAME = N'Dummy-Documents', FILENAME = N'E:\Dummy-Documents' ) TO FILEGROUP [Dummy-Documents]
GO

Để xác minh rằng vùng chứa FileStream đã được tạo, hãy mở Windows Explorer và điều hướng đến thư mục “E:\ Dummy-Document”.

Như trong hình trên, thư mục $ FSLOG và filestream.hdr tệp đã được tạo. $ FSLOG giống như T-Log của máy chủ SQL và filestream.hdr chứa siêu dữ liệu của FILESTREAM. Đảm bảo rằng bạn không thay đổi hoặc chỉnh sửa các tệp đó.

Lưu trữ tệp trong bảng SQL

Trong bản demo này, chúng tôi sẽ tạo một bảng để lưu trữ các tệp khác nhau từ máy tính. Bảng có các cột sau:

  1. RootDirectory ”Để lưu trữ vị trí tệp.
  2. Tên tệp ”Để lưu tên tệp.
  3. Thuộc tính tệp ”Để lưu trữ thuộc tính Tệp (Raw / Directory.
  4. FileCreateDate ”Để lưu trữ thời gian tạo tệp.
  5. Kích thước tệp tin ”Để lưu trữ Kích thước của tệp.
  6. FileStreamCol ”Để lưu trữ nội dung của tệp ở định dạng nhị phân.

Tạo Bảng SQL với cột FILESTREAM

Sau khi FILESTREAM định cấu hình, hãy tạo một bảng SQL với các cột FILESTREAM để lưu trữ các tệp khác nhau trong bảng máy chủ SQL. Như tôi đã đề cập ở trên, FILESTREAM không phải là một kiểu dữ liệu. Đây là một thuộc tính mà chúng tôi thêm vào cột varbinary (max) trong bảng đã bật FILESTREAM. Khi bạn tạo bảng hỗ trợ FILESTREAM, hãy đảm bảo rằng bạn thêm UNIQUEIDENTIFIER cột có ROWGUIDCOL DUY NHẤT thuộc tính.

Thực thi tập lệnh sau để tạo bảng hỗ trợ FILESTREAM:

Use [FileStream_Demo]
go
Create Table [DummyDocuments]
(
    ID uniqueidentifier ROWGUIDCOL unique NOT NULL,
    RootDirectory varchar(max),
    FileName varchar(max),
    FileAttribute varchar(150),
    FileCreateDate datetime,
    FileSize numeric(10,5),
    FileStreamCol varbinary (max) FILESTREAM
)

Chèn dữ liệu vào bảng

Tôi có WorldWide_Importors.xls tài liệu được lưu trữ trong máy tính tại vị trí “E:\ Documents”. Sử dụng OPENROWSET (Hàng loạt) để tải nội dung của nó từ đĩa vào VARBINARY (tối đa) Biến đổi. Sau đó, lưu trữ biến vào FileStreamCol (VARBINARY (max)) của cột DummyDocumen bảng t. Để làm điều đó, hãy chạy tập lệnh sau:

Use [FileStream-Demo]
Go
DECLARE @Document AS VARBINARY(MAX)
 
-- Load the image data
SELECT @Document = CAST(bulkcolumn AS VARBINARY(MAX))
      FROM OPENROWSET(
            BULK
            'E:\Documents\WorldWide_Importors.xls',
            SINGLE_BLOB ) AS Doc
            
-- Insert the data to the table           
INSERT INTO [DummyDocuments] (ID, RootDirectory,FileName, FileAttribute, FileCreateDate,FileSize,FileStreamCol)
SELECT NEWID(), 'E:\Documents','WorldWide_Importors.xls','Raw',getdate(),10, @Document

Truy cập dữ liệu FILESTREAM

Dữ liệu FILESTREAM có thể được truy cập bằng cách sử dụng T-SQL và API được quản lý. Khi cột FILESTREAM được truy cập bằng truy vấn T-SQL, cột này sử dụng bộ nhớ SQL để đọc nội dung của tệp dữ liệu và gửi dữ liệu đến ứng dụng khách. Khi cột FILESTREAM được truy cập bằng Win32 Managed API, nó không sử dụng bộ nhớ SQL Server. Nó sử dụng khả năng phát trực tuyến của hệ thống tệp NT mang lại lợi ích về hiệu suất.

Truy cập dữ liệu FILESTREAM bằng T-SQL

Như tôi đã đề cập ở đầu bài viết, FILESTREAM là một thuộc tính được gán cho một cột trong bảng có kiểu dữ liệu varbinary (max), do đó, nó có thể được truy cập giống như bất kỳ cột nào khác của bảng. Để truy xuất dữ liệu FILESTREAM cùng với tất cả thông tin của bảng, hãy thực hiện truy vấn dưới đây

Use [FileStream-Demo]
go
select RootDirectory,FileName,FileAttribute,FileCreateDate,FileSize,FileStreamCol from DummyDocuments

Dưới đây là đầu ra của truy vấn:

Như thể hiện trong hình trên, tài liệu “WorldWide_Importors.xls” đã được chuyển đổi thành BLOB được lưu trữ trong cột “FileStreamCol”.

Truy cập dữ liệu FILESTREAM bằng API được quản lý

Mặc dù truy cập FILESTREAM bằng Win32 API mang lại hiệu suất và các lợi ích khác, nhưng nó có các cú pháp khác và khó hơn các cú pháp T-SQL gây khó khăn cho việc truy cập dữ liệu. Đầu tiên, để định vị tệp trên kho dữ liệu FILESTREAM, chúng ta phải xác định đường dẫn hợp lý để xác định duy nhất tệp trong kho dữ liệu FILESTREAM. Chúng tôi có thể làm điều đó bằng cách sử dụng Tên đường dẫn () phương thức của cột FILESTREAM. Nó phân biệt chữ hoa chữ thường.

Sau khi truy xuất đường dẫn của Tệp, để truy cập, chúng tôi phải có được ngữ cảnh giao dịch bằng cách sử dụng Bắt đầu giao dịch phương pháp. Sau khi có được ngữ cảnh giao dịch, chúng tôi có thể truy cập nó bằng cách sử dụng SQLFileStream lớp học.

Đoạn mã dưới đây nhận được đường dẫn cục bộ đến WorldWide_Importors.xls tài liệu trong kho dữ liệu FILESTREAM.

SELECT 
      RootDirectory, 
	 FileName,
	 FileAttribute,
	 FileCreateDate,
	 FileSize,
      FileStreamCol.PathName() AS FilePath
FROM DummyDocuments

Đầu ra truy vấn:

Xóa tệp khỏi vùng chứa FILESTREAM

Xóa tệp rất đơn giản. Bạn cần chạy truy vấn xóa để xóa tệp khỏi bảng SQL đã bật FILESTREAM. Ngay cả khi bản ghi đã bị xóa khỏi các bảng, tệp sẽ có sẵn trong kho dữ liệu FILSTREAM về mặt vật lý. Nó sẽ bị xóa bởi Garbage Collector. Quá trình Garbage Collector thực thi khi sự kiện điểm kiểm tra xảy ra. Bằng cách đưa ra một điểm kiểm tra rõ ràng, bạn có thể xóa nó ngay lập tức sau khi xóa khỏi bảng.

Truy vấn xóa Tệp khỏi Bảng SQL:

Use [FileStream_Demo]
go
delete from DummyDocuments where ID='0D640ABC-8CF1-41E0-9FA8-28171047129F'

Tóm tắt

Trong bài viết này, tôi đã đề cập đến:

  1. Giới thiệu về FILESTREAM và lợi ích là gì.
  2. Cách bật tính năng FILESTREAM trên phiên bản máy chủ SQL.
  3. Tạo và định cấu hình kho dữ liệu FILESTREAM và Nhóm tệp.
  4. Thực hiện Chèn và Xóa tệp khỏi kho dữ liệu FILESTREAM.

Trong các bài viết tới, tôi sẽ giải thích:

  1. Cách sao lưu và khôi phục cơ sở dữ liệu đã bật FILESTREAM.
  2. Thiết lập sao chép và phân chia bảng trong các bảng FILESTREAM.

Hãy theo dõi!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. AI sẽ thay đổi việc phát triển và kiểm tra phần mềm như thế nào

  2. Giới thiệu về Mô hình Dữ liệu ER

  3. Kiểm tra cơ sở dữ liệu là gì và làm thế nào để thực hiện nó?

  4. Các giai đoạn tối ưu hóa và các cơ hội bị bỏ lỡ

  5. Xu hướng ScyllaDB - Cách người dùng triển khai cơ sở dữ liệu dữ liệu lớn theo thời gian thực