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. Google之Chromium浏览器源码学习——base公共通用库(二)

    上次提到Chromium浏览器中base公共通用库中的内存分配器allocator,其中用到了三方库tcmalloc.jemalloc:对于这两个内存分配器,个人建议,对于内存,最好是自己维护内存池: ...

  2. JDK常用工具集——jps

    该命令的作用是罗列出目标系统(target system)中所有具有访问权限到的Java进程. 一.命令简介:     jps [option] [hostid] 二.参数说明:     option ...

  3. C++中随机数和不重复的随机数

    随机数 int rand (); rand函数返回一个0-32767之间的一个伪随机整数,32767可以由宏RAND_MAX表示,该函数需要头文件<stdlib.h>. 常用的是如何生成一 ...

  4. 如何快速地从mongo中提取数据到numpy以及pandas中去

    mongo数据通常过于庞大,很难一下子放进内存里进行分析,如果直接在python里使用字典来存贮每一个文档,使用list来存储数据的话,将很快是内存沾满.型号拥有numpy和pandas import ...

  5. Tomcat配置HTTPS方式(单向)

    简要记录主要步骤备忘 1.进入到jdk下的bin目录 2.输入如下指令 keytool -v -genkey -alias tomcat -keyalg RSA -keystore d:/tomcat ...

  6. letter upper lower combo

    以前同事为了炫耀ruby的简洁,特意出一道题来考小陈: 在写一个爆破密码的字典生成工具,其中有这样一个需求: 输入一个单词:列出这个单词的所有大小写组合,比如ruby Ruby rUby ruBy r ...

  7. 微信企业号办公系统-图片预览放大功能-previewImage

    在微信里看过文章的应该知道,文章里的图片点击后可以放大.分享和保存. 然而自己在微信里开发的网页,里面的图片点击后没办法实现这个效果,然后就去看了下微信JS文档,里面有个previewImage可以调 ...

  8. NOSQL场景梳理

    Redis 场景:缓存,Session,消息发布订阅,产品属性分析,订单购买等强事务,计数等   Memcached 场景:读密集,写一般的缓存,Session   MongoDB 场景:数据显示,查 ...

  9. 如何在VS2012中使用IL Disassembler中查看项目编译生成的程序集

    2016-05-26 11:48:46 测试的WPF项目 MainWindow.xaml代码 MainWindow.xaml.cs 代码 在学习WPF的时候,想验证:删除MainWindow.xaml ...

  10. scrapy爬虫笔记(一)------环境配置

    前言: 本系列文章是对爬虫的简单介绍,以及教你如何用简单的方法爬取网站上的内容. 需要阅读者对html语言及python语言有基本的了解. (本系列文章也是我在学习爬虫过程中的学习笔记,随着学习的深入 ...