数据库分区案例分析 2:分区在迁移历史数据中的应用

 

项目背景信息

BS系统营业数据库MARKET准备对含有历史数据的表OA.BS_RECORD和OA.BS_RECORD_HIS表进行历史数据迁移,需要进行测试和准备工作。

 

首先,和客户一起进行OA.BS_RECORD表的历史数据迁移由于OA.BS_RECORD是分区表,OA.BS_RECORD表的历史数据迁移的思路主要是利用分区表的exchange partition with table来进行,然后接着重建对应表上相关联的索引,最后使用rename table来实现。

 

大致步骤建议可以参考如下:

<!--[if !supportLists]--&gt1、  <!--[endif]--&gt由于随着应用系统不断增长,OA.BS_RECORD表不断扩大,目前已经有6亿多条记录,需要进行历史数据迁移,保留最近三个月的数据。

SQL> select sum(bytes)/1024/1024/1024 from dba_segments where segment_name='BS_RECORD';

 

SUM(BYTES)/1024/1024/1024

-------------------------

               100.701416

<!--[if !supportLists]--&gt2、  <!--[endif]--&gt停止所有的应用程序。

<!--[if !supportLists]--&gt3、  <!--[endif]--&gt由于目前已经存在OA.BS_RECORD对应的历史表OA.BS_RECORD_HIS,因此首先需要创建作为历史数据表的中间表OA.BS_RECORD_ZTOA.BS_RECORD表中的历史数据迁移到OA.BS_RECORD_ZT表中。创建OA.BS_RECORD_ZT表的DDL语句可以根据开发提供的原始的OA.BS_RECORD建表脚本修改。如果没有保留以前建表的语句,使用下面的语句得到最初建立表的语句,然后稍做修改:

set heading off;

set echo off;

Set pages 999;

set long 90000;

select dbms_metadata.get_ddl('对象类型','对象名','用户名') from dual;

 

<!--[if !supportLists]--&gt4、  <!--[endif]--&gt创建exchange partition需要的中间普通表OA.BS_RECORD_770AOA.BS_RECORD_780H等一系列表分区表OA.BS_RECORD中每一个需要迁移的历史数据分区都对应一个普通表总共是88个表表结构和字段与OA.BS_RECORD一样,唯一不同的是中间表是普通表,OA.BS_RECORD是分区表。

<!--[if !supportLists]--&gt5、  <!--[endif]--&gt进行历史数据迁移步骤,步骤如下:

Sql>alter table OA.BS_RECORD exchange partition p770A with table OA.BS_RECORD_P770A;

Sql>alter table OA.BS_RECORD_ZT exchange partition p770A with table OA.BS_RECORD_P770A without validation;

Sql>alter table OA.BS_RECORD exchange partition p780H with table OA.BS_RECORD_P570H;

Sql>alter table OA.BS_RECORD_ZT exchange partition p780H with table OA.BS_RECORD_P780H without validation;

<!--[if !supportLists]--&gta)     <!--[endif]--&gt采用这样方法迁移的原因是由于这样迁移数据操作非常快,由于采用exchange partition在数据库内部只是修改数据库内部系统字典表中的信息,并没有进行数据在两个表之间的相互迁移工作,因此上述两个SQL语句执行不到1秒钟就可以结束。

<!--[if !supportLists]--&gtb)     <!--[endif]--&gt采用without validation是由于默认是采用with validation,默认with validation在OA.BS_RECORD_P770A数据exchange partition到表OA.BS_RECORD_ZT中时会对表OA.BS_RECORD_P770A中的数据进行分区值的校验,测试中发现校验速度基本是10000条记录/秒,对于OA.BS_RECORD表中有大概7亿多条记录,检验完成时间大概需要70000多秒,迁移时间不能接受。因此采用without validation方式,同时在脚本中对exchange partition中对应的表分区和中间普通表进行一一对应校验,确认不发生分区错位。

<!--[if !supportLists]--&gtc)     <!--[endif]--&gt确认OA.BS_RECORD表中迁移出历史数据的分区不再使用,将相关的分区删除掉。

Sql>alter table OA.BS_RECORD drop partition p770A;

Sql>alter table OA.BS_RECORD drop partition p780H;

<!--[if !supportLists]--&gt6、  <!--[endif]--&gt启动所有的应用程序,不过在这段时间内对OA.BS_RECORD_HIS的历史数据查询应用不能正常使用。

<!--[if !supportLists]--&gt7、  <!--[endif]--&gt在OA.BS_RECORD_ZT表上创建相应的索引,在创建相关的索引完成之后,将OA.BS_RECORD_ZT和OA.BS_RECORD_HIS表进行rename。

Sql>rename table OA.BS_RECORD_HIS to OA.BS_RECORD_HIS_TMP;

Sql>rename table OA.BS_RECORD_ZT to OA.BS_RECORD_HIS;

 

整个历史数据迁移完成之后,检查应用系统是否正常。

 

对于类似需要迁移历史数据的大表,建议采用上述类似方法,同时在建立分区表是考虑加入时间作为分区关键字。例如在分区表OA.BS_RECORD表的分区字段为PARTITION BY RANGE ("MARK_CODE","START_DATE"),分区时考虑到地区自段和时间字段,这样有益于以后历史数据的迁移工作。

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/747/viewspace-464603/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/747/viewspace-464603/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值