码迷,mamicode.com
首页 > 其他好文 > 详细

用分区表分区交换做历史数据迁移

时间:2014-06-24 17:21:12      阅读:260      评论:0      收藏:0      [点我收藏+]

标签:des   style   class   blog   code   http   

一。说明:


     OLTP库中有些表数据量大,且每月有持续的大量数据增加,由于历史数据在此库中不再做访问,而是在另1个OLAP库中做分析,所以会对历史数据迁移至OLAP库中。对这种历史数据迁移的操作,较好的办法是该表采用分区表。按时间分区后,可以对分区进行迁移。通过分区交换和表空间传输会很容易完成,而且性能上影响很小。


关于分区表更多内容:    http://blog.csdn.net/tanqingru/article/category/1397435 
关于表空间传更多内容: http://blog.csdn.net/tanqingru/article/category/1138527 


二。实例:

整个过程是在OLTP库做分区交换。然后通过表空间传输迁移至OLAP库,最后再做一次分区交换即可。

1.创造需要的环境。



OLTP库环境准备:

SQL> conn /as sysdba
Connected.
SQL> select * from V$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE    11.2.0.3.0      Production
TNS for Linux: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production
SQL> show parameter db_create_file_dest

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_create_file_dest                  string      /data01/qing


create tablespace tan_2013_9 datafile size 5m autoextend on;
create tablespace tan_2013_10 datafile size 5m autoextend on;
create tablespace tan_2013_11 datafile size 5m autoextend on;
create tablespace tan_2013_12 datafile size 5m autoextend on;
create tablespace tan_2014_1 datafile size 5m autoextend on;
create tablespace tan_2014_2 datafile size 5m autoextend on;
create tablespace tan_2014_3 datafile size 5m autoextend on;
create tablespace tan_2014_4 datafile size 5m autoextend on;
create tablespace tan_2014_5 datafile size 5m autoextend on;
create tablespace tan_2014_6 datafile size 5m autoextend on;
create tablespace tan_2014_7 datafile size 5m autoextend on;
create tablespace tan_2014_8 datafile size 5m autoextend on;

conn tan/tan

SQL> create table tan
(t_id number(10),
t_name varchar2(100),
t_date date )
partition by range(t_date)
(partition tan_2013_9 values less than(to_date('2013-10-01','yyyy-mm-dd')) tablespace tan_2013_9,
partition tan_2013_10 values less than(to_date('2013-11-01','yyyy-mm-dd')) tablespace tan_2013_10,
partition tan_2013_11 values less than(to_date('2013-12-01','yyyy-mm-dd')) tablespace tan_2013_11,
partition tan_2013_12 values less than(to_date('2014-01-01','yyyy-mm-dd')) tablespace tan_2013_12,
partition tan_2014_1 values less than(to_date('2014-02-01','yyyy-mm-dd')) tablespace tan_2014_1,
partition tan_2014_2 values less than(to_date('2014-03-01','yyyy-mm-dd')) tablespace tan_2014_2,
partition tan_2014_3 values less than(to_date('2014-04-01','yyyy-mm-dd')) tablespace tan_2014_3,
partition tan_2014_4 values less than(to_date('2014-05-01','yyyy-mm-dd')) tablespace tan_2014_4,
partition tan_2014_5 values less than(to_date('2014-06-01','yyyy-mm-dd')) tablespace tan_2014_5,
partition tan_2014_6 values less than(to_date('2014-07-01','yyyy-mm-dd')) tablespace tan_2014_6,
partition tan_2014_7 values less than(to_date('2014-08-01','yyyy-mm-dd')) tablespace tan_2014_7,
partition tan_2014_8 values less than(to_date('2014-09-01','yyyy-mm-dd')) tablespace tan_2014_8 
);


create index ind_tan on tan(t_date) local
(
partition ind_tan_2013_9  tablespace tan_2013_9,
partition ind_tan_2013_10 tablespace tan_2013_10,
partition ind_tan_2013_11 tablespace tan_2013_11,
partition ind_tan_2013_12 tablespace tan_2013_12,
partition ind_tan_2014_1  tablespace tan_2014_1,
partition ind_tan_2014_2  tablespace tan_2014_2,
partition ind_tan_2014_3 tablespace tan_2014_3,
partition ind_tan_2014_4 tablespace tan_2014_4,
partition ind_tan_2014_5 tablespace tan_2014_5,
partition ind_tan_2014_6 tablespace tan_2014_6,
partition ind_tan_2014_7 tablespace tan_2014_7,
partition ind_tan_2014_8 tablespace tan_2014_8 
);



begin 
for i in 1.. 10000 loop
if( mod(i,12)+1 <=8) then
insert into tan values(i,'tan'||i,to_date('2014-'||(mod(i,12)+1)||'-01','yyyy-mm-dd'));
else 
insert into tan values(i,'tan'||i,to_date('2013-'||(mod(i,12)+1)||'-01','yyyy-mm-dd'));
end if;
end loop;
commit;
end;
/

SQL> select count(*) from tan partition(tan_2013_12) ;

  COUNT(*)
----------
       833

SQL> select count(*) from tan partition(tan_2013_9) ;

  COUNT(*)
----------
       833

SQL> select count(*) from tan partition(tan_2014_8) ;

  COUNT(*)
----------
       833

SQL> select count(*) from tan partition(tan_2014_1) ;

  COUNT(*)
----------
       833

SQL> select partition_name,tablespace_name from dba_segments
   where segment_name in ('TAN','IND_TAN');

PARTITION_NAME                 TABLESPACE_NAME
------------------------------ ------------------------------
TAN_2014_8                     TAN_2014_8
TAN_2014_7                     TAN_2014_7
TAN_2014_6                     TAN_2014_6
TAN_2014_5                     TAN_2014_5
TAN_2014_4                     TAN_2014_4
TAN_2014_3                     TAN_2014_3
TAN_2014_2                     TAN_2014_2
TAN_2014_1                     TAN_2014_1
TAN_2013_9                     TAN_2013_9
TAN_2013_12                    TAN_2013_12
TAN_2013_11                    TAN_2013_11
TAN_2013_10                    TAN_2013_10
IND_TAN_2014_8                 TAN_2014_8
IND_TAN_2014_7                 TAN_2014_7
IND_TAN_2014_6                 TAN_2014_6
IND_TAN_2014_5                 TAN_2014_5
IND_TAN_2014_4                 TAN_2014_4
IND_TAN_2014_3                 TAN_2014_3
IND_TAN_2014_2                 TAN_2014_2
IND_TAN_2014_1                 TAN_2014_1
IND_TAN_2013_9                 TAN_2013_9
IND_TAN_2013_12                TAN_2013_12
IND_TAN_2013_11                TAN_2013_11
IND_TAN_2013_10                TAN_2013_10
24 rows selected.	   

OLAP库环境准备

<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">create tablespace tan_2013_7 datafile size 5m autoextend on;</span>
create tablespace tan_2013_8 datafile size 5m autoextend on;
 create table tan
(t_id number(10),
t_name varchar2(100),
t_date date )
partition by range(t_date)
(partition tan_2013_7 values less than(to_date('2013-08-01','yyyy-mm-dd')) tablespace tan_2013_7,
partition tan_2013_8 values less than(to_date('2013-09-01','yyyy-mm-dd')) tablespace tan_2013_8
);




create index ind_tan on tan(t_date) local
(
partition ind_tan_2013_7  tablespace tan_2013_7,
partition ind_tan_2013_8 tablespace tan_2013_8
);


begin 
for i in 1.. 10000 loop
insert into tan values(i,'tan'||i,to_date('2013-'||(mod(i,2)+7)||'-01','yyyy-mm-dd'));
end loop;
commit;
end;
/


SQL> select count(*) from tan partition(tan_2013_8);


  COUNT(*)
----------
      5000


SQL> select count(*) from tan partition(tan_2013_7);


  COUNT(*)
----------
      5000


2.分区交换   

现在要做的事是迁移2013年9月份数据。

创建个临时表:
SQL> create table tmp_tan_2013_9 as select * from tan where 1=2;
SQL> create index ind_tmp_tan_2013_9 on tmp_tan_2013_9(t_date);


分区交换。
SQL> alter table tan exchange partition tan_2013_9 

    with table tmp_tan_2013_9 including indexes with validation;


验证:
SQL> select count(*) from tan partition(tan_2013_9) ;

  COUNT(*)
----------
         0
SQL> select count(*) from tmp_tan_2013_9;
  COUNT(*)
----------
       833
SQL> select partition_name,tablespace_name from dba_segments
     where segment_name in ('TAN','IND_TAN');


PARTITION_NAME                 TABLESPACE_NAME
------------------------------ ------------------------------
TAN_2014_8                     TAN_2014_8
TAN_2014_7                     TAN_2014_7
TAN_2014_6                     TAN_2014_6
TAN_2014_5                     TAN_2014_5
TAN_2014_4                     TAN_2014_4
TAN_2014_3                     TAN_2014_3
TAN_2014_2                     TAN_2014_2
TAN_2014_1                     TAN_2014_1
TAN_2013_12                    TAN_2013_12
TAN_2013_11                    TAN_2013_11
TAN_2013_10                    TAN_2013_10
IND_TAN_2014_8                 TAN_2014_8
IND_TAN_2014_7                 TAN_2014_7
IND_TAN_2014_6                 TAN_2014_6
IND_TAN_2014_5                 TAN_2014_5
IND_TAN_2014_4                 TAN_2014_4
IND_TAN_2014_3                 TAN_2014_3
IND_TAN_2014_2                 TAN_2014_2
IND_TAN_2014_1                 TAN_2014_1
IND_TAN_2013_12                TAN_2013_12
IND_TAN_2013_11                TAN_2013_11
IND_TAN_2013_10                TAN_2013_10


22 rows selected.	   

3. 表空间传输:

更多关于表空间传输的内容:http://blog.csdn.net/bamuta/article/category/1138527


验证表空间的自包含:
SQL> exec dbms_tts.transport_set_check(‘TAN_2013_9‘,TRUE);


PL/SQL procedure successfully completed.


SQL> select * from transport_set_violations;


no rows selected

另外表空间传输需要两端库的字符集一致。


导出无数据:

SQL> alter tablespace tan_2013_9 read only;


[oracle@OEL63 ~]$ exp \‘sys/oracle as sysdba\‘ tablespaces=tan_2013_9 transport_tablespace=y file=exp_tan_2013_9.dmp 

拷贝文件
[oracle@OEL63 ~]$ scp exp_tan_2013_9.dmp 192.168.114.174:/home/oracle/
[oracle@OEL63 ~]$ scp /data01/qing/QING/datafile/o1_mf_tan_2013_9tht2cgh_.dbf 192.168.114.174:/data01/vm603/VM603/datafile/

在目标库导入元数据
[oracle@vm603 ~]$ imp \‘sys/oracle as sysdba\‘ transport_tablespace=y file=exp_tan_2013_9.dmp log=imp.log tablespaces=tan_2013_9 datafiles=‘/data01/vm603/VM603/datafile/o1_mf_tan_2013_9tht2cgh_.dbf‘


将两端库的该表空间read write 
SQL>  alter tablespace tan_2013_9 read write;

4.目标库再做分区交换

目标库对就表增加分区:
SQL> alter table tan add partition tan_2013_9 values less than (to_date(‘2013-10-01‘,‘yyyy-mm-dd‘)) tablespace tan_2013_9;


Table altered.


SQL> select count(*) from tan partition(tan_2013_9);


  COUNT(*)
----------
         0


在目标库做一次分区交换。
SQL> alter table tan exchange partition tan_2013_9 with table tmp_tan_2013_9 including indexes with validation;


Table altered.


检查
SQL>  select count(*) from tan partition(tan_2013_9);


  COUNT(*)
----------
       833


SQL> select table_name,partition_name,tablespace_name from user_tab_partitions;
TABLE_NAME                     PARTITION_NAME                 TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
TAN                            TAN_2013_8                     TAN_2013_8
TAN                            TAN_2013_7                     TAN_2013_7
TAN                            TAN_2013_9                     TAN_2013_9


SQL> select index_name,partition_name,tablespace_name from user_ind_partitions;
INDEX_NAME                     PARTITION_NAME                 TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
IND_TAN                        IND_TAN_2013_8                 TAN_2013_8
IND_TAN                        IND_TAN_2013_7                 TAN_2013_7
IND_TAN                        TAN_2013_9                     TAN_2013_9

5.源库删掉已经迁移走的分区:

SQL> select table_name,partition_name,tablespace_name from user_tab_partitions;


TABLE_NAME                     PARTITION_NAME                 TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
TAN                            TAN_2014_3                     TAN_2014_3
TAN                            TAN_2014_2                     TAN_2014_2
TAN                            TAN_2014_4                     TAN_2014_4
TAN                            TAN_2014_5                     TAN_2014_5
TAN                            TAN_2014_6                     TAN_2014_6
TAN                            TAN_2014_7                     TAN_2014_7
TAN                            TAN_2014_8                     TAN_2014_8
TAN                            TAN_2013_10                    TAN_2013_10
TAN                            TAN_2013_11                    TAN_2013_11
TAN                            TAN_2013_12                    TAN_2013_12
TAN                            TAN_2014_1                     TAN_2014_1
TAN                            TAN_2013_9                     USERS


12 rows selected.


SQL> <strong>alter table tan drop partition tan_2013_9;</strong>


Table altered.


SQL>  select table_name,partition_name,tablespace_name from user_tab_partitions;


TABLE_NAME                     PARTITION_NAME                 TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
TAN                            TAN_2014_3                     TAN_2014_3
TAN                            TAN_2014_2                     TAN_2014_2
TAN                            TAN_2014_4                     TAN_2014_4
TAN                            TAN_2014_5                     TAN_2014_5
TAN                            TAN_2014_6                     TAN_2014_6
TAN                            TAN_2014_7                     TAN_2014_7
TAN                            TAN_2014_8                     TAN_2014_8
TAN                            TAN_2013_10                    TAN_2013_10
TAN                            TAN_2013_11                    TAN_2013_11
TAN                            TAN_2013_12                    TAN_2013_12
TAN                            TAN_2014_1                     TAN_2014_1


用分区表分区交换做历史数据迁移,布布扣,bubuko.com

用分区表分区交换做历史数据迁移

标签:des   style   class   blog   code   http   

原文地址:http://blog.csdn.net/bamuta/article/details/34097863

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!