![](http://upload-images.jianshu.io/upload_images/2693156-cd4bd3523b428209.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp)
KETTLE模板在文章末尾,建议大家先下载,导入模板后在看文章内容!!!
文章目录
一、获取某个数据库,架构所有表名
二、数据迁移
三、案例
本文使用场景:需要一次性抽取某个架构中的数据,如果迁移数据库可以不用看本篇文章。下面作业的前提是我们的目标库已经建好了表结构,本文中目标表和源表的表名是一样的。
说说我工作中使用的场景:
- 该数据为一次性数据,数据源为sqlserver的bak文件包、共210张表,目标库为oracle数据库。
- 解决方法:将数据还原在sqlserver数据库(本地或者服务器),然后通过KETTLE整架构迁移到目标库中
一、获取某个数据库,架构所有表名
查询还原数据库中所有的表名
可以打开获取表名这个转换,最主要的步骤就是查询数据库中所有的表名。
#查询该数据库中所有的表名
SELECT NAME FROM SysObjects Where XType='U'
![](http://upload-images.jianshu.io/upload_images/2693156-e4082b75585952e3.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp)
二、数据迁移
1、获取变量:获取步骤一结果并设置为变量
2、数据的抽取(数据表的导入)
3、将成功的表名传输到一个文件夹中保存
![](http://upload-images.jianshu.io/upload_images/2693156-c1ba6e77339370d8.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp)
这里面比较难理解,主要有三点。 第三点一定要理解,第三点也是最重要的。
1、获取变量:获取步骤一结果并设置为变量
![](http://upload-images.jianshu.io/upload_images/2693156-8ac5d3761a3433bf.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp)
2、数据的抽取(数据表的导入):接受变量中的表名,在进行抽取
![](http://upload-images.jianshu.io/upload_images/2693156-8c369e2d28f4d748.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp)
3、将成功的表名传输到一个文件夹中保存,记住文件夹位置。
原因:我们一次性抽取几百张表肯定会报错,在报错之前我们肯定抽取过一些表到目标库中(假设我们已经抽取了ABCD4张表)
如果我们解决了报错表的问题,这时在运行作业,就会把之前抽取的ABCD4张表在抽取一遍。会导致目标库中的数据量比数据源多了1倍。
所以报错解决后,已经抽取过的表不需要在抽取。
如果解决勒?我们在设置变量中排除这些表就OK,也就是在第一步获取表名的时候不获取这些表。所以在整个作业中我们除了修改源库目标库的链接外,还需要修改第一步获取某个数据库,架构所有表名
![](http://upload-images.jianshu.io/upload_images/2693156-7b99b6aa3958cf29.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp)
三、案例
第一次执行报错,发现文件夹中有4个表名ABCD四张表名,报错解决后。修改作业中获取表名步骤(整个作业只修改这一个步骤),修改后点执行作业。
SELECT NAME FROM SysObjects Where XType='U'
AND NAME NOT IN(
'表名A',
'表名B',
'表名C',
'表名D')
![](http://upload-images.jianshu.io/upload_images/2693156-47b20630e7b15858.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp)
第二次执行作业时又报错,发现文件夹中有7个表名FGHIJKL7张表名,报错解决后。修改作业中获取表名步骤(整个作业依然修改这一个步骤),修改后点执行作业。
SELECT NAME FROM SysObjects Where XType='U'
AND NAME NOT IN(
'表名A',
'表名B',
'表名C',
'表名D',
'表名F',
'表名G',
'表名H',
'表名I',
'表名G',
'表名K',
'表名L')
![](http://upload-images.jianshu.io/upload_images/2693156-32d817e414ae8b79.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp)
第三次执行作业时又报错,解决方法参考第二次的解决方法。
如果不会可以给我留言,当然所有作业的前提是我们的目标库已经建好了表结构,本文中目标表和源表的表名是一样的。
模板链接:https://pan.baidu.com/s/11Q_jSki3sKkop-8S3X_FiQ 提取码:y0bg