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汇集监控数据的更多相关文章

  1. SQL SERVER 监控数据文件增长情况

    在项目前期评估数据库的增长情况,然后根据数据库数据量的增长情况来规划存储的分配其实是一件比较麻烦的事情.因为项目没有上线,用什么来评估数据库的数据增长情况呢? 如果手头没有实际的数据,我们只能从表的数 ...

  2. #CSDN刷票门# 有没有人在恶意刷票?CSDN请告诉我!用24小时监控数据说话!

    特别声明: 此次并非针对其他参与2013中国十大优秀开源项目的同行,体系有漏洞要谴责的是制定规则并从中获益但不作为的权贵,草根们制定不了规则但可发现和利用漏洞,这是程序员应有反叛精神没错.但被作为道具 ...

  3. 转 SSIS处理导入数据时, 存在的更新, 不存在的插入

    SSIS处理导入数据时, 存在的更新, 不存在的插入 分类: DTS/SSIS2006-09-10 12:43 18185人阅读 评论(22) 收藏 举报 ssissql servermicrosof ...

  4. 探索Windows Azure 监控和自动伸缩系列3 - 启用Azure监控扩展收集自定义监控数据

    上一篇我们介绍了获取Azure的监控指标和监控数据: http://www.cnblogs.com/teld/p/5113376.html 本篇我们继续:监控虚拟机的自定义性能计数器. 随着我们应用规 ...

  5. 探索Windows Azure 监控和自动伸缩系列2 - 获取虚拟机的监控定义和监控数据

    上一篇博文介绍了如何连接Windows Azure: http://www.cnblogs.com/teld/p/5113063.html 本篇我们继续上次的示例代码,获取虚拟机的监控定义和监控数据. ...

  6. CDH秘籍(两):cloudera Manager存储监控数据

    概述 上一篇文章分析了cloudera manager中监控数据.中心数据的存储方式,如何配置外部表等.这一篇文章进一步分析监控数据的存储,配置,调优等. Service Monitor 和 Host ...

  7. 基于Grafana的监控数据钻取功能应用实践

    互联网企业中,随着机器规模以及业务量的爆发式增长,监控数据逐渐成为一种大数据,对监控大数据的分析,包括数据采集.数据缓存.数据聚合分析.数据存储.数据展现等几个阶段.不同阶段有不同的解决方案及支撑工具 ...

  8. mongodb通过profile来监控数据

    mongodb可以通过profile来监控数据,进行优化.查看当前是否开启profile功能用命令db.getProfilingLevel() 返回level等级,值为0|1|2,分别代表意思:0代表 ...

  9. 微软BI 之SSIS 系列 - 导出数据到 Excel 2013 的实现

    开篇介绍 碰到有几个朋友问到这个问题,比较共性,就特意写了这篇小文章说明一下如何实现在 SSIS 中导出数据到 Office Excel 2013 中.通常情况下 2013 以前的版本大多没有问题,但 ...

随机推荐

  1. .NET开发者如何愉快的进行微信公众号开发

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:这篇文章只是一个如何提高开发效率的简单指导和记录,不会涉及具体的微信公众号开发内容. ...

  2. Apple Pay--iOS开发

    一.什么是Apple Pay? 1. 概念 Apple Pay,简单来说, 就是一种移动支付方式.通过Touch ID/ Passcode,用户可使用存储在iPhone 6, 6p等设备上的信用卡和借 ...

  3. ZeroMQ接口函数之 :zmq_msg_get - 获取消息的性质

    ZeroMQ 官方地址 :http://api.zeromq.org/4-1:zmq_msg_get zmq_msg_get(3)  ØMQ Manual - ØMQ/3.2.5 Name zmq_m ...

  4. C#生成二维码的方法

    本文实例讲述了C#生成二维码的方法.分享给大家供大家参考.具体实现方法如下: 首先引用ThoughtWorks.QRCode.dll 具体代码如下: 复制代码 代码如下: using System; ...

  5. 摘要: Linux下which、whereis、locate、find命令的区别

    我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索.这些是从网上找到的资料,因为有时很长时间不会用到,当要用的时候经常弄混了,所以放到这里方便使用. which    ...

  6. HDU1010 DFS+剪枝

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  7. 使用BOOTICE 恢复系统启动项

    使用BOOTICE 恢复系统启动项 我在安装deepin 系统的时候,经常遇到重启进不去系统,每次重启都会进入windows 系统,这让我感到特别头疼,试了好多次都不成功,有些情况是,成功后再次重启又 ...

  8. 不能用con作为类名

    A class file was not written. The project may be inconsistent, if so try refreshing this project and ...

  9. PHP AJAX JSONP实现跨域请求使用实例

    在之前我写过“php返回json数据简单实例”,“php返回json数据中文显示的问题”和“在PHP语言中使用JSON和将json还原成数组”.有兴趣的童鞋可以看看 今天我写的是PHP AJAX JS ...

  10. Html简单介绍

    一.Html 1.万维网的核心语言,高大上称之为超文本标记语言(Html)的第五次修改 2.完成的时间:2014年10月29日 3.我们需要了解有一定高度的知识: WHATWG  WEB超文本应用技术 ...