• 数据仓库备份思路


    数据仓库的数据量一般是非常巨大的,我们需要每天都备份吗?这一点我至今还是不懂,只是感觉数据仓库最起码是从生产库流过来的数据没必要做完完全全的备份,但是备份还是需要的,比如我们的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这条路上一起进步与共勉

  • 相关阅读:
    X lvm管理:扩展lv、删除pv、lv,删除物理卷PV
    X 如何在Linux中缩小LVM大小(逻辑卷调整)如何在Linux中缩小LVM大小(逻辑卷调整)
    元素和为目标值的子矩阵数量
    完美矩形问题
    桶排序算法
    组合数组合
    求两个有序数组的第k大的数(默认两有序数组都为从小到大)
    二叉树的遍历
    卡特兰数
    二叉排序树
  • 原文地址:https://www.cnblogs.com/wxjnew/p/4727785.html
Copyright © 2020-2023  润新知