SSIS数据同步实践
 

背景

在已初步验证不同实例下同构表数据同步方案之后,为了实现数据持续同步,需使用SSIS把之前的生成脚本和执行脚本的两个步骤组合在一起部署成包之后,通过JOB定时去执行;

测试环境

Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64) Oct 28 2016 18:17:30 Copyright (c) Microsoft Corporation Web Edition (64-bit) on Windows Server 2016 Datacenter 6.3 <X64> (Build 14393: ) (Hypervisor) 
SSIS开发工具
SSDT需格外安装,这个好像从sql server 2012开始就需格外安装了。

测试步骤

1).先配置好链接数据库信息,新建链接,分别是联azure sql database 和本地sql server;如下图
2).新建文件系统任务,目的是重复执行的时候删除对应文件夹下的已生成的脚本文件,双级文件系统任务配置如下
3).执行SQL任务,该任务的目的是为了生成比对的同步脚本文件,配置如下
对应的处理逻辑脚本如下,有需要可以根据需求,修改成批量或者处理个别表;
DECLARE @TableNames AS TABLE
(
id INT IDENTITY(1, 1),
tableName VARCHAR(100)
); DECLARE @sTableDiff NVARCHAR(1000);
DECLARE @tableName VARCHAR(100);
DECLARE @counter INT;
DECLARE @maxCount INT; INSERT INTO @TableNames
SELECT a.name
FROM sys.sysobjects a
INNER JOIN
(
SELECT object_id
FROM sys.columns
WHERE is_rowguidcol = 1
OR is_identity = 1
UNION
SELECT object_id
FROM sys.indexes
WHERE index_id = 1
) b
ON a.id = b.object_id
WHERE a.type = 'U' --and a.name='TMonStoreCheck'; SET @counter = 1; SELECT @maxCount = COUNT(name)
FROM sys.sysobjects a
INNER JOIN
(
SELECT object_id
FROM sys.columns
WHERE is_rowguidcol = 1
OR is_identity = 1
UNION
SELECT object_id
FROM sys.indexes
WHERE index_id = 1
) b
ON a.id = b.object_id
WHERE a.type = 'U' --and a.name='TMonStoreCheck'; WHILE @counter <= @maxCount
BEGIN
SELECT @tableName = tableName
FROM @TableNames
WHERE id = @counter;
SELECT @sTableDiff = ''; SET @sTableDiff
= ' "C:\Program Files\Microsoft SQL Server\130\COM\tablediff.exe" -sourceserver [faqb6n86e4.database.chinacloudapi.cn] -sourceuser ymjj -sourcepassword ***** -sourcedatabase xw_dl_1009676_01 -sourcetable ' + @tableName + ' -destinationserver [butt-joint] -destinationuser sa -destinationpassword ****** -destinationdatabase xw_dl_1009676_01 -destinationtable '+@tableName+' -f F:\4_9\test\'+@tableName EXEC master..XP_CMDSHELL @sTableDiff
SET @counter = @counter + 1;
END;
为了流更清晰,我们可以选中【文件系统任务】和【执行SQL任务】分组;
4).Foreach 循环容器,目的是逐个去读取文件夹中的文件名称;
5).执行脚本 通过foreach 循环容器的传参 去执行已生成好的差异脚本;
插入脚本如下:
declare @temp nvarchar(200)
select @temp ='"F:\Program Files\Microsoft SQL Server\Client SDK\ODBC\130\Tools\Binn\sqlcmd.exe" -a 32576 -S butt-joint -d xw_dl_1009676_01 -i F:\4_9\test\'+ ? +' -f 65001'
EXEC master..xp_cmdshell @temp
注意:
  • 可能需要安装NET Framework 3.5, 否则sqlcmd无法正常执行;
  • sqlcmd 的前期测试,为了方便问题定位可以使用 -o 选项把错误信息打印出文本;
  • sqlcmd 后面切记加 -f 65001,避免中文在数据库中插入后,select显示乱码的情形;
  • 当插入的脚本文件非常大比如超100M+的时候建议加上-a选项,并保障内存富裕;
6)为了方便后续维护可以适当加上批注,测试验证执行情况;
数据验证可以直接查看对应库相关表数据同步情况即可;
截止到此SSIS开发已完毕,剩下的是包生成部署以及配置成JOB的步骤了;
7).创建目录 如下
注意
  • SQL Server Integration Services 服务是否已正常启动;
8).包生成部署
9).配置成可以定时执行的JOB 
先要创建一个凭证
然后创建一个SSIS代理如下
配置数据同步JOB中step
在job中设置合适的计划等之后,测试验证
10)查看包的执行情况以及执行时长等信息;
也可以直接查看JOB的执行历史记录
 

结论

  • 上述是一个简单的SSIS数据同步实践,不同的业务需求的业务逻辑都可在3)中自定义;
  • sqlcmd执行可能需要安装NET Framework 3.5, 否则sqlcmd无法正常执行;
  • sqlcmd 的前期测试,为了方便问题定位可以使用 -o 选项把错误信息打印出文本;
  • sqlcmd 后面建议加 -f 65001,避免中文在数据库中插入后,select原本是中文而显示乱码的情形;
  • 确保部署的机器上SQL Server Integration Services 服务已安装并且正常启动;
  • 确保SQL Server Agent 服务已正常启动;
  • 在配置包的JOB的时候注意提前新建SSIS的代理,否则会有执行权限相关的问题;
  • 当生成的执行脚本文件比较大的时候(比如超100M或更大),sqlcmd会报如下错误,建议在sqlcmd 加上 -a 选项,并保障执行sqlcmd的服务器有足够富裕的内存 ;
    Shared Memory Provider: No process is on the other end of the pipe.
    Communication link failure ---or
    Msg 701, Level 17, State 139, Server *******, Line -5057
    资源池“default”没有足够的系统内存来运行此查询。
     

后记

待我完成本次测试,才突然想起为什么不直接使用SQL Server 自带的BCP来替换SQLCMD执行脚本。
                                            
 
exec master..xp_cmdshell '"F:\Program Files\Microsoft SQL Server\Client SDK\ODBC\130\Tools\Binn\bcp.exe"  test.dbo.TCirOrder in F:\TCirOrder.sql -E -n -C RAW -b 1000 -a 4096 -q -S butt-joint -T'
测试报如下错误
NULL
Starting copy...
SQLState = 22001, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]String data, right truncation
SQLState = 22001, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]String data, right truncation
SQLState = 22001, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]String data, right truncation
SQLState = 22001, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]String data, right truncation
SQLState = 22001, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]String data, right truncation
SQLState = 22001, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]String data, right truncation
SQLState = 22001, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]String data, right truncation
SQLState = 22001, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]String data, right truncation
SQLState = 22001, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]String data, right truncation
SQLState = 22001, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]String data, right truncation
NULL
BCP copy in failed
NULL
根据这个指引把当前的SQL Server 2016 版本升到13.0.4224.16 还是如上报错,暂未找到合适的办法绕过去,处理过类似问题的朋友麻烦留言告知,谢谢;
 
 --20190517 更新
后来发现直接在CMD中调BCP就没有上述问题,再写段POWERSHELL 批量执行BCP就可以。
 
 
 
 

SSIS数据同步实践的更多相关文章

  1. 基于 MySQL Binlog 的 Elasticsearch 数据同步实践 原

    一.背景 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品.订单等数据的多维度检索. 使用 Elasticsearch 存储业务数据可以 ...

  2. SSIS 学习之旅 数据同步

    这一章 别人也有写过但是我觉得还是写写比较好.数据同步其实就是想仿照 数据库的发布订阅功能 第一章:SSIS 学习之旅 第一个SSIS 示例(一)(上) 第二章:SSIS 学习之旅 第一个SSIS 示 ...

  3. 美团DB数据同步到数据仓库的架构与实践

    背景 在数据仓库建模中,未经任何加工处理的原始业务层数据,我们称之为ODS(Operational Data Store)数据.在互联网企业中,常见的ODS数据有业务日志数据(Log)和业务DB数据( ...

  4. DB 数据同步到数据仓库的架构与实践

    背景 在数据仓库建模中,未经任何加工处理的原始业务层数据,我们称之为ODS(Operational Data Store)数据.在互联网企业中,常见的ODS数据有业务日志数据(Log)和业务DB数据( ...

  5. 大数据实践-数据同步篇tungsten-relicator(mysql-&gt;mongo)

    // mongo)";digg_bgcolor = "#FFFFFF";digg_skin = "normal"; // ]]> // [导读] ...

  6. ElasticStack系列之十一 &amp; 同步 mysql 数据的实践与思考

    问题 1. jdbc-input-plugin 只能实现数据库的追加,对于 elasticsearch 增量写入,但经常 jdbc 源一端的数据库可能会做数据库删除或者更新操作.这样一来数据库与搜索引 ...

  7. MongoDB DBA 实践5-----复制集集群的数据同步和故障转移

    (1)复制集集群的数据同步 1>主节点数据库test,在其中goods集合中加入一个文档. 2>在副节点中查看 注意:SECONDARY是不允许读写的,要使用rs.slaveOk()获得读 ...

  8. 阿里Canal框架(数据同步中间件)初步实践

    最近在工作中需要处理一些大数据量同步的场景,正好运用到了canal这款数据库中间件,因此特意花了点时间来进行该中间件的的学习和总结. 背景介绍 早期,阿里巴巴B2B公司因为存在杭州和美国双机房部署,存 ...

  9. 第二篇 Integration Services:SSIS数据泵

    本篇文章是Integration Services系列的第二篇,详细内容请参考原文. 简介SSIS用于移动数据.数据流任务提供此功能.因为这个原因,当介绍SSIS时我喜欢从数据流任务开始.数据流任务的 ...

随机推荐

  1. 「微信小程序」来了

    ps:微信APP Store.微信小程序.微信应用号都是指同一个事情. 苦逼程序猿刚下班到家,还没来得及洗漱,收到条小道消息的推送.于是我有气无力的拿着手机点开了这条推送消息,映入眼帘的就是这张封面图 ...

  2. mac安装redis

    1.到官网下载最新的redis. http://redis.io/download 2.将下载下来的tar.gz 压缩包,(在/Users/***/Downloads)拷贝到usr/local目录下 ...

  3. hdu 2034 人见人爱A-B

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=2034 人见人爱A-B Description 参加过上个月月赛的同学一定还记得其中的一个最简单的题目, ...

  4. PowerMock简介

    PowerMock 写单元测试可能有些难.有时仅仅为了可测试性的目标而不得不牺牲好的设计.通常可测试性和好的测试之间是一致的,但是并不总是如此.比如,由于现存框架的限制,final classes.m ...

  5. java里的静态变量是放在了堆内存还是栈内存?

    堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令) 2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对 ...

  6. codeforces Round #347 (Div. 2) C - International Olympiad

    思路:从后往前一位一位的模拟,每次判断一下当前枚举的数是否之间枚举过了.或者当前枚举数过小,小于1989. #include<cstdio> #include<cstring> ...

  7. MVC提交时验证

    第一种 @using (Html.BeginForm("ProdPromotionEdit", "Product", FormMethod.Post, new ...

  8. 【转】git命令

    Git使用 1. git pull    更新服务器代码到本地a). git pull origin master是将origin这个版本库的代码更新到本地的master主分支 2. git push ...

  9. PORTE_ISFR &amp; (1&lt;&lt;n)

    位运算关键:空出补零,溢出舍弃

  10. Java基础_0303:封装性初步

    class Book { // 定义一个新的类 private String title; // 书的名字 private double price; // 书的价格 public void getI ...