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

作者 | 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到底是什么?

真香,朕在看了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/517877.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Apache Flink 进阶入门(二):Time 深度解析

前言 Flink 的 API 大体上可以划分为三个层次:处于最底层的 ProcessFunction、中间一层的 DataStream API 和最上层的 SQL/Table API,这三层中的每一层都非常依赖于时间属性。时间属性是流处理中最重要的一个方面,是流处理系统的基石之一&am…

月活用户达7.55亿,阿里淘系如何在后流量时代引爆用户增长?

2019 年 8 月,阿里巴巴集团公布截至 2019 年 6 月 30 日止季度业绩。 财报显示,本季度阿里巴巴集团收入为 1149.24 亿元人民币,同比增长 42%。其中,淘宝、天猫在内的中国零售平台移动月活跃用户达 7.55 亿,较上一季度…

数组,三种初始化和内存分析

数组,三种初始化和内存分析 Java内存分析: 堆:存放new的对象和数组 ​ 可以被所有的线程共享,不会存放别的对象引用 栈:存放基本变量类型(会包含这个基本类型的具体数值) ​ 引用对象的变量&a…

Arthas 3.1.2 版本发布 | 增加 logger/heapdump/vmoption 命令

最近偶尔有用户反馈某些 HTTP 接口出现超时问题,而 web 服务端的 Trace 监控没有出现 http 返回值为 503 等异常情况。出现这种情况一般是web容器出现问题,客户端连 Arthas是Alibaba开源的Java诊断工具,深受开发者喜爱。 Github:h…

Linux 便笺技巧专栏

文章目录一、 vi 专栏二、固定ip设置2.1. 自动获取改为静态2.2. IDADDR获取2.3. GATEWAY获取2.4. 重新网卡2.5. 重新连接三、主机名调整3.1. 临时有效主机名3.2. 永久有效主机名四、防火墙调整4.1. 临时关闭防火墙4.2. 开机不启动防火墙五、shell脚本5.1. shell格式5.2. shell执…

刚刚,Python内幕被爆出!网友:请收下我的膝盖!

2020 年 5 月全国招收程序员 312761 人。2020 年 5 月全国程序员平均工资 14542 元,工资中位数 12500 元,其中 95% 的人的工资介于 5250 元到 35000 元。请问你拖后腿了吗?作为一名老码农,这次请收下我的膝盖!事情起因…

阿里99大促 | 模型识别背后的样本生成

背景 在上一篇文章详解阿里99大促活动页内容识别技术实现,我们介绍了在淘宝99大促中,我们使用了怎样的算法模型去识别并完成自动化测试的。 迫切解决的样本问题 淘宝大促有近百个模块、上千个页面,模块间具有相似性,并且模块内…

这6种编码方法,你掌握了几个?

阿里妹导读:Don Roberts 提出的一条重构准则:第一次做某件事时只管去做;第二次做类似的事时会产生反感,但无论如何还是可以去做;第三次再做类似的事时,你就应该重构。 编码也是如此,当多次编写…

扎根中国20年,F5“代码到用户”线上峰会盛大启幕

2020年5月20日,全球领先的多云应用服务厂商F5公司以线上峰会的形式开启了F5 2020 “代码到用户” 暨F5中国20周年纪念庆典,深入解读了F5“代码到用户” 的战略。F5全球首席执行官范仲林先生、F5全球首席科学家及首席技术官林耕先生、NGINX创始人Igor Sys…

Hadoop集群安装部署_伪分布式集群安装_01

文章目录一、配置基础环境1. 设置静态ip2. hostname3. firewalld4. ssh免密码登录5. JDK一、配置基础环境 1. 设置静态ip [rootbigdata01 ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33BOOTPROTO"static" IPADDR192.168.92.100 GATEWAY192.168.92.2 DNS1192.…

Hadoop集群安装部署_伪分布式集群安装_02

文章目录一、解压安装1. 安装包上传2. 解压hadoop安装包二、修改Hadoop相关配置文件2.1. hadoop-env.sh2.2. core-site.xml2.3. hdfs-site.xml2.4. mapred-site.xml2.5. yarn-site.xml2.6. workers三、格式化与启动集群3.1. 格式化HDFS3.2. 启动伪分布集群3.3. 异常解决方案3.4…

在 520 这天,竟然有人把 Docker讲清楚了? | 原力计划

作者 | 夏目 "责编 | 王晓曼头图 | CSDN下载自东方IC出品 | CSDN博客简介1、了解Docker的前生LXCLXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C中的NameSp…

为什么它有典型FaaS能力,却是非典型FaaS架构?

阿里妹导读:FaaS—Function as a service,函数即服务。它是2014年由于亚马逊的AWS Lambda的兴起,而被大家广泛认知。FaaS能力是NBF中的一项非常重要的能力,NBF是一个非典型的FaaS架构,但是具备了典型的FaaS能力。文章将…

如何解决90%的问题?10位阿里大牛公布方法

世界在变,技术在变,需求在变。 唯一不变的是变化。 面对变化,技术人如何在不确定性的世界中寻找最优解? 查理芒格说:“掌握一定数量的思维模型,能解决这世上90%的问题。”与其在重复的“增、删、改、查”…

Hadoop集群安装部署_分布式集群安装_01

文章目录1. 分布式集群规划2. 数据清理3. 基础环境准备4. 配置ip映射5. 时间同步6. SSH免密码登录完善7. 免密登录验证1. 分布式集群规划 伪分布集群搞定了以后我们来看一下真正的分布式集群是什么样的 看一下这张图,图里面表示是三个节点,左边这一个是…

今天,Python信息量很大!

小白程序员Python自学之痛:第一周找学习资源,第二周入门到放弃,第三周怀疑自己。明明10元钱就能搞定的事情,为什么要反反复复折磨自己呢?为了让用户用更优惠的价格买到优质的课程,CSDN和老师反复争取&#…

闲鱼如何利用端计算提升推荐场景的ctr

背景 闲鱼作为一个电商场景的app,最丰富的部分就是作为商品宝贝浏览承载的feeds,比如首页下面的宝贝信息流,搜索结果页以及详情页下面的猜你喜欢,这些feeds场景都少不了推荐算法在背后的支撑。 传统的推荐算法是依托于云上沉淀的…

Hadoop集群安装部署_分布式集群安装_02

文章目录一、上传与 解压1. 上传安装包2. 解压hadoop安装包二、修改hadoop相关配置文件2.1. hadoop-env.sh2.2. core-site.xml2.3. hdfs-site.xml2.4. mapred-site.xml2.5. yarn-site.xml2.6. workers2.7. 修改启动脚本三、同步初始化3.1. 安装包同步3.2. 主节点格式化HDFS3.3.…

重要的节日那么多,要及时「缓存」你们的珍贵时光

作者 | 后端学长责编 | Carol出品 | 程序员 cxuan缓存概述在很久很久以前人类和洪水作斗争的过程中,水库发挥了至关重要的作用 : 在发洪水时可以蓄水,缓解洪水对下游的冲击;在干旱时可以把库存的水释放出来以供人们使用。这里的水库就起着缓存…