作者 | ALEN İBRIÇ

译者 | 火火酱,责编 | Carol

封图 | CSDN 付费下载于视觉中国

在本文中,我将解释如何使用SQL Server FILESTREAM来存储非结构化数据。同时,还会介绍FILESTREAM的优缺点。

在SQL Server的早期版本中,非结构化数据的存储在维持结构化和非结构化数据间一致性、管理备份/还原过程、性能问题、可扩展性等方面提出了许多挑战。在SQL Server 2008之前的MSSQL早期版本中,存在各种用于存储非结构化数据的机制。这些信息通常被以文件的形式存储在共享文件夹中,其访问权限被授予了某些用户。

这些文件的UNC路径通常作为表(varchar (n))中的一列存储于数据库中,以便应用程序逻辑可以访问特定的文件。但文件的安全性、管理其访问权并对其进行维护方面存在一定问题。

后来的二进制大对象(Binary Large Objects,BLOB)概念在一定程度上有助于存储非结构化数据。这个概念的主要优点是数据库中的集成管理和事务一致性。在这种情况下,安全问题(以前的文件解决方案)得到了解决。但仍存在一些问题,即2GB的限制以及日志文件过载。

为了解决这些问题,SQL Server 2008首次引入了名为FILESTREAM的增强功能。

它不是VARBINARY (MAX)这样的数据类型,而是通过VARBINARY列设置的attribute/property,表明数据应该被直接存储在文件系统上。这些数据仍然是系统的组成部分,并保持事务一致性。

以下是FILESTREAM的一些特征:

  • 二进制数据作为单独的文件存储在数据库之外。

  • 可以通过WIN32 API对这些单独的文件进行操作。

  • T-SQL语句适用。

  • 通过FILESTREAM存储在文件系统中的对象已经取消了VARBINARY (MAX)列的2GB文件大小限制。

  • FILESTREAM还可以被用在压缩文件、磁盘、卷中。

要使用FILESTREAM,必须将其激活。FILESTREAM可在两个级别上启用。第一级是SQL Server级别。该级别在安装SQL Server时被启用。如果没这样做的话,可以选中SQL Server FILESTREAM选项卡上的复选框,通过SQL Server 配置管理器来启用(图1)。

  图1. 使用SQL Server 配置管理器在SQL Server级别启用FILESTREAM

启用FILESTREAM的第二个级别是SQL Server Instance(实例)级别。通过执行脚本1中提供的T-SQL脚本来实现。

EXEC sp_configure filestream_access_level, 2
RECONFIGURE

脚本1:在Server Instance 级别启用FILESTREAM

表 1 列出了filestream_access_level的可能值。

描述

0

禁用FILESTREAM 对此实例的支持.

1

启用FILESTREAM 进行Transact-SQL 访问.

2

启用FILESTREAM 进行Transact-SQL 和Win32 流访问.

表1. filestream_access_level的可能值

下一步是创建一个数据库,可以在其中创建将使用FILESTREAM的表。脚本2给出了一个T-SQL脚本示例,该脚本能够创建可以使用FILESTREAM的数据库。

CREATE DATABASE Test_FILESTREAM
ON
PRIMARY(
NAME=Test_FILESTREAM_Prmary,
FILENAME='d:\sqlbaza2019\mssql\data\FILESTREAM\Test_FILESTREAM.mdf'),
FILEGROUP FileStreamGroup CONTAINS FILESTREAM(
NAME=Test_FILESTREAM_FM,
FILENAME='d:\sqlbaza2019\mssql\data\FILESTREAM\Test_FILESTREAM_FM')
LOG ON (
NAME=Test_FILESTREAM_Log,
FILENAME='d:\sqlbaza2019\mssql\data\FILESTREAM\Test_FILESTREAM.log')

脚本2:创建可以使用FILESTREAM的数据库的示例

在文件系统上执行脚本2将创建一个$ FSLOG文件夹和文件filestream.hdr。该filestream.hdr文件是FILESTREAM容器的头文件。

下一步要创建一个具有列VARBINARY (MAX)和FILESTREAM属性(脚本3)的表。

USE Test_FILESTREAM
CREATE TABLE [dbo].[Fajlovi]
(
ID UNIQUEIDENTIFIER NOT NULL ROWGUIDCOL PRIMARY KEY,
Fajl VARBINARY(MAX) FILESTREAM DEFAULT NULL
)

脚本3. 使用VARBINARY (MAX) FILESTREAM 列创建表

仍然需要将记录插入到新创建的表中(脚本4)。

INSERT INTO Fajlovi
VALUES (newid(), cast('My test FIESTREAM-a' as varbinary(max)))

脚本4.使用 VARBINARY (MAX) FILESTREAM 列将记录插入到表中

用脚本4插入记录还将在文件系统上创建一个新文件夹。

可以通过执行脚本5从具有VARBINARY (MAX) FILESTREAM列的表中获取记录。

select * from [Test_FILESTREAM].[dbo].[Fajlovi]

脚本5. 使用VARBINARY (MAX) FILESTREAM 列从表中查看记录

执行脚本5的结果如图2所示。

图2. 具有VARBINARY (MAX) FILESTREAM列的表中的纪录

FILESTREAM列中的每个单元格都是一个与其关联的文件系统上的文件路径。要想读取路径的话,需要在T-SQL语句中使用varbinary (max)列的PathName属性。脚本6提供了如何读取varbinary (max)列文件路径的示例。

DECLARE @filePath varchar(max)
SELECT @filePath = Fajl.PathName()
FROM dbo.Fajlovi
WHERE ID = 'F9A149D0-F5F0-4FC5-9F59-1D27E4D10C1D'
PRINT @filepath

脚本6. 读取文件系统上的FILESTREAM 文件路径的示例

可以使用T-SQL处理FILESTREAM数据,但这是一个更自然的MS Visual Studio环境。通过System.Data.SqlTypes.SqlFileStream 类,可以在应用程序逻辑中使用FILESTREAM功能。为了保持数据的一致性,每个SQL FILESTREAM操作都必须是事务的一部分。MARS(多个活动结果集Multiple Active Result Sets)连接具有批处理事务的特殊规则,而T-SQL BEGIN TRANSACTION语句违反了这些规则。为了避免这个问题,应用程序客户端应该使用合适的事务管理API来表示类System.Data.SqlClient.SqlTransaction。

为了允许事务访问FILESTREAM数据文件系统,需要使用T-SQL函数GET FILESTREAM TRASACTION CONTEXT()来提供表示特定会话(C # code 1)中当前事务的令牌。

SqlConnection sqlConnection = new SqlConnection(
"Integrated Security=true;server=(local)");
SqlCommand sqlCommand = new SqlCommand();
sqlCommand.Connection = sqlConnection;
SqlTransaction transaction = sqlConnection.BeginTransaction("mainTranaction");
sqlCommand.Transaction = transaction;
sqlCommand.CommandText =
"SELECT GET_FILESTREAM_TRANSACTION_CONTEXT()";
Object obj = sqlCommand.ExecuteScalar();
byte[] txContext = (byte[])obj;

C # code 1. 使用 GET_FILESTREAM_TRASACTION_CONTEXT () 函数

这样一来,事务已启动,但还没有提交或回滚。使用FILESTREAM数据的多个操作可以在一个事务中执行。在C # code 2中给出了使用Win32 API的数据输入代码的示例,其中sqlFileStream对象最初是基于System.Data.SqlType类创建的。

SqlFileStream sqlFileStream = new SqlFileStream(filePath, txContext, FileAccess.ReadWrite);
byte[] buffer = new byte[512];
int numBytes = 0;
//Write string, "FILESTREAM test data" in FILESTREAM.
string someData = "FILESTREAM test data";
Encoding unicode = Encoding.GetEncoding(0);
sqlFileStream.Write(unicode.GetBytes(someData.ToCharArray()),0,someData.Length);

C # code 2. 在FILESTREAM中输入数据的示例代码

C # code 3中给出了使用Win32 API读取FILESTREAM数据的示例代码。这里使用的是在c# code 1示例开始时创建的同一个sqlFileStream对象。

sqlFileStream.Seek(0L, SeekOrigin.Begin);
numBytes = sqlFileStream.Read(buffer, 0, buffer.Length);
string readData = unicode.GetString(buffer);
if (numBytes != 0)
Console.WriteLine(readData);

C # code 3. 读取FILESTREAM数据的示例代码

在完成FILESTREAM注册事务(C # code 1)并读取FILESTREAM数据(C # code 2)之后,sqlFileStream对象(在C # code 1示例的开头基于System.Data.SqlTypes.SqlFileStream类创建的)必须关闭并提交事务(C # code 4)。sqlCommand对象是在示例C # code1的开头创建的。

sqlFileStream.Close();
sqlCommand.Transaction.Commit();

C # code 4. 关闭sqlFileStream对象并提交事务

在图3中给出了VARBINARY (MAX)和FILESTREAM被用于存储非结构化数据和使用T-SQL 或Win32访问数据时数据加载性能的对比图。

图3.不同大小的 BLOB的负载性能

还应该注意,FILESTREAM也被用于其他SQL Server技术中,例如FileTable和In-Memory OLTP。

最后

与其他技术一样,FILESTREAM也有其优缺点。

优点:

  • 作为FILESTREAM的一部分创建的文件由SQL Server本身在其自己的文件组中进行管理,在这些文件组中可以与其他SQL Server数据一起进行备份和还原。

  • 读写这些文件是数据库事务的一部分。

  • 可以存储非常大的BLOB对象。

缺点:

  • FILESTREAM数据只能被存储在本地磁盘卷中。

  • 数据库快照中不支持。

  • 数据库镜像不支持。

  • 不支持透明数据加密。

  • 不能与表值参数一起使用。

原文链接:https://www.experfy.com/blog/how-to-use-sql-server-filestream-to-store-unstructured-data

本文为 CSDN 翻译,转载请注明出处。

推荐阅读

  • 对不起,我把APP也给爬了

  • 震惊!阿里的程序员竟被一个简单的 SQL 查询难住了!

  • 巧用 Trie 树,实现搜索引擎关键词提示功能

  • 第一个"国产"Apache 顶级项目 Kylin,了解一下!| 原力计划

  • 华为 5G、阿里检测病毒算法、腾讯 AI 一分钟诊断,国内抗疫科技大阅兵!

  • 超级账本Hyperledger Fabric中的Protobuf到底是什么?

真香,朕在看了!

如何使用 SQL Server FILESTREAM 存储非结构化数据?这篇文章告诉你!相关推荐

  1. 如何使用 SQL Server FILESTREAM 存储非结构化数据?

    作者 | ALEN İBRIÇ 译者 | 火火酱,责编 | Carol 封图 | CSDN 付费下载于视觉中国 在本文中,我将解释如何使用SQL Server FILESTREAM来存储非结构化数据. ...

  2. minio 并发数_开源数据存储项目Minio:提供非结构化数据储存服务

    Minio是一个在Apache Licence 2.0下发布的对象存储服务器.官网:https://minio.io.它与Amazon S3云存储服务兼容.Minio最适合存储非结构化数据,如照片.视 ...

  3. 【C/C++13】天气APP:数据挖掘/HTTP协议/非结构化数据存储(filetoblob.cpp),数据管理/监控告警(hsmtable.cpp,tbspaceinfo.cpp)

    文章目录 1. 数据挖掘:/etc/rc.local,sudo su 2.HTTP协议:优先wget 3.非结构化数据存储:blob,pzhrain24file 4.数据管理子系统:数据字典表 5.监 ...

  4. 非结构化数据的存储与查询

    当今信息化时代充斥着大量的数据.海量数据存储是一个必然的趋势.然而数据如何的存储和查询,尤其是当今非结构化数据的快速增长,对其数据的存储,处理,查询.使得如今的 关系数据库存储带来了巨大的挑战.分布存 ...

  5. 非结构化文件转移服务器,非结构化数据存储管理方法,服务器和系统 Unstructured data storage management method, and a system server...

    摘要: 本文提供一种非结构化数据存储管理方法,服务器和系统,解决现有技术中非结构化存储管理系统无法支撑大量的小文件及其元数据的存储和快速访问的问题. This article provides a m ...

  6. 传统存储方式_海量非结构化数据存储方案

    方案背景 数字化转型推动着数据的快速增长.新摩尔定律表明,全球数据总量每过 18 个月就会增长一倍,预计到 2020年全球数据总量将达到 3,5000EB.其中,在高速增长的数据中,非结构化数据占比超 ...

  7. 非结构化数据存储方案

    ceph 官方网站:http://docs.ceph.org.cn/ 简单介绍: Ceph是一个开源的分布存储系统,同时提供对象存储.块存储和文件存储.linux内核2.6.34将ceph加入到内核中 ...

  8. NetApp FAS 存储管理软件,海量非结构化数据存储

    NetApp FAS 存储管理软件,海量非结构化数据存储 在 NetApp® ONTAP® 数据管理软件的支持下,帮助您构建简单.安全且值得信赖的存储基础架构.NetApp FAS 存储阵列可让客户同 ...

  9. MaxCompute(ODPS)上处理非结构化数据的Best Practice

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 随着MaxCompute(ODPS)2.0的上线,新增的非结构化数据处理框架也推出一系列的介绍文章,包括 MaxCom ...

最新文章

  1. UNIX重定向--dup(2)函数
  2. select下拉框赋值和取值
  3. P3384 【模板】树链剖分
  4. C语言指针学习(续)
  5. 数字图像处理与机器视觉光盘资料_机器视觉——数字图像处理知识点总结
  6. vector 插入_Java学习五分钟系列:对比Vector、ArrayList、LinkedList
  7. 轻松实现一个操作ini文件的类
  8. 全网最详细的idea安装教程
  9. LoadRunner去除事物中的程序的执行时间
  10. ASP.NET中 CheckBox(复选框)的使用
  11. 设计模式之生成器模式
  12. 单片机——软件部分开发过程介绍
  13. 跟兄弟连学PHP PDF 分享
  14. SVN下载安装及入门使用教程,详细到不能再详细了
  15. unity广告投放技巧_是否需要快速投放动画广告系列? 只要在Unity中做到
  16. 用c语言实现矩阵的转置算法,C++实现矩阵原地转置算法
  17. 赛灵思 Xilinx Versal 自适应计算加速平台嵌入式设计教程
  18. python的内置函数
  19. 音乐服务器制作教程,分享硬盘中的音乐 DLNA服务搭建教程
  20. linux键盘模拟程序,linux下模拟键盘的几种方法

热门文章

  1. 怎么从计算机上删除东西吗,怎么在电脑中删除不想要的软件
  2. opencv4.5.0安装包_UG NX12.0 软件介绍(附安装包)
  3. mysql数据库二进制_Mysql数据库简单安装(二进制)
  4. svn mysql认证_SVN基于MySQL认证
  5. fabric shim安装合约_智能合约简介_智能合约开发_Hyperledger Fabric_开发指南_区块链服务 BaaS - 阿里云...
  6. 名校博士生被电信诈骗10多万,却被嘲“博士也会被骗书白读了”,学校发声!...
  7. 做世界首富的妻子,是一种怎样的体验?
  8. 首批国家应用数学中心:广东独占2家
  9. 胡椒“辣”味是怎样炼成的
  10. 计算机专业太难不适合女生学?来看 N 多小姐姐的回应