需求背景最近公司打算对几大业务系统的数据进行集中处理,希望将各个业务系统中的数据集中到数据仓库中。一共5000多张数据表,好在业务数据量没有电商那么庞大,只有几十G。需求分析其实这个需求很简单,就是把不同数据库的5000多张表放在一个地方。需要注意以下几点:1、数据来自各种类型的数据库,包括SQLServer、MySQL、Oracle2、表数据量大,一个个写查询代码肯定不现实一。3、后续数据仓库的维护计划建议因为数据量不是很大,打算使用DBLINK将不同库的数据抽取到数据仓库中。解决思路1.创建不同的DBLINK数据仓库我们目前使用的是SQLServer服务器,整体性能还不错。但是,业务系统的数据库类型不同,创建DBLINK时有不同的要求:a.SQLServer的业务数据库可以直接在服务器上创建;b.MySQL和Oracle的业务数据库需要配置ODBC作为中间组件。2、查询数据库中的所有表及表名。每个业务数据库都是从整个数据库中提取出来的,所以首先你需要找到这些数据库中的所有表。这里我们以SQLServer为例,查找数据库中的所有表。SELECTNAMEFROMSYSOBJECTSWHERETYPE='U'上面的代码可以查询当前库中所有表的表名。我在家里的电脑上测试过,截图给大家看:你也可以在自己的电脑上试试。试试吧。Oracle获取用户表名的代码如下:SELECT*FROMUSER_TABLES;MySQL获取用户表名的代码如下:selecttable_namefrominformation_schema.tableswheretable_schema='db_name';3、数据的循环抽取完成以上两步后,我们就可以开始从各个业务系统中循环抽取数据了。这里需要写一个游标循环执行。具体代码如下:DECLARE@TableNamevarchar(50),@Sqlvarchar(500)--定义两个变量,一个用来存放表名,一个用来存放插入语句插入游标的名称selectnamefrom[192.168.0.39].[test].[dbo].sysobjectswherextype='u'orderbyname;OPENcursor_variable--打开游标FETCHNEXTFROMcursor_variableINTO@TableName--获取游标中的数据插入变量WHILE@@FETCH_STATUS=0--循环执行,直到读取游标中的数据BEGINSET@Sql='select*intodbo.'+@TableName+'from[192.168.0.39].[test].[dbo].'+@TableNameExec@SqlFETCHNEXTFROMcursor_variableINTO@TableNameENDCLOSEcursor_variable--关闭游标DEALLOCATEcursor_variable;--释放游标目前只是测试代码,以后可以进一步优化性能。4、设置定时任务的代码写完之后,每天手动去执行肯定是不行的。这时候我们就可以使用数据库的定时任务了,我在上一篇文章中有提到。《数据库任务自动化其实很简单,JOB的简单介绍》我们把代码放到定时任务里,让它每天凌晨1点执行。综上所述,该方法在处理的数据量较小时是可行的。如果数据量很大,性能上会有更大的风险。回顾一下我们做了什么:1.创建不同数据库的DBLINK2.查询每个数据库的所有表名3.使用游标插入数据仓库4.设置定时任务执行上面的游标。每一步都可能会出现问题,但是只要解决了这些问题,这件事情就迎刃而解了。感觉不错,记得转发分享给更多的人哦~
