一。

说明:

OLTP库中有些表数据量大,且每月有持续的大量数据添加。因为历史数据在此库中不再做訪问,而是在另1个OLAP库中做分析。所以会对历史数据迁移至OLAP库中。对这样的历史数据迁移的操作。较好的办法是该表採用分区表。按时间分区后,能够对分区进行迁移。通过分区交换和表空间传输会非常easy完毕。并且性能上影响非常小。





关于分区表很多其它内容:    http://blog.csdn.net/tanqingru/article/category/1397435 

关于表空间传很多其它内容: http://blog.csdn.net/tanqingru/article/category/1138527

二。

实例:

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

1.创造须要的环境。

OLTP库环境准备:

  1. SQL> conn /as sysdba
  2. Connected.
  3. SQL> select * from V$version;
  4.  
  5. BANNER
  6. --------------------------------------------------------------------------------
  7. Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
  8. PL/SQL Release 11.2.0.3.0 - Production
  9. CORE 11.2.0.3.0 Production
  10. TNS for Linux: Version 11.2.0.3.0 - Production
  11. NLSRTL Version 11.2.0.3.0 - Production
  12. SQL> show parameter db_create_file_dest
  13.  
  14. NAME TYPE VALUE
  15. ------------------------------------ ----------- ------------------------------
  16. db_create_file_dest string /data01/qing
  17.  
  18. create tablespace tan_2013_9 datafile size 5m autoextend on;
  19. create tablespace tan_2013_10 datafile size 5m autoextend on;
  20. create tablespace tan_2013_11 datafile size 5m autoextend on;
  21. create tablespace tan_2013_12 datafile size 5m autoextend on;
  22. create tablespace tan_2014_1 datafile size 5m autoextend on;
  23. create tablespace tan_2014_2 datafile size 5m autoextend on;
  24. create tablespace tan_2014_3 datafile size 5m autoextend on;
  25. create tablespace tan_2014_4 datafile size 5m autoextend on;
  26. create tablespace tan_2014_5 datafile size 5m autoextend on;
  27. create tablespace tan_2014_6 datafile size 5m autoextend on;
  28. create tablespace tan_2014_7 datafile size 5m autoextend on;
  29. create tablespace tan_2014_8 datafile size 5m autoextend on;
  30.  
  31. conn tan/tan
  32.  
  33. SQL> create table tan
  34. (t_id number(10),
  35. t_name varchar2(100),
  36. t_date date )
  37. partition by range(t_date)
  38. (partition tan_2013_9 values less than(to_date('2013-10-01','yyyy-mm-dd')) tablespace tan_2013_9,
  39. partition tan_2013_10 values less than(to_date('2013-11-01','yyyy-mm-dd')) tablespace tan_2013_10,
  40. partition tan_2013_11 values less than(to_date('2013-12-01','yyyy-mm-dd')) tablespace tan_2013_11,
  41. partition tan_2013_12 values less than(to_date('2014-01-01','yyyy-mm-dd')) tablespace tan_2013_12,
  42. partition tan_2014_1 values less than(to_date('2014-02-01','yyyy-mm-dd')) tablespace tan_2014_1,
  43. partition tan_2014_2 values less than(to_date('2014-03-01','yyyy-mm-dd')) tablespace tan_2014_2,
  44. partition tan_2014_3 values less than(to_date('2014-04-01','yyyy-mm-dd')) tablespace tan_2014_3,
  45. partition tan_2014_4 values less than(to_date('2014-05-01','yyyy-mm-dd')) tablespace tan_2014_4,
  46. partition tan_2014_5 values less than(to_date('2014-06-01','yyyy-mm-dd')) tablespace tan_2014_5,
  47. partition tan_2014_6 values less than(to_date('2014-07-01','yyyy-mm-dd')) tablespace tan_2014_6,
  48. partition tan_2014_7 values less than(to_date('2014-08-01','yyyy-mm-dd')) tablespace tan_2014_7,
  49. partition tan_2014_8 values less than(to_date('2014-09-01','yyyy-mm-dd')) tablespace tan_2014_8
  50. );
  51.  
  52. create index ind_tan on tan(t_date) local
  53. (
  54. partition ind_tan_2013_9 tablespace tan_2013_9,
  55. partition ind_tan_2013_10 tablespace tan_2013_10,
  56. partition ind_tan_2013_11 tablespace tan_2013_11,
  57. partition ind_tan_2013_12 tablespace tan_2013_12,
  58. partition ind_tan_2014_1 tablespace tan_2014_1,
  59. partition ind_tan_2014_2 tablespace tan_2014_2,
  60. partition ind_tan_2014_3 tablespace tan_2014_3,
  61. partition ind_tan_2014_4 tablespace tan_2014_4,
  62. partition ind_tan_2014_5 tablespace tan_2014_5,
  63. partition ind_tan_2014_6 tablespace tan_2014_6,
  64. partition ind_tan_2014_7 tablespace tan_2014_7,
  65. partition ind_tan_2014_8 tablespace tan_2014_8
  66. );
  67.  
  68. begin
  69. for i in 1.. 10000 loop
  70. if( mod(i,12)+1 <=8) then
  71. insert into tan values(i,'tan'||i,to_date('2014-'||(mod(i,12)+1)||'-01','yyyy-mm-dd'));
  72. else
  73. insert into tan values(i,'tan'||i,to_date('2013-'||(mod(i,12)+1)||'-01','yyyy-mm-dd'));
  74. end if;
  75. end loop;
  76. commit;
  77. end;
  78. /
  79.  
  80. SQL> select count(*) from tan partition(tan_2013_12) ;
  81.  
  82. COUNT(*)
  83. ----------
  84. 833
  85.  
  86. SQL> select count(*) from tan partition(tan_2013_9) ;
  87.  
  88. COUNT(*)
  89. ----------
  90. 833
  91.  
  92. SQL> select count(*) from tan partition(tan_2014_8) ;
  93.  
  94. COUNT(*)
  95. ----------
  96. 833
  97.  
  98. SQL> select count(*) from tan partition(tan_2014_1) ;
  99.  
  100. COUNT(*)
  101. ----------
  102. 833
  103.  
  104. SQL> select partition_name,tablespace_name from dba_segments
  105. where segment_name in ('TAN','IND_TAN');
  106.  
  107. PARTITION_NAME TABLESPACE_NAME
  108. ------------------------------ ------------------------------
  109. TAN_2014_8 TAN_2014_8
  110. TAN_2014_7 TAN_2014_7
  111. TAN_2014_6 TAN_2014_6
  112. TAN_2014_5 TAN_2014_5
  113. TAN_2014_4 TAN_2014_4
  114. TAN_2014_3 TAN_2014_3
  115. TAN_2014_2 TAN_2014_2
  116. TAN_2014_1 TAN_2014_1
  117. TAN_2013_9 TAN_2013_9
  118. TAN_2013_12 TAN_2013_12
  119. TAN_2013_11 TAN_2013_11
  120. TAN_2013_10 TAN_2013_10
  121. IND_TAN_2014_8 TAN_2014_8
  122. IND_TAN_2014_7 TAN_2014_7
  123. IND_TAN_2014_6 TAN_2014_6
  124. IND_TAN_2014_5 TAN_2014_5
  125. IND_TAN_2014_4 TAN_2014_4
  126. IND_TAN_2014_3 TAN_2014_3
  127. IND_TAN_2014_2 TAN_2014_2
  128. IND_TAN_2014_1 TAN_2014_1
  129. IND_TAN_2013_9 TAN_2013_9
  130. IND_TAN_2013_12 TAN_2013_12
  131. IND_TAN_2013_11 TAN_2013_11
  132. IND_TAN_2013_10 TAN_2013_10
  133. 24 rows selected.

OLAP库环境准备

  1. <span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">create tablespace tan_2013_7 datafile size 5m autoextend on;</span>
  1. create tablespace tan_2013_8 datafile size 5m autoextend on;
  2. create table tan
  3. (t_id number(10),
  4. t_name varchar2(100),
  5. t_date date )
  6. partition by range(t_date)
  7. (partition tan_2013_7 values less than(to_date('2013-08-01','yyyy-mm-dd')) tablespace tan_2013_7,
  8. partition tan_2013_8 values less than(to_date('2013-09-01','yyyy-mm-dd')) tablespace tan_2013_8
  9. );
  10.  
  11. create index ind_tan on tan(t_date) local
  12. (
  13. partition ind_tan_2013_7 tablespace tan_2013_7,
  14. partition ind_tan_2013_8 tablespace tan_2013_8
  15. );
  16.  
  17. begin
  18. for i in 1.. 10000 loop
  19. insert into tan values(i,'tan'||i,to_date('2013-'||(mod(i,2)+7)||'-01','yyyy-mm-dd'));
  20. end loop;
  21. commit;
  22. end;
  23. /
  24.  
  25. SQL> select count(*) from tan partition(tan_2013_8);
  26.  
  27. COUNT(*)
  28. ----------
  29. 5000
  30.  
  31. SQL> select count(*) from tan partition(tan_2013_7);
  32.  
  33. COUNT(*)
  34. ----------
  35. 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) ;

  1. COUNT(*)
  2. ----------
  3. 0
  4. SQL> select count(*) from tmp_tan_2013_9;
  5. COUNT(*)
  6. ----------
  7. 833
  8. SQL> select partition_name,tablespace_name from dba_segments
  9. where segment_name in ('TAN','IND_TAN');
  10.  
  11. PARTITION_NAME TABLESPACE_NAME
  12. ------------------------------ ------------------------------
  13. TAN_2014_8 TAN_2014_8
  14. TAN_2014_7 TAN_2014_7
  15. TAN_2014_6 TAN_2014_6
  16. TAN_2014_5 TAN_2014_5
  17. TAN_2014_4 TAN_2014_4
  18. TAN_2014_3 TAN_2014_3
  19. TAN_2014_2 TAN_2014_2
  20. TAN_2014_1 TAN_2014_1
  21. TAN_2013_12 TAN_2013_12
  22. TAN_2013_11 TAN_2013_11
  23. TAN_2013_10 TAN_2013_10
  24. IND_TAN_2014_8 TAN_2014_8
  25. IND_TAN_2014_7 TAN_2014_7
  26. IND_TAN_2014_6 TAN_2014_6
  27. IND_TAN_2014_5 TAN_2014_5
  28. IND_TAN_2014_4 TAN_2014_4
  29. IND_TAN_2014_3 TAN_2014_3
  30. IND_TAN_2014_2 TAN_2014_2
  31. IND_TAN_2014_1 TAN_2014_1
  32. IND_TAN_2013_12 TAN_2013_12
  33. IND_TAN_2013_11 TAN_2013_11
  34. IND_TAN_2013_10 TAN_2013_10
  35.  
  36. 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.





检查

  1. SQL> select count(*) from tan partition(tan_2013_9);
  2.  
  3. COUNT(*)
  4. ----------
  5. 833
  6.  
  7. SQL> select table_name,partition_name,tablespace_name from user_tab_partitions;
  8. TABLE_NAME PARTITION_NAME TABLESPACE_NAME
  9. ------------------------------ ------------------------------ ------------------------------
  10. TAN TAN_2013_8 TAN_2013_8
  11. TAN TAN_2013_7 TAN_2013_7
  12. TAN TAN_2013_9 TAN_2013_9
  13.  
  14. SQL> select index_name,partition_name,tablespace_name from user_ind_partitions;
  15. INDEX_NAME PARTITION_NAME TABLESPACE_NAME
  16. ------------------------------ ------------------------------ ------------------------------
  17. IND_TAN IND_TAN_2013_8 TAN_2013_8
  18. IND_TAN IND_TAN_2013_7 TAN_2013_7
  19. IND_TAN TAN_2013_9 TAN_2013_9

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

  1. SQL> select table_name,partition_name,tablespace_name from user_tab_partitions;
  2.  
  3. TABLE_NAME PARTITION_NAME TABLESPACE_NAME
  4. ------------------------------ ------------------------------ ------------------------------
  5. TAN TAN_2014_3 TAN_2014_3
  6. TAN TAN_2014_2 TAN_2014_2
  7. TAN TAN_2014_4 TAN_2014_4
  8. TAN TAN_2014_5 TAN_2014_5
  9. TAN TAN_2014_6 TAN_2014_6
  10. TAN TAN_2014_7 TAN_2014_7
  11. TAN TAN_2014_8 TAN_2014_8
  12. TAN TAN_2013_10 TAN_2013_10
  13. TAN TAN_2013_11 TAN_2013_11
  14. TAN TAN_2013_12 TAN_2013_12
  15. TAN TAN_2014_1 TAN_2014_1
  16. TAN TAN_2013_9 USERS
  17.  
  18. 12 rows selected.
  19.  
  20. SQL> <strong>alter table tan drop partition tan_2013_9;</strong>
  21.  
  22. Table altered.
  23.  
  24. SQL> select table_name,partition_name,tablespace_name from user_tab_partitions;
  25.  
  26. TABLE_NAME PARTITION_NAME TABLESPACE_NAME
  27. ------------------------------ ------------------------------ ------------------------------
  28. TAN TAN_2014_3 TAN_2014_3
  29. TAN TAN_2014_2 TAN_2014_2
  30. TAN TAN_2014_4 TAN_2014_4
  31. TAN TAN_2014_5 TAN_2014_5
  32. TAN TAN_2014_6 TAN_2014_6
  33. TAN TAN_2014_7 TAN_2014_7
  34. TAN TAN_2014_8 TAN_2014_8
  35. TAN TAN_2013_10 TAN_2013_10
  36. TAN TAN_2013_11 TAN_2013_11
  37. TAN TAN_2013_12 TAN_2013_12
  38. TAN TAN_2014_1 TAN_2014_1

Oracle用分区表分区交换做历史数据迁移的更多相关文章

  1. ORACLE 查看分区表分区大小

    SELECT *  FROM dba_segments t WHERE t.segment_name ='table_name'; pratition_name : 分区名 bytes : 分区大小( ...

  2. 使用SQL SERVER存储过程实现历史数据迁移

    今天讲下软件开发中最常见的历史数据迁移方式.在讲迁移之前,先简单介绍下几个基本概念. 1.什么是历史数据迁移? 简单直白地说:就是将一些创建时间比较久而且不常用的历史数据,存储到另一个地方(可以是另一 ...

  3. oracle 入门笔记---分区表的分区交换

    本文参考来自作者:蓝紫 详细内容请阅读原文 : http://www.cnblogs.com/lanzi/archive/2013/01/24/2875838.html 在oracle 11.2环境下 ...

  4. oracle分区交换技术

    交换分区的操作步骤如下: 1. 创建分区表t1,假设有2个分区,P1,P2.2. 创建基表t11存放P1规则的数据.3. 创建基表t12 存放P2规则的数据.4. 用基表t11和分区表T1的P1分区交 ...

  5. 详解Oracle partition分区表

    随着表中行数的增多,管理和性能性能影响也将随之增加.备份将要花费更多时间,恢复也将 要花费更说的时间,对整个数据表的查询也将花费更多时间.通过把一个表中的行分为几个部分,可以减少大型表的管理和性能问题 ...

  6. 什么是Oracle的分区表 (转 作者 陈字文)

    假设我们现在正在酝酿经营一家图书馆,最初,我们只有十本书提供给大家来阅读和购买.对于十本书而言,我们可能只需要一个书架格子将其作为保存这十本书的容器就足够了,因为任何一个人都可以很轻松的扫一眼就可以将 ...

  7. 分区表分区字段的update操作

    默认情况下,oracle的分区表对于分区字段是不允许进行update操作的,如果有对分区字段行进update,就会报错——ORA-14402: 更新分区关键字列将导致分区的更改.但是可以通过打开表的r ...

  8. 浅谈Oracle数据库分区表

    Oracle数据库分区是作为Oracle数据库性能优化的一种重要的手段和方法,之前,只听过分区的大名,却总未用过,最近简单学习了一下,总结如下,不对之处,还希望朋友们多多指点,交流! 1.表空间及分区 ...

  9. oracle的表分区

    (1.) 表空间及分区表的概念 表空间: 是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表, 所以称作表空间.   分区表: 当表中的数据量不断增大,查询数据的速度就 ...

随机推荐

  1. Tiny210 U-BOOT(二)----配置时钟频率基本原理

    U-BOOT在启动的过程中,需要配置系统时钟. 配置系统时钟,大概是以下几个步骤: (1)设置系统PLL锁定时间 (2)配置PLL (3)配置各模块分频系数 (4)切换到PLL时钟 1.基本原理 首先 ...

  2. SD内存卡禁止写入只读怎么办?另类SPI模式修复坏卡

    这几天很郁闷,买的32G TF卡老出问题,三星的标,不知道是不是正品,标称C10,且不说是不是真的三星和真的C10,反正测试一下容量倒是真的,价格么也比较亲民,好像是69块?   哎,可惜呀,好景不长 ...

  3. vue组件的hover事件模拟、给第三方组件绑定事件不生效问题

    1.vue里面实现hover效果基本需要用事件模拟 <div @mouseover="overShow" @mouseout="outHide"> ...

  4. Android 与 js 简单互调

    总结: Android 调用  js: 在 Android 中创建通往 javascript 的接口; 在 html  中定义要执行的方法; 在  Android  中的具体事件中进行调用. cont ...

  5. Java-Shiro(一):简介

    简介 Apache Shiro是Java的一个安全权限框架. Shiro可以非常容易的开发出足够好的额应用,其不仅可以用在JavaSE环境,也可以用在Java SE环境. Shiro可以完成:认证.授 ...

  6. 在sublime text2上安装xdebug

    目录 安装Xdebug extension 设定php.ini 安装Xdebug plugin for Sublime Text2 1.安装Xdebug extension 先从安装Xdebug开始, ...

  7. Oracle 之 保留两位小数

    项目需要使用百分率,保留2位小数,只用 round 和 trunc 函数都可以实现(round(_data,2) ),只是格式不是很工整,对格式要求不严谨的情况下使用 round 即可. 以下是比较方 ...

  8. WinForm 之 应用程序开机自启动设置方法

    一.原理 需要开机自启动的程序,需要将其启动程序的路径写到注册表中指定的文件夹下. 二.实现方式 方法1:在生成安装程序时配置: 方法2:在程序运行时动态配置. 三.在生成安装程序时配置 1.右击安装 ...

  9. Linux中查看系统版本的方法

    一.Linux系统中,XShell连接进去之后,查看系统版本的方法如下: 1.查找release文件 find /etc/ -name *-release 例如: 或者 2.查看release文件 c ...

  10. Go语言中Socket通信TCP服务端

    1.用法: (1)定义远程IP地址.使用net.ResolveTCPAddr()方法,定义一个TCP地址,做为本机监听地址. (2)使用net.ListenTCP("tcp",lo ...