一。

说明:

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库环境准备:

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

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. Sql server 备份还原后出现“受限制用户”问题

    SQL数据库作备份和还原操作几乎是日常性事务了.但某次在对Sql Server 2005 数据库做备份还原后经常出现数据库“受限制用户”的问题 工具/原料 Windows OS SQL DB 步骤/方 ...

  2. 亚马逊AWS CentOS7(linux)改为用户名密码登录

    1.进入AWS系统 略 系统为:centos 7 fox.风 2.设置ROOT密码 sudo passwd root 1 3.修改配置文件 sudo vim /etc/ssh/sshd_config ...

  3. Backbone.js 的 View 中定义事件

    使用 Backbone 的 View 时,可以象传统 jQuery 那样定义事件,$("selector").click(function(){...}).幸运的是 Backbon ...

  4. 初学 Delphi 嵌入汇编[1] - 汇编语言与机器语言

    非科班出身, 现在才接触汇编, 惭愧呀, 好好学! 主选课本是清华大学王爽老师的<汇编语言>. 推荐 王爽老师的汇编网 汇编语言之前是机器语言. 机器语言是机器指令的集合, 机器指令是一系 ...

  5. 大数据开发实战:Storm流计算开发

    Storm是一个分布式.高容错.高可靠性的实时计算系统,它对于实时计算的意义相当于Hadoop对于批处理的意义.Hadoop提供了Map和Reduce原语.同样,Storm也对数据的实时处理提供了简单 ...

  6. 建模角度理解word embedding及tensorflow实现

    http://www.jianshu.com/p/d44ce1e3ec2f 1. 前言 本篇主要介绍关键词的向量表示,也就是大家熟悉的word embedding.自Google 2013 年开源wo ...

  7. [NL系列] RNN & LSTM 网络结构及应用

    http://www.jianshu.com/p/f3bde26febed/ 这篇是 The Unreasonable Effectiveness of Recurrent Neural Networ ...

  8. Kafka:ZK+Kafka+Spark Streaming集群环境搭建(十八)ES6.2.2 增删改查基本操作

    #文档元数据 一个文档不仅仅包含它的数据 ,也包含 元数据 —— 有关 文档的信息. 三个必须的元数据元素如下:## _index    文档在哪存放 ## _type    文档表示的对象类别 ## ...

  9. JavaScript 继承——三种继承方法及其优劣

    原文地址   本文内容 目的 继承的第一步--最简单的继承 私有变量/成员和原型 三种继承方式及其优劣 基本的原型继承 Yahoo JavaScript 模块模式 创建闭包的构造函数 三种方法的代码执 ...

  10. android中RecyclerView控件实现长按弹出PopupMenu菜单功能

    之前写过一篇文章:android中实现简单的聊天功能 现在是在之前功能的基础上,添加一个长按聊天记录,删除对应聊天记录的功能 RecyclerView控件,没有对应的长按事件,我们需要自己手工添加,修 ...