数据仓库的数据量一般是非常巨大的,我们需要每天都备份吗?这一点我至今还是不懂,只是感觉数据仓库最起码是从生产库流过来的数据没必要做完完全全的备份,但是备份还是需要的,比如我们的ETL流程如下
1:环境了解
环境:SQLServer2008R2
数据仓库的抽取过程如下
图像分析:
生产库→ods:采用的是SSIS,那么这一步我们只保存SSIS的程序包即可,因为ODS是最大限度的和业务库保持一致的原始数据
ods→dw:采用的是一个存储过程循环抽取视图的办法,原则上ods层有多少个视图,dw层就有多少个表
USE [SZCH_ODS_HIS] GO /****** Object: StoredProcedure [dbo].[ODSTODW] Script Date: 08/13/2015 16:26:59 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[ODSTODW] WITH EXEC AS CALLER AS declare viewsfrom cursor for select t.name from sysobjects t where xtype='V'; open viewsfrom; declare @viewname nvarchar(200); declare @sqlstr nvarchar(1000); while @@FETCH_STATUS=0 begin set @sqlstr = 'drop table [DW_HIS].dbo.'+@viewname; print '删除表'+@viewname exec(@sqlstr); begin try set @sqlstr = 'select * into [DW_HIS].dbo.'+ @viewname+' from [ODS_HIS].[dbo].['+@viewname+']'; print '抽取表'+@viewname exec(@sqlstr); print '完成处理'+@viewname end try begin catch insert into ETLConfiguration.dbo.ODSToDWErrMsg select @viewname,ERROR_MESSAGE(),GETDATE() end catch fetch next from viewsfrom into @viewname; end close viewsfrom; deallocate viewsfrom; GO
dw→target :和ods→dw的处理方法一样
2:设计方案
根据我们的DW抽取方案,本人感觉备份了SSIS程序之后ODS层的数据基本上可以保证OK了,大不了重新抽一个全量,可能会很耗时,当然这个地方是可以优化的。我们最简单的
方法就是备份ods和dw层的view创建脚本和procedure创建脚本,那么如何实现呢
2.1:相关脚本
--------------------------------------------------------------------相关技术---------------------------------------------------------------------------------
获取目标数据库中(sqlserver)所有视图和存储的创建脚本
select o.xtype,o.name,cm.text from syscomments cm inner join sysobjects o on o.id=cm.id where xtype ='p' or xtype ='v' order by o.xtype,o.name,cm.text
效果如下
另附:
-- 获得视图和存储过程创建语句
select o.xtype,o.name,cm.text from syscomments cm
inner join sysobjects o on o.id=cm.id
where xtype ='p' or xtype ='v'
order by o.xtype,o.name,cm.text
select * from sysobjects
where xtype='u'
-- 查询所有表名、字段名、类型、长度
select o.name, c.name,t.name,c.length from syscolumns c
inner join systypes t on c.xtype= t.xtype
inner join sysobjects o on c.id= o.id
where o.xtype='u'
order by o.name, c.name,t.name
-- 所有数据都来自于这四张表
--select * from sysobjects
--select * from syscolumns
--select * from syscomments
--select * from systypes
--------------------------------------------------------------------相关技术---------------------------------------------------------------------------------
2.2:操作步骤
通过2.1的脚本和SSIS把结果集放入到一个表中,例如BACK_UP库
这样我们就备份了ods和dw的所有视图和存储的创建脚本,恢复的时候首先恢复视图然后执行存储即可恢复数据,别忘了按层级恢复
实现效果:
我们实现了利用备份对象结构的的小数据量的方法备份了数据仓库的相关结构和抽取方法,恢复的时候就是一个抽取时间的问题了
当然如果条件允许,我们还是建议双机热备的、还有传说中的容灾备份,除了问题切换一下就好的理想方案,这里只说一个小的思
路,而且还是在特定环境下的,一般的如果DW的每一层都是采用KETTLE或者SSIS这些ETL工具抽取而成的话,那么我们就更省
事了,是不是只备份ETL程序就好了呢,事实上情况还是复杂的多了,比如我们有手工创建的一些枚举值表等等,接下来面对数据
仓库庞大的数据量,你感觉有没有必要每天备份呢?有好的想法吗?那么来信告诉我吧,希望和大家在BI这条路上一起进步与共勉