‘壹’ 怎么实现两个数据库的同步
同步两个SQLServer数据库
如何同步两个sqlserver数据库的内容?程序代码可以有版本管理cvs进行同步管理,可是数据库同步就非常麻烦,只能自己改了一个后再去改另一个,如果忘记了更改另一个经常造成两个数据库的结构或内容上不一致.各位有什么好的方法吗?
一、分发与复制
用强制订阅实现数据库同步操作. 大量和批量的数据可以用数据库的同步机制处理:
//
说明:
为方便操作,所有操作均在发布服务器(分发服务器)上操作,并使用推模式
在客户机器使用强制订阅方式。
二、测试通过
1:环境
服务器环境:
机器名称: zehuadb
操作系统:windows 2000 server
数据库版本:sql 2000 server 个人版
客户端
机器名称:zlp
操作系统:windows 2000 server
数据库版本:sql 2000 server 个人版
2:建用户帐号
在服务器端建立域用户帐号
我的电脑管理->本地用户和组->用户->建立
username:zlp
userpwd:zlp
3:重新启动服务器mssqlserver
我的电脑->控制面版->管理工具->服务->mssqlserver 服务
(更改为:域用户帐号,我们新建的zlp用户 .zlp,密码:zlp)
4:安装分发服务器
a:配置分发服务器
工具->复制->配置发布、订阅服务器和分发->下一步->下一步(所有的均采用默认配置)
b:配置发布服务器
工具->复制->创建和管理发布->选择要发布的数据库(sz)->下一步->快照发布->下一步->选择要发布的内容->下一步->下一步->下一步->完成
c:强制配置订阅服务器(推模式,拉模式与此雷同)
工具->复制->配置发布、订阅服务器和分发->订阅服务器->新建->sql server数据库->输入客户端服务器名称(zlp)->使用sql server 身份验证(sa,空密码)->确定->应用->确定
d:初始化订阅
复制监视器->发布服务器(zehuadb)->双击订阅->强制新建->下一步->选择启用的订阅服务器->zlp->下一步->下一步->下一步->下一步->完成
5:测试配置是否成功
复制监视器->发布衿?zehuadb)->双击sz:sz->点状态->点立即运行代理程序
查看:
复制监视器->发布服务器(zehuadb)->sz:sz->选择zlp:sz(类型强制)->鼠标右键->启动同步处理
如果没有错误标志(红色叉),恭喜您配置成功
6:测试数据
在服务器执行:
选择一个表,执行如下sql: insert into wq_newsgroup_s select '测试成功',5
复制监视器->发布服务器(zehuadb)->sz:sz->快照->启动代理程序 ->zlp:sz(强制)->启动同步处理
去查看同步的 wq_newsgroup_s 是否插入了一条新的记录
测试完毕,通过。
7:修改数据库的同步时间,一般选择夜晚执行数据库同步处理
(具体操作略) :d
/*
注意说明:
服务器一端不能以(local)进行数据的发布与分发,需要先删除注册,然后新建注册本地计算机名称
卸载方式:工具->复制->禁止发布->是在"zehuadb"上静止发布,卸载所有的数据库同步配置服务器
注意:发布服务器、分发服务器中的sqlserveragent服务必须启动
采用推模式: "d:microsoft sql servermssql epldataunc" 目录文件可以不设置共享
拉模式:则需要共享~!
*/
少量数据库同步可以采用触发器实现,同步单表即可。
三、配置过程中可能出现的问题
在sql server 2000里设置和使用数据库复制之前,应先检查相关的几台sql server服务器下面几点是否满足:
1、mssqlserver和sqlserveragent服务是否是以域用户身份启动并运行的(.administrator用户也是可以的)
如果登录用的是本地系统帐户local,将不具备网络功能,会产生以下错误:
进程未能连接到distributor '@server name'
(如果您的服务器已经用了sql server全文检索服务, 请不要修改mssqlserver和sqlserveragent服务的local启动。
会照成全文检索服务不能用。请换另外一台机器来做sql server 2000里复制中的分发服务器。)
修改服务启动的登录用户,需要重新启动mssqlserver和sqlserveragent服务才能生效。
2、检查相关的几台sql server服务器是否改过名称(需要srvid=0的本地机器上srvname和datasource一样)
在查询分析器里执行:
use master
select srvid,srvname,datasource from sysservers
如果没有srvid=0或者srvid=0(也就是本机器)但srvname和datasource不一样, 需要按如下方法修改:
use master
go
-- 设置两个变量
declare @serverproperty_servername varchar(100),
@servername varchar(100)
-- 取得windows nt 服务器和与指定的 sql server 实例关联的实例信息
select @serverproperty_servername = convert(varchar(100), serverproperty('servername'))
-- 返回运行 microsoft sql server 的本地服务器名称
select @servername = convert(varchar(100), @@servername)
-- 显示获取的这两个参数
select @serverproperty_servername,@servername
--如果@serverproperty_servername和@servername不同(因为你改过计算机名字),再运行下面的
--删除错误的服务器名
exec sp_dropserver @server=@servername
--添加正确的服务器名
exec sp_addserver @server=@serverproperty_servername, @local='local'
修改这项参数,需要重新启动mssqlserver和sqlserveragent服务才能生效。
这样一来就不会在创建复制的过程中出现18482、18483错误了。
3、检查sql server企业管理器里面相关的几台sql server注册名是否和上面第二点里介绍的srvname一样
不能用ip地址的注册名。
(我们可以删掉ip地址的注册,新建以sql server管理员级别的用户注册的服务器名)
这样一来就不会在创建复制的过程中出现14010、20084、18456、18482、18483错误了。
4、检查相关的几台sql server服务器网络是否能够正常访问
如果ping主机ip地址可以,但ping主机名不通的时候,需要在
winntsystem32driversetchosts (win2000)
(win2003)
文件里写入数据库服务器ip地址和主机名的对应关系。
例如:
127.0.0.1 localhost
192.168.0.35 oracledb oracledb
192.168.0.65 fengyu02 fengyu02
202.84.10.193 bj_db bj_db
或者在sql server客户端网络实用工具里建立别名,例如:
5、系统需要的扩展存储过程是否存在(如果不存在,需要恢复):
sp_addextendedproc 'xp_regenumvalues',@dllname ='xpstar.dll'
go
sp_addextendedproc 'xp_regdeletevalue',@dllname ='xpstar.dll'
go
sp_addextendedproc 'xp_regdeletekey',@dllname ='xpstar.dll'
go
sp_addextendedproc xp_cmdshell ,@dllname ='xplog70.dll'
接下来就可以用sql server企业管理器里[复制]-> 右键选择 ->[配置发布、订阅服务器和分发]的图形界面来配置数据库复制了。
下面是按顺序列出配置复制的步骤:
1、建立发布和分发服务器
[欢迎使用配置发布和分发向导]->[选择分发服务器]->[使"@servername"成为它自己的分发服务器,sql server将创建分发数据库和日志]
->[制定快照文件夹]-> [自定义配置] -> [否,使用下列的默认配置] -> [完成]
上述步骤完成后, 会在当前"@servername" sql server数据库里建立了一个distribion库和 一个distributor_admin管理员级别的用户(我们可以任意修改密码)。
服务器上新增加了四个作业:
[ 代理程序历史记录清除: distribution ]
[ 分发清除: distribution ]
[ 复制代理程序检查 ]
[ 重新初始化存在数据验证失败的订阅 ]
sql server企业管理器里多了一个复制监视器, 当前的这台机器就可以发布、分发、订阅了。
我们再次在sql server企业管理器里[复制]-> 右键选择 ->[配置发布、订阅服务器和分发]
我们可以在 [发布服务器和分发服务器的属性] 窗口-> [发布服务器] -> [新增] -> [确定] -> [发布数据库] -> [事务]/[合并] -> [确定] -> [订阅服务器] -> [新增] -> [确定]
把网络上的其它sql server服务器添加成为发布或者订阅服务器.
新增一台发布服务器的选项:
我这里新建立的jin001发布服务器是用管理员级别的数据库用户test连接的,
到发布服务器的管理链接要输入密码的可选框, 默认的是选中的,
在新建的jin001发布服务器上建立和分发服务器fengyu/fengyu的链接的时需要输入distributor_admin用户的密码。到发布服务器的管理链接要输入密码的可选框,也可以不选,也就是不需要密码来建立发布到分发服务器的链接(这当然欠缺安全,在测试环境下可以使用)。
2、新建立的网络上另一台发布服务器(例如jin001)选择分发服务器
[欢迎使用配置发布和分发向导]->[选择分发服务器]
-> 使用下列服务器(选定的服务器必须已配置为分发服务器) -> [选定服务器](例如fengyu/fengyu)
-> [下一步] -> [输入分发服务器(例如fengyu/fengyu)的distributor_admin用户的密码两次]
-> [下一步] -> [自定义配置] -> [否,使用下列的默认配置]
-> [下一步] -> [完成] -> [确定]
建立一个数据库复制发布的过程:
[复制] -> [发布内容] -> 右键选择 -> [新建发布]
-> [下一步] -> [选择发布数据库] -> [选中一个待发布的数据库]
-> [下一步] -> [选择发布类型] -> [事务发布]/[合并发布]
-> [下一步] -> [指定订阅服务器的类型] -> [运行sql server 2000的服务器]
-> [下一步] -> [指定项目] -> [在事务发布中只可以发布带主键的表] -> [选中一个有主键的待发布的表]
->[在合并发布中会给表增加唯一性索引和 rowguidcol 属性的唯一标识符字段[rowguid],默认值是newid()]
(添加新列将: 导致不带列列表的 insert 语句失败,增加表的大小,增加生成第一个快照所要求的时间)
->[选中一个待发布的表]
-> [下一步] -> [选择发布名称和描述] ->
-> [下一步] -> [自定义发布的属性] -> [否,根据指定方式创建发布]
-> [下一步] -> [完成] -> [关闭]
发布属性里有很多有用的选项:设定订阅到期(例如24小时)
设定发布表的项目属性:
常规窗口可以指定发布目的表的名称,可以跟原来的表名称不一样。
下图是命令和快照窗口的栏目
( sql server 数据库复制技术实际上是用insert,update,delete操作在订阅服务器上重做发布服务器上的事务操作
看文档资料需要把发布数据库设成完全恢复模式,事务才不会丢失
但我自己在测试中发现发布数据库是简单恢复模式下,每10秒生成一些大事务,10分钟后再收缩数据库日志,
这期间发布和订阅服务器上的作业都暂停,暂停恢复后并没有丢失任何事务更改 )
发布表可以做数据筛选,例如只选择表里面的部分列:
例如只选择表里某些符合条件的记录, 我们可以手工编写筛选的sql语句:
发布表的订阅选项,并可以建立强制订阅:
成功建立了发布以后,发布服务器上新增加了一个作业: [ 失效订阅清除 ]
分发服务器上新增加了两个作业:
[ jin001-dack-dack-5 ] 类型[ repl快照 ]
[ jin001-dack-3 ] 类型[ repl日志读取器 ]
上面蓝色字的名称会根据发布服务器名,发布名及第几次发布而使用不同的编号
repl快照作业是sql server复制的前提条件,它会先把发布的表结构,数据,索引,约束等生成到发布服务器的os目录下文件
(当有订阅的时候才会生成, 当订阅请求初始化或者按照某个时间表调度生成)
repl日志读取器在事务复制的时候是一直处于运行状态。(在合并复制的时候可以根据调度的时间表来运行)
建立一个数据库复制订阅的过程:
[复制] -> [订阅] -> 右键选择 -> [新建请求订阅]
-> [下一步] -> [查找发布] -> [查看已注册服务器所做的发布]
-> [下一步] -> [选择发布] -> [选中已经建立发布服务器上的数据库发布名]
-> [下一步] -> [指定同步代理程序登录] -> [当代理程序连接到代理服务器时:使用sql server身份验证]
(输入发布服务器上distributor_admin用户名和密码)
-> [下一步] -> [选择目的数据库] -> [选择在其中创建订阅的数据库名]/[也可以新建一个库名]
-> [下一步] -> [允许匿名订阅] -> [是,生成匿名订阅]
-> [下一步] -> [初始化订阅] -> [是,初始化架构和数据]
-> [下一步] -> [快照传送] -> [使用该发布的默认快照文件夹中的快照文件]
(订阅服务器要能访问发布服务器的repldata文件夹,如果有问题,可以手工设置网络共享及共享权限)
-> [下一步] -> [快照传送] -> [使用该发布的默认快照文件夹中的快照文件]
-> [下一步] -> [设置分发代理程序调度] -> [使用下列调度] -> [更改] -> [例如每五分钟调度一次]
-> [下一步] -> [启动要求的服务] -> [该订阅要求在发布服务器上运行sqlserveragent服务]
-> [下一步] -> [完成] -> [确定]
成功建立了订阅后,订阅服务器上新增加了一个类别是[repl-分发]作业(合并复制的时候类别是[repl-合并])
它会按照我们给的时间调度表运行数据库同步复制的作业。
3、sql server复制配置好后, 可能出现异常情况的实验日志:
1.发布服务器断网,sql server服务关闭,重启动,关机的时候,对已经设置好的复制没有多大影响
中断期间,分发和订阅都接收到没有复制的事务信息
2.分发服务器断网,sql server服务关闭,重启动,关机的时候,对已经设置好的复制有一些影响
中断期间,发布服务器的事务排队堆积起来
(如果设置了较长时间才删除过期订阅的选项, 繁忙发布数据库的事务日志可能会较快速膨胀),
订阅服务器会因为访问不到发布服务器,反复重试
我们可以设置重试次数和重试的时间间隔(最大的重试次数是9999, 如果每分钟重试一次,可以支持约6.9天不出错)
分发服务器sql server服务启动,网络接通以后,发布服务器上的堆积作业将按时间顺序作用到订阅机器上:
会需要一个比较长的时间(实际上是生成所有事务的insert,update,delete语句,在订阅服务器上去执行)
我们在普通的pc机上实验的58个事务100228个命令执行花了7分28秒.
3.订阅服务器断网,sql server服务关闭,重启动,关机的时候,对已经设置好的复制影响比较大,可能需要重新初试化
我们实验环境(订阅服务器)从18:46分意外停机以, 第二天8:40分重启动后, 已经设好的复制在8:40分以后又开始正常运行了, 发布服务器上的堆积作业将按时间顺序作用到订阅机器上, 但复制管理器里出现快照的错误提示, 快照可能需要重新初试化,复制可能需要重新启动.(我们实验环境的机器并没有进行快照初试化,复制仍然是成功运行的)
4、删除已经建好的发布和定阅可以直接用delete删除按钮
我们最好总是按先删定阅,再删发布,最后禁用发布的顺序来操作。
如果要彻底删去sql server上面的复制设置, 可以这样操作:
[复制] -> 右键选择 [禁用发布] -> [欢迎使用禁用发布和分发向导]
-> [下一步] -> [禁用发布] -> [要在"@servername"上禁用发布]
-> [下一步] -> [完成禁用发布和分发向导] -> [完成]
我们也可以用t-sql命令来完成复制中发布及订阅的创建和删除, 选中已经设好的发布和订阅, 按属标右键可以[生成sql脚本]。(这里就不详细讲了, 后面推荐的网站内有比较详细的内容)
当你试图删除或者变更一个table时,出现以下错误
server: msg 3724, level 16, state 2, line 1
cannot drop the table 'object_name' because it is being used for replication.
比较典型的情况是该table曾经用于复制,但是后来又删除了复制。
处理办法:
select * from sysobjects where replinfo >'0'
sp_configure 'allow updates', 1
go
reconfigure with override
go
begin transaction
update sysobjects set replinfo = '0' where replinfo >'0'
commit transaction
go
rollback transaction
go
sp_configure 'allow updates', 0
go
reconfigure with override
go
‘贰’ “开源”数据同步ETL工具,支持多数据源间的增、删、改数据同步
bboss数据同步可以方便地实现多种数据源之间的数据同步功能,支持增、删、改数据同步,本文为大家程序各种数据同步案例。
使用Apache-2.0开源协议
通过bboss,可以非常方便地采集database/mongodb/Elasticsearch/kafka/hbase/本地或者Ftp日志文件源数据,经过数据转换处理后,再推送到目标库elasticsearch/database/file/ftp/kafka/mmy/logger。
数据导入的方式
支持各种主流数据库、各种es版本以及本地/Ftp日志文件数据采集和同步、加工处理
支持从kafka接收数据;经过加工处理的数据亦可以发送到kafka;
支持将神链单条记录切割为多条记录;
可以将加工后的数据写入File并上传到ftp/sftp服务器;
支持备份采集完毕日志文件功能,可以指定备份文件保存时长,定期清理超过时长文件;
支持自动清理下载完毕后ftp服务器上的文件;
支持excel、csv文件采集(本地和ftp/sftp)
支持导出数据到excel和csv文件,并支持上传到ftp/sftp服务器
提供自定义处理采集数据功能,可以自行将采集的数据按照自己的要求进行处理到目的地,支持数据来源包括:database,elasticsearch,kafka,mongodb,hbase,file,ftp等,想把采集的数据保存到什么地方,有自己实现CustomOutPut接口处理即可。
支持的数据库: mysql,maridb,postgress,oracle ,sqlserver,db2,tidb,hive,mongodb、HBase等
支持的Elasticsearch版本: 1.x,2.x,5.x,6.x,7.x,8.x,+
支持海量PB级数据同步导入功能
支持将ip转换为对应的运营商和城市地理坐标位置信息
支持设置数伏镇据bulk导入任务结果处理回调函数,对每次bulk任务的结果进行成功和失败反馈,然后针对失败的bulk任务通过error和exception方法进行相应处理
支持以下三种作业调度机制:
bboss另一个显着的特色就是直接基于java语言来编写数据同步作业程序,基于强大的java语言和第三方工具包,能够非缺瞎粗常方便地加工和处理需要同步的源数据,然后将最终的数据保存到目标库(Elasticsearch或者数据库);同时也可以非常方便地在idea或者eclipse中调试和运行同步作业程序,调试无误后,通过bboss提供的gradle脚本,即可构建和发布出可部署到生产环境的同步作业包。因此,对广大的java程序员来说,bboss无疑是一个轻易快速上手的数据同步利器。
如果需要增量导入,还需要导入sqlite驱动:
如果需要使用xxjob来调度作业任务,还需要导入坐标:
本文从mysql数据库表td_cms_document导入数据到es中,除了导入上述maven坐标,还需要额外导入mysql驱动坐标(其他数据库驱动程序自行导入): mysql 5.x驱动依赖包
mysql 8.x驱动依赖包(mysql 8必须采用相应版本的驱动,否则不能正确运行)
私信回复:数据同步ETL工具
或访问一飞开源:https://code.exmay.com/
‘叁’ 万字详解ETL和数仓建模
ETL是数据抽取(Extract)、转换(Transform)、加载(Load )的简写,它是将OLTP系统中的数据经过抽取,并将不同数据源的数据进行转换、整合,得出一致性的数据,然后加载到数据仓库中。简而言之ETL是完成从 OLTP系统到OLAP系统的过程
数据仓库(Data Warehouse DW)是基于OLTP系统的数据源,为了便于多维分析和 多角度展现将其数据按特定的模式进行存储而建立的关系型数据库,它不同于多维数据库,数据仓库中的数据是细节的,集成的,数据仓库是面向主题的,是以 OLAP系统为分析目的。它包括星型架构与雪花型架构,其中星型架构中间为事实表,四周为维度表, 类似星星;雪花型架构中间为事实表,两边的维度表可以再有其关联子表,而在星型中只允许一张表作为维度表与事实表关联,雪花型一维度可以有多张表,而星型 不可以。考虑到效率时,星型聚合快,效率高,不过雪花型结构明确,便于与OLTP系统交互。在实际项目中,我们将综合运用星型架构与雪花型架构。
即 确定数据分析或前端展现的某一方面的分析主题,例如我们分析某年某月某一地区的啤酒销售情况,就是一个主题。主题要体现某一方面的各分析角度(维度)和统 计数值型数据(量度),确定主题时要综合考虑,一个主题在数据仓库中即为一个数据集市,数据集市体现了某一方面的信息,多个数据集市构成了数据仓库。
在 确定了主题以后,我们将考虑要分析的技术指标,诸如年销售额此类,一般为数值型数据,或者将该数据汇总,或者将该数据取次数,独立次数或取最大最小值 等,这样的数据称之为量度。量度是要统计的指标,必须事先选择恰当,基于不同的量度可以进行复杂关键性能指标(KPI)等的计算。
在 确定了量度之后我们要考虑到该量度的汇总情况和不同维度下量度的聚合情况,考虑到量度的聚合程度不同,我们将采用“最小粒度原则”,即将量度的粒度设置 到最小,例如我们将按照时间对销售额进行汇总,目前的数据最小记录到天,即数据库中记录了每天的交易额,那么我们不能在ETL时将数据进行按月或年汇总, 需要保持到天,以便于后续对天进行分析。而且我们不必担心数据量和数据没有提前汇总带来的问题,因为在后续的建立CUBE时已经将数据提前汇总了。
维 度是要分析的各个角度,例如我们希望按照时间,或者按照地区,或者按照产品进行分析,那么这里的时间、地区、产品就是相应的维度,基于不同的维度我们可 以看到各量度的汇总情况,我们可以基于所有的维度进行交叉分析。这里我们首先要确定维度的层次(Hierarchy)和级别(Level)(图 四:pic4.jpg),维度的层次是指该维度的所有级别,包括各级别的属性;维度的级别是指该维度下的成员,例如当建立地区维度时我们将地区维度作为一 个级别,层次为省、市、县三层,考虑到维度表要包含尽量多的信息,所以建立维度时要符合“矮胖原则”,即维度表要尽量宽,尽量包含所有的描述性信息,而不 是统计性的数据信息。
还有一种常见的情况,就是父子型维度,该维度一般用于非叶子节点含有成员等情况,例如公司员工 的维度,在统计员工的工资时,部 门主管的工资不能等于下属成员工资的简单相加,必须对该主管的工资单独统计,然后该主管部门的工资等于下属员工工资加部门主管的工资,那么在建立员工维度 时,我们需要将员工维度建立成父子型维度,这样在统计时,主管的工资会自动加上,避免了都是叶子节点才有数据的情况。
另外,在建立维度表时要充 分使用代理键,代理键是数值型的ID号码,好处是代理键唯一标识了每一维度成员信息,便于区分,更重要的是在聚合时由于数值型匹 配,JOIN效率高,便于聚合,而且代理键对缓慢变化维度有更重要的意义,它起到了标识 历史 数据与新数据的作用,在原数据主键相同的情况下,代理键起到了 对新数据与 历史 数据非常重要的标识作用。
有时我们也会遇到维度缓慢变化的情况,比如增加了新的产品,或者产品的ID号码修改了,或者产品增加了一个新的属性,此时某一维度的成员会随着新的数据的加入而增加新的维度成员,这样我们要考虑到缓慢变化维度的处理,对于缓慢变化维度,有三种情况:
在确定好事实数据和维度后,我们将考虑加载事实表。
在公司的大量数据堆积如山时,我们想看看里面究竟是什么,结果发现里面是一笔笔生产记录,一笔笔交易记录… 那么这些记录是我们将要建立的事实表的原始数据,即关于某一主题的事实记录表。
我 们的做法是将原始表与维度表进行关联,生成事实表(图六:pic6.jpg)。注意在关联时有为空的数据时(数据源脏),需要使用外连接,连接后我们将 各维度的代理键取出放于事实表中,事实表除了各维度代理键外,还有各量度数据,这将来自原始表,事实表中将存在维度代理键和各量度,而不应该存在描述性信 息,即符合“瘦高原则”,即要求事实表数据条数尽量多(粒度最小),而描述性信息尽量少。
如果考虑到扩展,可以将事实表加一唯一标识列,以为了以后扩展将该事实作为雪花型维度,不过不需要时一般建议不用这样做。
事 实数据表是数据仓库的核心,需要精心维护,在JOIN后将得到事实数据表,一般记录条数都比较大,我们需要为其设置复合主键和索引,以为了数据的完整性和 基于数据仓库的查询性能优化,事实数据表与维度表一起放于数据仓库中,如果前端需要连接数据仓库进行查询,我们还需要建立一些相关的中间汇总表或物化视图,以方便查询。
在构建数据仓库时,如果数据源位于一服务器上,数据仓库在另一 服务器端,考虑到数据源Server端访问频繁,并且数据量大,需要不断更新,所以可以建立准备区数据库(图七:pic7.jpg)。先将数据抽取到准备 区中,然后基于准备区中的数据进行处理,这样处理的好处是防止了在原OLTP系统中中频繁访问,进行数据运算或排序等操作。例如我们可以按照天将数据抽取 到准备区中,基于数据准备区,我们将进行数据的转换,整合,将不同数据源的数据进行一致性处理。数据准备区中将存在原始抽取表,一些转换中间表和临时表以 及ETL日志表等。
时间维度对于某一事实主题来说十分重要,因为不同的时间有不同的统计数据信息,那么按照时间记录 的信息将发挥很重要的作用。在ETL中,时间戳有其特殊的 作用,在上面提到的缓慢变化维度中,我们可以使用时间戳标识维度成员;在记录数据库和数据仓库的操作时,我们也将使用时间戳标识信息,例如在进行数据抽取 时,我们将按照时间戳对OLTP系统中的数据进行抽取,比如在午夜0:00取前一天的数据,我们将按照OLTP系统中的时间戳取GETDATE到 GETDATE减一天,这样得到前一天数据。
在对数据进行处理时,难免会发生数据处理错误,产生出错信息,那么我们 如何获得出错信息并及时修正呢? 方法是我们使用一张或多张Log日志表,将出错信息记录下来,在日志表中我们将记录每次抽取的条数,处理成功的条数,处理失败的条数,处理失败的数据,处 理时间等等,这样当数据发生错误时,我们很容易发现问题所在,然后对出错的数据进行修正或重新处理。
在对数据仓库进行 增量更新时必须使用调度(图八:pic8.jpg),即对事实数据表进行增量更新处理,在使用调度前要考虑到事实数据量,需要多长时间更 新一次,比如希望按天进行查看,那么我们最好按天进行抽取,如果数据量不大,可以按照月或半年对数据进行更新,如果有缓慢变化维度情况,调度时需要考虑到 维度表更新情况,在更新事实数据表之前要先更新维度表。
调度是数据仓库的关键环节,要考虑缜密,在ETL的流程搭建好后,要定期对其运行,所以 调度是执行ETL流程的关键步骤,每一次调度除了写入Log日志表 的数据处理信息外,还要使用发送Email或报警信息等,这样也方便的技术人员对ETL流程的把握,增强了安全性和数据处理的准确性。
ETL构建数据仓库需要简单的五步,掌握了这五步的方法我们将构建一个强大的数据仓库,不过每一步都有很深的需要研究与挖掘,尤其在实际项目中,我们要综合考虑,例如如果数据源的脏数据很多,在搭建数据仓库之前我们首先要进行数据清洗,以剔除掉不需要的信息和脏数据。
总之,ETL是数据仓库的核心,掌握了ETL构建数据仓库的五步法,就掌握了搭建数据仓库的根本方法。不过,我们不能教条,基于不同的项目,我们还将要进行 具体分析,如父子型维度和缓慢变化维度的运用等。在数据仓库构建中,ETL关系到整个项目的数据质量,所以马虎不得,必须将其摆到重要位置,将ETL这一 大厦根基筑牢。
如果ETL和SQL来说,肯定是SQL效率高的多。但是双方各有优势,先说ETL,ETL主要面向的是建立数据仓库来使用的。ETL更偏向数据清洗,多数据源数据整合,获取增量,转换加载到数据仓库所使用的工具。比如我有两个数据源,一个是数据库的表,另外一个是excel数据,而我需要合并这两个数据,通常这种东西在SQL语句中比较难实现。但是ETL却有很多现成的组件和驱动,几个组件就搞定了。还有比如跨服务器,并且服务器之间不能建立连接的数据源,比如我们公司系统分为一期和二期,存放的数据库是不同的,数据结构也不相同,数据库之间也不能建立连接,这种情况下,ETL就显得尤为重要和突出。通过固定的抽取,转换,加载到数据仓库中,即可很容易实现。
那么SQL呢?SQL事实上只是固定的脚本语言,但是执行效率高,速度快。不过灵活性不高,很难跨服务器整合数据。所以SQL更适合在固定数据库中执行大范围的查询和数据更改,由于脚本语言可以随便编写,所以在固定数据库中能够实现的功能就相当强大,不像ETL中功能只能受组件限制,组件有什么功能,才能实现什么功能。
所以具体我们在什么时候使用ETL和SQL就很明显了,当我们需要多数据源整合建立数据仓库,并进行数据分析的时候,我们使用ETL。如果是固定单一数据库的数据层次处理,我们就使用SQL。当然,ETL也是离不开SQL的。
主要有三大主流工具,分别是Ascential公司的Datastage、Informatica公司的Powercenter、NCR Teradata公司的ETL Automation.还有其他开源工具,如PDI(Kettle)等。
DW系统以事实发生数据为基础,自产数据较少。
一个企业往往包含多个业务系统,均可能成为DW数据源。
业务系统数据质量良莠不齐,必须学会去伪存真。
业务系统数据纷繁复杂,要整合进数据模型。
源数据之间关系也纷繁复杂,源数据在加工进DW系统时,有些必须遵照一定的先后次序关系;
流水事件表:此类源表用于记录交易等动作的发生,在源系统中会新增、大部分不会修改和删除,少量表存在删除情况。如定期存款登记簿;
常规状态表:此类源表用于记录数据信息的状态。在源系统中会新增、修改,也存在删除的情况。如客户信息表;
代码参数表:此类源表用于记录源系统中使用到的数据代码和参数;
数据文件大多数以1天为固定的周期从源系统加载到数据仓库。数据文件包含增量,全量以及待删除的增量。
增量数据文件:数据文件的内容为数据表的增量信息,包含表内新增及修改的记录。
全量数据文件:数据文件的内容为数据表的全量信息,包含表内的所有数据。
带删除的增量:数据文件的内容为数据表的增量信息,包含表内新增、修改及删除的记录,通常删除的记录以字段DEL_IND='D'标识该记录。
可划分为: 历史 拉链算法、追加算法(事件表)、Upsert算法(主表)及全删全加算法(参数表);
历史 拉链:根据业务分析要求,对数据变化都要记录,需要基于日期的连续 历史 轨迹;
追加(事件表):根据业务分析要求,对数据变化都要记录,不需要基于日期的连续 历史 轨迹;
Upsert(主表):根据业务分析要求,对数据变化不需要都要记录,当前数据对 历史 数据有影响;
全删全加算法(参数表):根据业务分析要求,对数据变化不需要都要记录,当前数据对 历史 数据无影响;
所谓拉链,就是记录 历史 ,记录一个事务从开始,一直到当前状态的所有变化信息(参数新增开始结束日期);
一般用于事件表,事件之间相对独立,不存在对 历史 信息进行更新;
是update和insert组合体,一般用于对 历史 信息变化不需要进行跟踪保留、只需其最新状态且数据量有一定规模的表,如客户资料表;
一般用于数据量不大的参数表,把 历史 数据全部删除,然后重新全量加载;
历史 拉链,Upsert,Append,全删全加;加载性能:全删全加,Append,Upsert, 历史 拉链;
APPEND算法,常规拉链算法,全量带删除拉链算法;
APPEND算法,MERGE算法,常规拉链算法,基于增量数据的删除拉链算法,基于全量数据的删除拉链算法,经济型常规拉链算法,经济型基于增量数据的删除拉链算法,经济型基于全量数据的删除拉链算法,PK_NOT_IN_APPEND算法,源日期字段自拉链算法;
此算法通常用于流水事件表,适合这类算法的源表在源系统中不会更新和删除,而只会发生一笔添加一笔,所以只需每天将交易日期为当日最新数据取过来直接附加到目标表即可,此类表在近源模型层的字段与技术缓冲层、源系统表基本上完全一致,不会额外增加物理化处理字段,使用时也与源系统表的查询方式相同;
此算法通常用于无删除操作的常规状态表,适合这类算法的源表在源系统中会新增、修改,但不删除,所以需每天获取当日末最新数据(增量或全增量均可),先找出真正的增量数据(新增和修改),用它们将目标表中属性发生修改的开链数据(有效数据)进行关链操作(即END_DT关闭到当前业务日期),然后再将最新的增量数据作为开链数据插入到目标表即可。
此类表再近源模型层比技术缓冲层、源系统的相应表额外增加两个物理化处理字段START_DT(开始日期)和END_DT(结束日期),使用时需要先选定视觉日期,通过START_DT和END_DT去卡视觉日期,即START_DT'视觉日期';
此算法通常用于有删除操作的常规状态类表,并且要求全量的数据文件,用以对比出删除增量;适合这类算法的源表在源系统中会新增,修改,删除,每天将当日末最新全量数据取过来外,分别找出真正的增量数据(新增,修改)和删除增量数据,用它们将目标表中属性发生修改的开链数据(有效数据)进行关链操作(即END_DT关闭到当前业务日期),然后再将最新增量数据中真正的增量及删除数据作为开链数据插入到目标表即可,注意删除记录的删除标志DEL_IND会设置为‘D’;
此类表在近源模型层比技术缓冲层,源系统的相应表额外增加三个物理化处理字段START_DT(开始日期),ENT_DT(结束日期),DEL_IND(删除标准)。使用方式分两类:一时一般查询使用,此时需要先选定视角日期,通过START_DT和END_DT去卡视角日期,即START_DT‘视角日期’,同时加上条件DEL_IND 'D';另一种是下载或获取当日增量数据,此时就是需要START_DT'视角日期' 一个条件即可,不需要加DEL_IND 'D'的条件。
此算法通常用于流水事件表,适合这类算法的源表在源系统中不会更新和删除,而只会发生一笔添加一笔,所以只需每天将交易日期为当日的最新数据取过来直接附加到目标表即可;
通常建一张名为VT_NEW_编号的临时表,用于将各组当日最新数据转换加到VT_NEW_编号后,再一次附加到最终目标表;
此算法通常用于无删除操作的常规状态表,一般是无需保留 历史 而只保留当前最新状态的表,适合这类算法的源表在源系统中会新增,修改,但不删除,所以需获取当日末最新数据(增量或全量均可),用于MERGE IN或UPSERT目标表;为了效率及识别真正增量的要求,通常先识别出真正的增量数据(新增及修改数据),然后再用这些真正的增量数据向目标表进行MERGE INTO操作;
通常建两张临时表,一个名为VT_NEW_编号,用于将各组当日最新数据转换加到VT_NEW_编号;另一张名为VT_INC_编号,将VT_NEW_编号与目标表中昨日的数据进行对比后找出真正的增量数据(新增和修改)放入VT_INC_编号,然后再用VT_INC_编号对最终目标表进行MERGE INTO或UPSERT。
此算法通常用于无删除操作的常规状态表,适合这类算法的源表在源系统中会新增、修改,但不删除,所以需每天获取当日末最新数据(增量或全增量均可),先找出真正的增量数据(新增和修改),用它们将目标表中属性发生修改的开链数据(有效数据)进行关链操作(即END_DT关闭到当前业务日期),然后再将最新增量数据作为开链数据插入到目标表即可;
通常建两张临时表,一个名为VT_NEW_编号,用于将各组当日最新数据转换加到VT_NEW_编号;另一张名为VT_INC_编号,将VT_NEW_编号与目标表中昨日的数据进行对比后找出真正的增量数据(新增和修改)放入VT_INC_编号,然后再将最终目标表的开链数据中的PK出现在VT_INT_编号中进行关链处理,然后将VT_INC_编号中的所有数据作为开链数据插入最终目标表即可。
此算法通常用于有删除操作的常规状态表,并且要求删除数据是以DEL_IND='D'删除增量的形式提供;适合这类算法的源表再源系统中会新增、修改、删除,除每天获取当日末最新数据(增量或全量均可)外,还要获取当日删除的数据,根据找出的真正增量数据(新增和修改)以及删除增量数据,用它们将目标表中属性发生修改的开链数据(有效数据)进行关链操作(即END_DT关闭到当前业务时间),然后再将增量(不含删除数据)作为开链数据插入到目标表中即可;
通常建三张临时表,一个名为VT_NEW_编号,用于将各组当日最新数据 (不含删除数据)转换加载到VT_NEW_编号;第二张表名为VT_INC_编号,用VT_NEW_编号与目标表中的昨日的数据进行对比后找出真正的增量数据放入VT_INC_编号;第三张表名为VT_DEL_编号,将删除增量数据转换加载到VT_DEL_编号;最后再将最终目标表的开链数据中PK出现在VT_INC_编号或VT_DEL_编号中的进行关链处理,最后将VT_INC_编号中的所有数据作为开链数据插入最终目标表即可;
此算法通常用于有删除操作的常规状态表,并且要求提供全量数据,用以对比出删除增量;适合这类算法的源表在源系统中会新增、修改、每天将当日末的最新全量数据取过来外,分别找出真正的增量数据(新增、修改)和删除增量数据,用它们将目标表中属性发生修改的开链数据(有效记录)进行关链操作(即END_DT关闭到当前业务时间),然后再将最新数据中真正的增量数据(不含删除数据)作为开链数据插入到目标表即可;
通常建两张临时表,一个名为VT_NEW_编号,用于将各组当日最新全量数据转换到VT_NEW_编号;另一张表名为VT_INC_编号,将VT_NEW_编号与目标表中昨日的数据进行对比后找出真正的增量数据(新增、修改)和删除增量数据放入VT_INC_编号,注意将其中的删除增量数据的END_DT置以最小日期(借用);最后再将最终目标表的开链数据中PK出现再VT_INC_编号或VT_DEL_编号中的进行关链处理,然后将VT_INC_编号中所有的END_DT不等于最小日期数据(非删除数据)作为开链数据插入最终目标表即可;
此算法基本等同与常规拉算法,只是在最后一步只将属性非空即非0的记录才作为开链数据插入目标表;
此算法基本等同于基于增量数据删除拉链算法,只是在最后一步只将属性非空及非0的记录才作为开链数据插入目标表;
此算法基本等同于基于全量数据删除拉链算法,只是在最后一步只将属性非空及非0的记录才作为开链数据插入目标表;
此算法是对每一组只将PK在当前VT_NEW_编号表中未出现的数据再插入VT_NEW_编号表,最后再将PK未出现在目标表中的数据插入目标表,以保证只进那些PK未进过的数据;
此算法是源表中有日期字段标识当前记录的生效日期,本算法通过对同主键记录按这个生效日期排序后,一次首尾相连行形成一条自然拉链的算法
‘肆’ ETL过程的数据清洗和整合
主要目的是记录ETL流水线过程中所有质量单元出现的错误时间。也可用于其他应用之间传输数据的集成应用中。
如图:
错误事件事实表:
主表。包含错误日历日期,错误产生的批处理作业以及产生错误的单元模块。
每个错误在表中用一行表示。
包含一个单列的主键,作为错误时间的键。
批处理维度:
可以泛华为针对数据流的处理步骤,而不仅仅是针对批处理。
错误事件细节事实表:
每行确定与错误有关的某个特定记录的个体字段。因此某个高级别的错误事件事实表中的一行激活的复杂结构或业务规则对应错误细节事实表中的多行。
审计维度用于后端装配ETL系统的每个事实表。
在货运事实表将按照批处理文件每天更新一次,假设一天的工作顺利进行没有产生错误标记,此时将建立唯一的一行审计维度,将被附加到今天所加载的所有事实行。所有的分类,分数,版本号都将相同
假设出现异常情况,则需要不止一个审计维度行用于标记这一情况。
重复数据删除:需要考虑保留那些数据
匹配和数据保留:按照来自所有可能源系统的列值并且清楚的定义了优先顺序的业务规则,用于确保每个存在的行具有最佳的保留属性。
一致性处理包含所有需要调整维度中的一些或者所有列的内容以与数据仓库中其他相同或者类似的维度保持一致的步骤。
建立一致性维度的过程需要采用敏捷方法,对两个需要一致性处理的维度,他们必须至少有一个具有相同名称和内容的公共属性。
数据仓库-概述-读书笔记一
数据仓库-DW/BI架构对比-读书笔记二
数据仓库-事实表/维度表技术-读书笔记三
维度处理-数据仓库-读书笔记(四)
数据仓库-高级事实表技术-读书笔记五
数据仓库-高级维度表技术-读书笔记六
数据仓库,零售业务举例,维度模型设计4步骤,读书笔记(七)
数据仓库-零售业务举例维度表设计细节-读书笔记(八)
数据仓库-零售业务举例如何提高仓库扩展能力-读书笔记(九)
数据仓库-零售业务中库存如何设计-读书笔记(十)
如何使用缓慢变化维技术
数据仓库-订单管理应该注意那些
ETL中前期数据分析、变化数据探测,数据获取 注意事项
数据仓库基础概念分享
数据仓库工具箱
如果您觉得我用心了,觉得您有所收获,麻烦关注下我吧,您的关注就是我的动力,因为有你,我就不是一个人在前行。
‘伍’ Etl工具将sqlserver数据同步到oracle设计说明
软件说明
通过etl工具定时将SqlServer指定的表数据同步到oracle数据库
在数据库建立增删改的触发器。触发器将变更放到临时表里。
通过etl工具读取临时表同步给oracle
优点:兄缓笑比较实时
缺点:哪芦影响到业务系统,因为需要在业务系统建立触发器
实例说明:
例如在sqlserver有一张用户表(sys_user)需定时同步oracle数据库的用户表,
包括新增、删除、修改同步
给同步的表建三类触发器:
insert触发器:向表中插入数据时被触发;
update触发器:修改表中数据时被触发;
delete触发器:从表中删除数据时被触发。
以sqlserver的用户表举例,
Sqlserver的sys_user表,有两个字段id,name
具体流程:
以新增数据举例
Ø 一、在sqlserver新建触发器trigger_sysuser_insert
if (object_id('trigger_sysuser_insert') is not null)
drop trigger trigger_sysuser_insert
go
create trigger trigger_sysuser_insert
on sys_user --表名
for insert --插入后触发
--instead of insert --插入前触发,使用插入前触发时,不执行默认插入
as
--开始执行逻辑
declare @id int, @name varchar(20);
select @id = id, @name = name from sys_user; -------------- inserted 存放了当前插入的值
--select @name,@age
---创建临时表
if not exists (select * from sysobjects where id = object_id('##sys_user_insert')
and OBJECTPROPERTY(id, 'IsUserTable') = 1)
create table ##sys_user_insert
(
id int,
name varchar(32)
);
insert into ##sys_user_insert (id,name) values(@id,@name);
go
在sys_user新增数据时会被触发,将新增的数据加入临时表##sys_user_insert,此时
的临时表 ##sys_user_insert会增加一条记录
Ø 二、配置elt流程
节点1 从临时表读取数据,写入数据流
节点2 从数据流获取数据写入oracle
节点3 从sqlserver的临时表删除已经被同步的记录
Ø 三、建立作业调度
设置调度周期
适用增量数据同步
在要同步的源表羡含里有时间戳字段,每当数据发生新增,时间戳会记录发生变化的时间,etl工具根据时间范围定时同步数据
优点:基本不影响业务系统
缺点:要求源表必须有时间戳这一列,适用增量场景,修改、删除不太适用
定时清空oracle数据源,将sqlserver的数据全盘拷贝到oracle数据源。一般用于数据量不大,实时性要求不高的场景。
优点:基本不影响业务系统,开发、部署都很简单
缺点:效率低
Etl流程
结论
准能现场数据同步,涉及增、删、改的同步,比较适用触发器的方式进行数据同步,但触发器仍会存在失效的情况,若现场有数据质量系统,定期数据稽核,查缺补漏,保证两边数据库的一致性;
‘陆’ 如何实现多个系统间的数据同步
像这样的需求,完全可以考虑上数据中心,用ETL作数据同旦梁姿步。
好处自然是可以把项目做大,可扩模绝展性强。
甲方是否同意就看你们的市场和渣判售前了