项目背景信息
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]-->1、 <!--[endif]-->由于随着应用系统不断增长,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]-->2、 <!--[endif]-->停止所有的应用程序。
<!--[if !supportLists]-->3、 <!--[endif]-->由于目前已经存在OA.BS_RECORD对应的历史表OA.BS_RECORD_HIS,因此首先需要创建作为历史数据表的中间表OA.BS_RECORD_ZT,将OA.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]-->4、 <!--[endif]-->创建exchange partition需要的中间普通表OA.BS_RECORD_770A到OA.BS_RECORD_780H等一系列表,分区表OA.BS_RECORD中每一个需要迁移的历史数据分区都对应一个普通表,总共是88个表,表结构和字段与OA.BS_RECORD一样,唯一不同的是中间表是普通表,OA.BS_RECORD是分区表。
<!--[if !supportLists]-->5、 <!--[endif]-->进行历史数据迁移步骤,步骤如下:
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]-->a) <!--[endif]-->采用这样方法迁移的原因是由于这样迁移数据操作非常快,由于采用exchange partition在数据库内部只是修改数据库内部系统字典表中的信息,并没有进行数据在两个表之间的相互迁移工作,因此上述两个SQL语句执行不到1秒钟就可以结束。
<!--[if !supportLists]-->b) <!--[endif]-->采用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]-->c) <!--[endif]-->确认OA.BS_RECORD表中迁移出历史数据的分区不再使用,将相关的分区删除掉。
Sql>alter table OA.BS_RECORD drop partition p770A;
…
Sql>alter table OA.BS_RECORD drop partition p780H;
<!--[if !supportLists]-->6、 <!--[endif]-->启动所有的应用程序,不过在这段时间内对OA.BS_RECORD_HIS的历史数据查询应用不能正常使用。
<!--[if !supportLists]-->7、 <!--[endif]-->在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/