使用SSIS汇集监控数据
1、背景
数据库服务器部署有各类巡检脚本,现在想把巡检收集到的数据汇集到一起。
Source源对应的是各业务数据库服务器,Destination目标对应的是保存汇集数据的服务器。前期部署的时候已将巡检相关的保存在同一个数据库下,方便移植到其他服务器。每张表都有id(自增列)和时间字段。
2、获取数据
由点到面,先取一个实例下的一张表,然后取多个实例下的一张表,最后扩展取多个实例下的多张表。
2.1、获取一个实例下的一张表
源表中的数据不断有新增,目标每次应该只获取新增部分(当然可以先清空再全部获取,显然这样不妥)。首先获取目标表最新的记录max(InsertTime),然后将源表max(InsertTime)之后的记录插入到目标表。
添加[执行SQL任务]Database,SQLStatement获取目标表的最新记录,将结果集置为[单行],传递给变量(用户::InsertTime)

添加[数据流任务]DFT_Database,[OLE DB源]使用SQL命令访问模式,输入带参数的命令文本,并编辑参数映射;[OLE DB目标]选择对应的表或视图名称
注意:如果我们使用时间字段(库中为datetime类型)区分新增数据,创建变量时需将类型设置为string类型,SSIS变量中的DateTime类型只到秒,对毫秒采取"四舍五入"。例如获取目标最新记录为'2016-11-29 22:05:58.497',把它赋给DataTime类型的SSIS变量会变成'2016-11-29 22:05:58',再往下执行的话会重复获取'2016-11-29 22:05:58.497'的记录。如果[OLE DB源]使用的是存储过程,参数映射中的名称必须与存储过程定义的参数名称一致(测试中我将存储过程参数名称修改为@insertTime,报错:SQL 命令需要名为“@insertTime”的参数,但在此参数映射中找不到该参数。)在VS2005/2008测试发现SSIS将时间字段类型设置为string类型,存储过程的参数可用varchar或datetime)。
2.2、获取多个实例下的一张表
首先我们将源的连接信息保存到连接配置表
添加[执行SQL任务]GetConnection,SQLStatement获取配置表中的连接信息,结果集置为[完整结果集]
参数映射添加需要的变量信息,结果集添加需要的变量信息。变量的使用可参考文章:变量在SSIS包中的使用

源连接信息已经有了,再添加[Foreach循环容器],对枚举执行迭代。集合页参照下图设置
变量映射页参照下图设置
我们的目的是迭代配置表中的源连接,重置连接信息,执行获取数据操作。因此需要修改Source连接为表达式,连接管理器中右击Source->属性->Expressions,编辑ServerName和ConnectionString属性表达式
设置好后再将2.1中的[执行SQL任务]Database和[数据流任务]DFT_Database拖入[Foreach循环容器]。此时正常的话,针对配置表中的每一条源连接信息,Source就使用表达式重置源,这样就可以得到对应的源数据。
是否记得GetConnection中有将InstanceID和ServerID赋值给变量,当目标端保存有多个实例数据后,我们需要用InstanceID区分数据来自哪个实例,因此在[执行SQL任务]Database,获取目标上的最新记录时,需在命令中添加WHERE条件,参数映射上添加用户::InstanceID变量

到此,基本已经完成动态获取多个实例下的数据。其他的数据表只需参考[执行SQL任务]Database和[数据流任务]DFT_Database,添加到[Foreach循环容器]即可。
图中变量应该在一开始就创建,获取目标最新记录、获取源连接信息需要使用到这些变量。连接管理器中的Source通过表达式得到各服务器的连接信息,Destination连接的是目标服务器。
2.3、完善及疑问
1->对于数据量很大的情况,我们可以将[执行SQL任务]Database和[数据流任务]DFT_Database添加到[For循环容器],设置每次获取的记录数,反复执行控制流,直至求值条件为False。
2->添加包执行的日志,事件处理程序添加捕获错误信息,方便查看执行过程中所处位置,以及出错时的错误信息。
3->包中的SQL命令全部使用的是"查询语句",然后分配给连接登录名reader权限。可将"查询语句"封装到存储过程,仅给登录名执行对应存储过程的权限。
4->动态连接信息是从数据表中获取信息,对应保存有登录名、密码、数据库信息,感觉不太好!在没有使用其他方法前,很有必要尽量限制相关登录名的权限。
上图就是修改"查询语句"为存储过程的过程中,捕获到的错误信息。通过此表很容易就能定位到是哪个源(SourceServerName)的哪个包(PackageName)的哪个任务(TaskName)的哪个组件,在什么时间(InsertTime)出错(ErrorDescription)。
修改源和目标数据表的列类型(由varchar(4000)->varchar(max)),如果存在超长的记录,会导致SSIS包执行报错,需要更新数据流任务中的元数据。
3、部署
SSIS包调试通过后,需要将包部署到服务器,按照设定的调度定期获取数据。
3.1、SSIS包如何放到作业中执行
SSIS中调试包一切正常,但把它放到作业中,执行却报错
关键字:无法解密受保护的XML节点"DTS:Password"
这是受包的Protectionlevel影响,VS中打开包(.dtsx),在设计页面的空白处右击->属性,修改Protectionlevel为EncryptSensitiveWithUserKey,然后键入PackagePassword的值。下次VS打开包或者作业引用此包时需输入前面的Password。
3.2、打开SSIS包时验证时间过长
默认情况下SSIS在运行包之前会验证包的每个数据源,若出现较为复杂的情况则可能需要较长的时间。修改可执行文件(任务、容器和包本身)的DelyaValidation属性为True,修改数据流组件的ValidateExternalMetadata属性为False,延迟验证。
使用SSIS汇集监控数据的更多相关文章
- SQL SERVER 监控数据文件增长情况
在项目前期评估数据库的增长情况,然后根据数据库数据量的增长情况来规划存储的分配其实是一件比较麻烦的事情.因为项目没有上线,用什么来评估数据库的数据增长情况呢? 如果手头没有实际的数据,我们只能从表的数 ...
- #CSDN刷票门# 有没有人在恶意刷票?CSDN请告诉我!用24小时监控数据说话!
特别声明: 此次并非针对其他参与2013中国十大优秀开源项目的同行,体系有漏洞要谴责的是制定规则并从中获益但不作为的权贵,草根们制定不了规则但可发现和利用漏洞,这是程序员应有反叛精神没错.但被作为道具 ...
- 转 SSIS处理导入数据时, 存在的更新, 不存在的插入
SSIS处理导入数据时, 存在的更新, 不存在的插入 分类: DTS/SSIS2006-09-10 12:43 18185人阅读 评论(22) 收藏 举报 ssissql servermicrosof ...
- 探索Windows Azure 监控和自动伸缩系列3 - 启用Azure监控扩展收集自定义监控数据
上一篇我们介绍了获取Azure的监控指标和监控数据: http://www.cnblogs.com/teld/p/5113376.html 本篇我们继续:监控虚拟机的自定义性能计数器. 随着我们应用规 ...
- 探索Windows Azure 监控和自动伸缩系列2 - 获取虚拟机的监控定义和监控数据
上一篇博文介绍了如何连接Windows Azure: http://www.cnblogs.com/teld/p/5113063.html 本篇我们继续上次的示例代码,获取虚拟机的监控定义和监控数据. ...
- CDH秘籍(两):cloudera Manager存储监控数据
概述 上一篇文章分析了cloudera manager中监控数据.中心数据的存储方式,如何配置外部表等.这一篇文章进一步分析监控数据的存储,配置,调优等. Service Monitor 和 Host ...
- 基于Grafana的监控数据钻取功能应用实践
互联网企业中,随着机器规模以及业务量的爆发式增长,监控数据逐渐成为一种大数据,对监控大数据的分析,包括数据采集.数据缓存.数据聚合分析.数据存储.数据展现等几个阶段.不同阶段有不同的解决方案及支撑工具 ...
- mongodb通过profile来监控数据
mongodb可以通过profile来监控数据,进行优化.查看当前是否开启profile功能用命令db.getProfilingLevel() 返回level等级,值为0|1|2,分别代表意思:0代表 ...
- 微软BI 之SSIS 系列 - 导出数据到 Excel 2013 的实现
开篇介绍 碰到有几个朋友问到这个问题,比较共性,就特意写了这篇小文章说明一下如何实现在 SSIS 中导出数据到 Office Excel 2013 中.通常情况下 2013 以前的版本大多没有问题,但 ...
随机推荐
- Oracle的优化器介绍
Oracle优化器介绍 本文讲述了Oracle优化器的概念.工作原理和使用方法,兼顾了Oracle8i.9i以及最新的10g三个版本.理解本文将有助于您更好的更有效的进行SQL优化工作. RBO优化器 ...
- dcraw源码解析
dcraw源码解析 Author:Maddock Date:2015-04-22 转载请注明出处: 首先吐槽一点: 程序中使用了相当多的全局变量, 看的人头大.全局变量的坏处参看 http://wen ...
- EXT.NET 使用总结(1)
前言 从系统改版到现在,将近半年的时间,原本陌生的Ext.NET的UI框架,也慢慢的熟悉了.总的来说,这个UI框架还是很优秀的,但是也没有100%完美的产品(老系统使用easy ui其实也挺好的).趁 ...
- 浅析python 中__name__ = '__main__' 的作用
引用http://www.jb51.net/article/51892.htm 很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码 ...
- 在SQL SERVER中实现RSA加解密函数(第二版)
/*************************************************** 作者:herowang(让你望见影子的墙) 日期:2010.1.5 注: 转载请保留此信息 更 ...
- Java Arrays类进行数组排序
排序算法,基本的高级语言都有一些提供.C语言有qsort()函数,C++有sort()函数,java语言有Arrays类(不是Array).用这些排序时,都可以写自己的排序规则. Java API对A ...
- Android实现自定义带文字和图片的Button
Android实现自定义带文字和图片的Button 在Android开发中经常会需要用到带文字和图片的button,下面来讲解一下常用的实现办法. 一.用系统自带的Button实现 最简单的一种办法就 ...
- TodoMVC中的Backbone+MarionetteJS+RequireJS例子源码分析之二 数据处理
当我们使用jQuery时大部分时间是聚焦于Dom节点的处理,给Dom节点绑定事件等等:前端mvc框架backbone则如何呢? M-Model,Collection等,是聚焦于数据的处理,它把与后台数 ...
- IDE-Sublime【2】-代码智能提示插件SublimeCodeIntel的安装
一.打开菜单References -> Package Control 二.输入Package Control: install Package,回车 三.输入SublimeCodeIntel, ...
- ZooKeeper个人笔记Session管理
Session 1.sessionId <机器的SID,当前时间>生成一个sessionId,这是全局唯一的. 2.TimeOut 会话的超时时间,注意,这个值和客户端ZooKeeper ...