有效利用SQL Server容器的价值用例及方法Word格式.docx
- 文档编号:848146
- 上传时间:2023-04-29
- 格式:DOCX
- 页数:19
- 大小:25.90KB
有效利用SQL Server容器的价值用例及方法Word格式.docx
《有效利用SQL Server容器的价值用例及方法Word格式.docx》由会员分享,可在线阅读,更多相关《有效利用SQL Server容器的价值用例及方法Word格式.docx(19页珍藏版)》请在冰点文库上搜索。
容器可以被保存并且作为“镜像”被复用。
镜像可以保存在一个共享的仓库中。
1
关系型数据库容器和SQLServerMySQL和Postgres属于DockerHub中最受欢迎的容器镜像之列。
数据库容器被用来构建相同的、隔离的、沙箱化的环境来进行开发、测试。
数据可以放在容器内,也可以挂载(mount)上去。
SQLServer容器是基于微软共享DLL架构的SQLServer实例,这个架构在过去十年中为同一个主机上运行多SQLServer实例提供支持。
容器提供额外的进程和用户隔离和SQLServer配置,用户可以通过SQLManagementStudio或其他工具来访问。
一旦构建完成,容器可以保存为镜像,使用镜像来帮助团队在一个共享主机上构建多个相同实例。
容器特有的优势包括:
速度:
SQLServer容器可以在数秒内提供服务,并为经常需要停用和快速替换实例的开发和测试人员提供有效的支持。
高效:
多个SQLServer容器可高效地在同一共享主机上运行,并且支持合并多个虚拟机为单个共享虚拟机来提供给开发测试团队,这相应节省了许可证(license)和维护的成本。
持续集成(CI)、持续交付(CD)支持:
SQLServer容器提供自动增加挂载(mount)数据库的支持、构建时运行配置脚本、以及持续集成和持续发布过程所需要的自动化构建支持。
高可用(HA)、灾备(DR)支持:
SQLServer容器支持集成管理数据库副本、快照、镜像的第三方系统,并花费大量工作来证明一系列操作的效用。
下面会详细介绍。
微软在2016年下半年准备实现WindowsServer对Docker的支持。
微软所设计的特点是可以支持WindowsServer2016“内核”或无输出界面的Nano服务器。
有趣的是微软闭口不言WindowsServer2016对SQLServer容器的支持,今年春天演示的第一个SQLServer容器也是运行在将来的SQLServer的Linux移植版上的!
这意味着SQLServer可能倾向于支持Linux主机而不是Windows容器。
这可以理解,毕竟微软选择实现Linux风格的容器和应用配置。
微软的WindowsServer2016容器被设计为兼容.NET、Windows控制台应用和服务所在的shell容器。
然而,SQLServer和其他Windows应用并不适合在shell中进行管理。
WindowsServer2016上的SQLServer容器会需要使用SQLManagementStudio或其他工具来运行脚本或增加、挂载数据库。
简单来说,SQLServer容器需要这些手动操作,阻碍了容器所提供的的高速和自动化。
幸运的是,对基于Docker的开源项目移植的SQLServer容器感兴趣的开发人员可以找到微软之外的实现。
WinDocks是一个由前微软工程师组建的初创组织,他们已经为Windows8、Windows10、WindowsServer2012、WindowsServer2016发布了Docker开源项目的移植版。
WinDocks支持SQLServer2008(及r2)、2012、2014和2016的所有版本。
WinDocks为Windows添加容器的支持,使用户可以在容器中使用SQLServer的许可证。
本文以WinDocks社区版本为基础,可以免费获得这个版本。
数据持久化和SQLServer容器
SQLServer容器和SQLServer实例在使用上没有区别,所以需要选择本地数据或挂载的数据库。
WinDocksSQLServer容器支持使用ADDDB命令来复制一个数据库到容器中,而MOUNTDB命令支持挂载本地或网络上的数据库。
ADDDB复制数据库(Primary、Secondary和日志文件)到容器中,并在容器启动时追加,在容器停止时剥离。
SQLServer容器提供命名空间隔离,所以多个相同实例可以在相同主机上的容器中运行而无需考虑命名和用户冲突。
一旦创建完成,容器和其追加的数据库可以被保存为新镜像,之后开发和测试人员可以方便地根据需求生成实例。
容器可以在数秒内实例化,具体速度取决于数据库的大小和数量。
这是支持开发和测试的一种常用方式,一些用户在容器中增加30个或更多的数据库也能拥有良好的性能。
“容器内”数据和本地添加到实例中的数据是一样的。
容器拥有这些数据,并将它们持久化在容器的文件系统中,同时受到容器宕机的影响。
数据库可以通过SQLServerManagementStudio或其他标准工具来访问。
下面是一个DockerFile使用ADDDB的例子,它由两个命名的数据库组成,包含一个primary数据库文件和多个secondary数据库文件:
FROMMSSQL-2016
ADDDBdbnamePrimarydb.mdfSecondarydb.ndfSecondarydb.ndf
ADDDBdbname2Primarydb.mdfSecondarydb.ndf
ADDDB将数据库复制到容器内,MOUNTDB支持挂载本地或网络上的数据库。
WinDocks支持容器独立生成的挂载点。
在这方面,WinDocks反映了将来Docker设计的方向。
使用MOUNTDB让数据库在容器启动时挂载并追加,并在容器停止时卸载并剥离。
每个数据库只支持一次挂载。
与容器使用ADDDB不同,挂载的数据库不会被放入SQLServer容器镜像中。
为了支持挂载在多个容器上,数据库必须建立副本并创建或克隆多个挂载点。
下面是MOUNTDB使用本地和网络数据库的一个例子:
MOUNTDBdbnamec:
\path\Primarydb.mdf
MOUNTDBdbname2\networkpath\dbname2.mdf\networkpath\dbname2.ndf
构建SQLServer
容器下面的例子描述了使用ADDDB构建SQLServer容器的过程:
第一步:
打开一个新的命令行窗口
第二步:
输入>
dockerbuildc:
\Windocks\samples\Test1WinDocks客户端返回包含容器ID、端口和SQLServersa密码的字符串。
第三步:
>
dockerstart,其中containerID可以只使用容器ID的一部分。
Docker命令和返回输出如下图所示。
每个容器都是完全隔离的SQLServer实例,并且有命名空间隔离,可以通过SQLServerManagementStudio访问。
在这个例子中,数据库Adventureworks被复制到容器内,并在容器启动时被追加。
数据库的schema和设计可以被更新,一个新的SQLServer镜像会在容器停止后被创建。
整个团队可以在一个共享的WinDocks主机上使用这个SQLServer镜像。
2
这个流程展示了在相同独立容器中快速共享SQLServer实例的普及。
一个SQLServer变更脚本可以根据需求被导出,用来更新源数据库。
容器和数据库克隆在使用大型数据库时数据库克隆非常有用,它支持发布多个挂载了克隆数据库的容器,用来开发或测试(一些克隆数据库还是可写的)。
WinDocks是一个可扩展的系统,它支持管理进程介入创建快照和克隆过程。
对增加快照和克隆的支持是由管理员提供的,管理员可以选择在WinDocks的node.cfg文件中启用“特权”命令。
在下面的例子中我们使用一个简单的“copy”命令来展示这个过程。
Dockerfile可以定义包含挂载了克隆数据库的SQLServer容器。
注意容器中环境变量的使用。
今年早些时候WinDocks与NetApp合作探索使用容器来集成NetApp的SnapClone进程(SDCLI.exe)。
结果令人满意,仅一步就在50秒内部署了挂载750G克隆数据库的SQLServer容器!
SQLServer容器对遗留项目的支持
用户对Windows容器的兴趣正快速上涨,一个针对WinDocks社区版下载者的调查显示了一个惊人的使用范围,最流行的还是用它来进行开发和测试,但是为了支持遗留项目如SAP和微软Dynamics的情况也有很多。
在这些案例中,SQLServer后端被容器化,并且相关支撑环境也被简化。
集成SQLServer和.Net容器以及现存架构
幸运的是,容器对.Net应用提供完美支持,并且集成SQLServer和.Net容器环境是很直截了当的。
ASP.NET架构定义了XML文件、web.config的使用,从而定义.NET应用和SQLServer容器间的配置和链接字符串。
这里我们使用WinDocks中位于\windocks\samples\testdotnet目录的示例.NET应用来举个例子。
使用记事本打开web.config,配置“连接字符串”,指向SQLServer容器的主机地址、端口和SQL认证信息。
使用运行中的SQLServer容器信息修改主机名(如果需要),端口和SQLServersa密码。
保存并关闭文件(检查下,不要保存成.txt文件)。
并运行:
打开浏览器,访问主机地址和端口来查看集成的应用。
还有另一种方法集成容器和DNS命名服务。
这个方法是在构建时使用WindowsNETSH工具将容器动态分配到已知IP地址。
结论SQLServer容器利用经过微软验证的共享DLL架构来提供在共享主机上SQLServer实例的实践支持。
流行的用例是在开发和测试环节,但有部分是用来使用容器化SQLServer后端来测试遗留项目(主要是SAP和微软Dynamics)。
对虚拟机需求数量的降低各有不同,但用户报告平均能有3-5x的减少,同时也显著节省许可证和主机维护的开销。
由于更新会在容器刷新时自动传播,主机的维护也得到简化。
这里提到的例子关注于数据库引擎,若要探索容器对SSIS和其他SQLServer服务的支持,仍需做更多的工作。
其他正在探索的有前景的使用场景包括迁移工作负荷、高可用、以及灾难恢复。
容器的速度和可移植性使得这些更加可行、可实践、也更容易被测试。
额外的时间和测试也会有助于回答SQLServer容器是否做好了运行在生产环境的准备。
鉴于微软没有明确计划,SQLServer容器在WindowsServer2016不太可能得到实践级支持。
既然WindowsServer2016不支持,那么理想的容器支持会是将来的SQLServer的Linux移植版,我们期待在2017中的进展。
SQL中GroupBy的使用示例详解
1、概述
“GroupBy”从字面意义上理解就是根据“By”指定的规则对数据进行分组,所谓的分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理。
2、原始表
3、简单GroupBy
示例1
select类别,sum(数量)as数量之和
fromA
groupby类别
返回结果如下表,实际上就是分类汇总。
4、GroupBy和OrderBy
示例2
select类别,sum(数量)AS数量之和
orderbysum(数量)desc
返回结果如下表
在Access中不可以使用“orderby数量之和desc”,但在SQLServer中则可以。
5、GroupBy中Select指定的字段限制
示例3
select类别,sum(数量)as数量之和,摘要
orderby类别desc
示例3执行后会提示下错误,如下图。
这就是需要注意的一点,在select指定的字段要么就要包含在GroupBy语句的后面,作为分组的依据;
要么就要被包含在聚合函数中。
6、GroupByAll
示例4
select类别,摘要,sum(数量)as数量之和
groupbyall类别,摘要
示例4中则可以指定“摘要”字段,其原因在于“多列分组”中包含了“摘要字段”,其执行结果如下表
“多列分组”实际上就是就是按照多列(类别+摘要)合并后的值进行分组,示例4中可以看到“a,a2001,13”为“a,a2001,11”和“a,a2001,2”两条记录的合并。
SQLServer中虽然支持“groupbyall”,但MSQLServer的未来版本中将删除GROUPBYALL,避免在新的开发工作中使用GROUPBYALL。
Access中是不支持“GroupByAll”的,但Access中同样支持多列分组,上述SQLServer中的SQL在Access可以写成
select类别,摘要,sum(数量)AS数量之和
groupby类别,摘要
7、GroupBy与聚合函数
在示例3中提到groupby语句中select指定的字段必须是“分组依据字段”,其他字段若想出现在select中则必须包含在聚合函数中,常见的聚合函数如下表:
函数作用支持性
sum(列名)求和
max(列名)最大值
min(列名)最小值
avg(列名)平均值
first(列名)第一条记录仅Access支持
last(列名)最后一条记录仅Access支持
count(列名)统计记录数注意和count(*)的区别
示例5:
求各组平均值
select类别,avg(数量)AS平均值fromAgroupby类别;
示例6:
求各组记录数目
select类别,count(*)AS记录数fromAgroupby类别;
示例7:
8、Having与Where的区别
where子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,where条件中不能包含聚组函数,使用where条件过滤出特定的行。
having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件过滤出特定的组,也可以使用多个分组标准进行分组。
示例8
select类别,sum(数量)as数量之和fromA
havingsum(数量)>
18
示例9:
Having和Where的联合使用方法
select类别,SUM(数量)fromA
where数量gt;
8
havingSUM(数量)gt;
10
9、Compute和ComputeBy
select*fromAwhere数量>
8
执行结果:
示例10:
Compute
select*
where数量>
computemax(数量),min(数量),avg(数量)
执行结果如下:
compute子句能够观察“查询结果”的数据细节或统计各列数据(如例10中max、min和avg),返回结果由select列表和compute统计结果组成。
示例11:
ComputeBy
orderby类别
computemax(数量),min(数量),avg(数量)by类别
示例11与示例10相比多了“orderby类别”和“...by类别”,示例10的执行结果实际是按照分组(a、b、c)进行了显示,每组都是由改组数据列表和改组数统计结果组成,另外:
compute子句必须与orderby子句用一起使用
compute...by与groupby相比,groupby只能得到各组数据的统计结果,而不能看到各组数据
在实际开发中compute与computeby的作用并不是很大,SQLServer支持compute和computeby,而Access并不支持
SQLServer2014数据内存优化表详解
不同于disk-basedtable,内存优化表驻留在内存中,使用Hekaton内存数据库引擎实现。
在查询时,从内存中读取数据行;
在更新时,将数据的更新直接写入到内存中。
内存优化表能够在disk上维护一个副本,用于持久化数据集。
Memory-optimizedtablesresideinmemory.Rowsinthetablearereadfromandwrittentomemory.Theentiretableresidesinmemory.Asecondcopyofthetabledataismaintainedondisk,butonlyfordurabilitypurposes.
一,创建数据库
内存优化表的必须存储在一个包含memory-optimized-data的FileGroup中,一个db只能包含一个,该FileGroup可以有多个File(File实际上是folder)。
usemaster
go
--createdatabase
createdatabaseTestMemoryDB
--addfilegroup
alterdatabaseTestMemoryDB
addfilegroupFG_TestMemoryDB
containsmemory_optimized_data;
--addfiledirectorygofilegroup
addfile
(
name='
TestMemoryDBDirectory'
filename='
D:
\MSSQLServerData\MSSQL12.MSSQLSERVER\MSSQL\DATA\TestMemoryDBDirectory'
)
tofilegroupFG_TestMemoryDB;
CONTAINSMEMORY_OPTIMIZED_DATA子句指定用于存储内存优化表数据的FileGroup。
Specifiesthatthefilegroupstoresmemory_optimizeddatainthefilesystem.OnlyoneMEMORY_OPTIMIZED_DATAfilegroupisallowedperdatabase.
二,创建内存优化表
在SQLServer2014的内存优化表中,只能创建nonclusteredindex或nonclusteredhashindex,每个内存优化表中至少创建一个index,最多创建8个index。
在内存优化表中,Index必须在CreateTable语句中创建,不能使用Createindex命令创建索引,也不能使用dropindex命令删除索引。
YoumustspecifycolumnandtableindexesaspartoftheCREATETABLEstatement.CREATEINDEXandDROPINDEXarenotsupportedformemory-optimizedtables.
--creatememoryoptimizedtable
CREATETABLE[dbo].[Products]
[ProductID][bigint]NOTNULL,
[Name][varchar](64)notNULL,
[Price]decimal(10,2)notNULL,
[Unit]varchar(16)collateLatin1_General_100_BIN2notnull,
[Description][varchar](1000)NULL,
CONSTRAINT[PK__Products_ProductID]PRIMARYKEY
nonclusteredhash
([ProductID])
WITH(BUCKET_COUNT=2000000)
indexidx_Products_Pricenonclustered([Price]desc)
inde
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 有效利用SQL Server容器的价值用例及方法 有效 利用 SQL Server 容器 价值 方法