在线过期数据迁移到离线数据库

在线过期数据迁移到离线数据库
当我们对海量数据的Oracle 数据库进行管理和维护时,几乎无一例外都会使用分区
(partition)技术。
在大数据时代,数据量从几十GB 到几十TB,几乎翻了几百倍,但是分区仍然很好地解决了几乎所有数据管
理方面的问题。
分区是Oracle 数据库中对海量数据存储管理提供的一个应用很广泛的技术,它可以
非常方便地加载数据、删除数据和移动数据,特别是对于一个拥有海量数据的OLAP 以
及数据仓库系统的数据库来说,更是如此。

但是最分区最大的好处在于处理数据库数据的过期化处理。

在海量数据的数据库设计中,可能需要提前考虑数据库中数据存储的时间问题,或
者叫做数据的过期化问题,它的意思是,由于数据量太大,在数据库中只保留特定时长
的数据,比如1 年前的数据就需要做过期化(归档化)处理。
这时候分区技术就能发挥非常好的作用。

我们通过一个具体的案例,来描述数据从在线数据库迁移到离线数据库的过程。

通过表空间传递(表空间导出和导入)的方式实现分区数据由在线数据库向离线数据库的搬迁。
SQL> alter system set db_create_file_dest=
'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ORCL\DATAFILE\';
System altered.
SQL> create tablespace ts_sales_2009_1 datafile size 50M autoextend on;
Tablespace created.
SQL> create tablespace ts_sales_2009_2 datafile size 50M autoextend on;
Tablespace created.
SQL> create tablespace ts_sales_2009_3 datafile size 50M autoextend on;
Tablespace created.
SQL> create tablespace ts_sales_2009_4 datafile size 50M autoextend on;
Tablespace created.
SQL> create tablespace ts_sales_2009_5 datafile size 50M autoextend on;
Tablespace created.
SQL> create tablespace ts_sales_2009_6 datafile size 50M autoextend on;
Tablespace created.
SQL> create tablespace ts_sales_2009_7 datafile size 50M autoextend on;
Tablespace created.
SQL> create tablespace ts_sales_2009_8 datafile size 50M autoextend on;
Tablespace created.
SQL> create tablespace ts_sales_2009_9 datafile size 50M autoextend on;
Tablespace created.
SQL> create tablespace ts_sales_2009_10 datafile size 50M autoextend on;
Tablespace created.
SQL> create tablespace ts_sales_2009_11 datafile size 50M autoextend on;
Tablespace created.
SQL> create tablespace ts_sales_2009_12 datafile size 50M autoextend on;
Tablespace created.
SQL> create tablespace ts_sales_2010_1 datafile size 50M autoextend on;
Tablespace created.
SQL>
其中第一条语句是设定一个数据文件存放路径,让Oracle 自动在该路径下创建文件,
并使用Oracle 自己的方式为数据文件命名。
接下来的语句就是为每个表分区创建一个独立的表空间,从表空间名字上就可以看
出来。另外,同时为每个分区索引创建一个索引表空间。
然后我们创建表,将表的每个分区放到自己对应的表空间上。
下面是创建表的语句,包含13 个分区,时间跨度为1 年零1 个月。
SQL> CREATE TABLE sale_data
2 (sale_id NUMBER(5),
3 salesman_name VARCHAR2(30),
4 sales_amount NUMBER(10),
5 sales_date DATE)
6 PARTITION BY RANGE(sales_date)
7 (
8 PARTITION sales_2009_1 VALUES LESS THAN(TO_DATE('01/02/2009','DD/MM/YYYY'))
tablespace ts_sales_2009_1 ,
9 PARTITION sales_2009_2 VALUES LESS THAN(TO_DATE('01/03/2009','DD/MM/YYYY'))
tablespace ts_sales_2009_2 ,
10 PARTITION sales_2009_3 VALUES LESS THAN(TO_DATE('01/04/2009','DD/MM/YYYY'))
tablespace ts_sales_2009_3 ,
11 PARTITION sales_2009_4 VALUES LESS THAN(TO_DATE('01/05/2009','DD/MM/YYYY'))
tablespace ts_sales_2009_4 ,
12 PARTITION sales_2009_5 VALUES LESS THAN(TO_DATE('01/06/2009','DD/MM/YYYY'))
tablespace ts_sales_2009_5 ,
13 PARTITION sales_2009_6 VALUES LESS THAN(TO_DATE('01/07/2009','DD/MM/YYYY'))
tablespace ts_sales_2009_6 ,
14 PARTITION sales_2009_7 VALUES LESS THAN(TO_DATE('01/08/2009','DD/MM/YYYY'))
tablespace ts_sales_2009_7 ,
15 PARTITION sales_2009_8 VALUES LESS THAN(TO_DATE('01/09/2009','DD/MM/YYYY'))
tablespace ts_sales_2009_8 ,
16 PARTITION sales_2009_9 VALUES LESS THAN(TO_DATE('01/10/2009','DD/MM/YYYY'))
tablespace ts_sales_2009_9 ,
17 PARTITION sales_2009_10 VALUES LESS THAN(TO_DATE('01/11/2009','DD/MM/YYYY'))
tablespace ts_sales_2009_10 ,
18 PARTITION sales_2009_11 VALUES LESS THAN(TO_DATE('01/12/2009','DD/MM/YYYY'))
tablespace ts_sales_2009_11 ,
19 PARTITION sales_2009_12 VALUES LESS THAN(TO_DATE('01/01/2010','DD/MM/YYYY'))
tablespace ts_sales_2009_12 ,
20 PARTITION sales_2010_1 VALUES LESS THAN(TO_DATE('01/02/2010','DD/MM/YYYY'))
tablespace ts_sales_2010_1
21 );
Table created.
为分区表创建分区索引,每个分区索引放在各自对应的分区表空间上。
SQL> create index indsale_data on sale_data(dales_dat)
local
1 (
2 PARTITION sales_2009_1 tablespace ts_sales_2009_1 ,
3 PARTITION sales_2009_2 tablespace ts_sales_2009_2 ,
4 PARTITION sales_2009_3 tablespace ts_sales_2009_3 ,
5 PARTITION sales_2009_4 tablespace ts_sales_2009_4 ,
6 PARTITION sales_2009_5 tablespace ts_sales_2009_5 ,
7 PARTITION sales_2009_6 tablespace ts_sales_2009_6 ,
8 PARTITION sales_2009_7 tablespace ts_sales_2009_7 ,
9 PARTITION sales_2009_8 tablespace ts_sales_2009_8 ,
10 PARTITION sales_2009_9 tablespace ts_sales_2009_9 ,
11 PARTITION sales_2009_10 tablespace ts_sales_2009_10 ,
12 PARTITION sales_2009_11 tablespace ts_sales_2009_11 ,
13 PARTITION sales_2009_12 tablespace ts_sales_2009_12 ,
14 PARTITION sales_2010_1 tablespace ts_sales_2010_1
15 );
Index created.
SQL>
SQL> select partition_name,tablespace_name from user_segments
where segment_name in ('SALE_DATA','IND_SALE_DATA');
PARTITION_NAME SEGMENT_TYPE TABLESPACE_NAME
--------------- ------------- ------------------------------
SALES_2009_1 TABLE PARTITION TS_SALES_2009_1
SALES_2009_10 TABLE PARTITION TS_SALES_2009_10
SALES_2009_11 TABLE PARTITION TS_SALES_2009_11
SALES_2009_12 TABLE PARTITION TS_SALES_2009_12
SALES_2009_2 TABLE PARTITION TS_SALES_2009_2
SALES_2009_3 TABLE PARTITION TS_SALES_2009_3
SALES_2009_4 TABLE PARTITION TS_SALES_2009_4
SALES_2009_5 TABLE PARTITION TS_SALES_2009_5
SALES_2009_6 TABLE PARTITION TS_SALES_2009_6
SALES_2009_7 TABLE PARTITION TS_SALES_2009_7
SALES_2009_8 TABLE PARTITION TS_SALES_2009_8
SALES_2009_9 TABLE PARTITION TS_SALES_2009_9
SALES_2010_1 TABLE PARTITION TS_SALES_2010_1
SALES_2009_1 INDEX PARTITION TS_SALES_2009_1
SALES_2009_10 INDEX PARTITION TS_SALES_2009_10
SALES_2009_11 INDEX PARTITION TS_SALES_2009_11
SALES_2009_12 INDEX PARTITION TS_SALES_2009_12
SALES_2009_2 INDEX PARTITION TS_SALES_2009_2
SALES_2009_3 INDEX PARTITION TS_SALES_2009_3
SALES_2009_4 INDEX PARTITION TS_SALES_2009_4
SALES_2009_5 INDEX PARTITION TS_SALES_2009_5
SALES_2009_6 INDEX PARTITION TS_SALES_2009_6
SALES_2009_7 INDEX PARTITION TS_SALES_2009_7
SALES_2009_8 INDEX PARTITION TS_SALES_2009_8
SALES_2009_9 INDEX PARTITION TS_SALES_2009_9
SALES_2010_1 INDEX PARTITION TS_SALES_2010_1
从上面的结果可以看到,每个分区和分区索引都创建在各自的表空间上了。
下面我们就要为导出分区表空间做准备了。
比如,现在我们要导出的分区是SALES_2009_1,它对应的表空间为TS_SALES_2009_1。
需要注意的是,当以表空间传递的方式导出表空间时,我们不能直接导出分区所在
的表空间,这在Oracle 里面是不允许的。
使用表空间传递的方式导出数据,至少需要满足下面的几个条件:
● 源和目标数据库必须使用相同的字符集和国家字符集;
● 目标数据库不能包含同名的表空间;
● 表空间上的对象必须是自包含的。
前两个条件比较好理解,我们来看第三个条件,它是什么意思呢?
自包含的意思是,对于需要进行传递的表空间上的对象,它不会引用到表空间之外
的对象。比如:
● 索引在这个表空间上,但是它引用到的表在需要传递的表空间以外的其他表空间
上。
● 分区表的部分分区在需要传递的表空间以外的其他表空间上。
● 完整性约束的参考对象在需要传递的表空间以外的其他表空间上。
● 表中包含的LOB 对象存储在需要传递的表空间以外的其他表空间上。
对于这个案例来说,每个表空间只存储一个表分区,这样我们就不能对单个表空
间进行表空间传递操作了,因为它上面存储的对象不是自包含的。
可以通过下面的方式来检查表空间是否符合以表空间传递的方式导出。
SQL> exec dbms_tts.transport_set_check('TS_SALES_2009_1', TRUE);
PL/SQL procedure successfully completed.
SQL> SELECT * FROM transport_set_violations;
VIOLATIONS
--------------------------------------------------------------------------------
Default Partition (Table) Tablespace USERS for SALE_DATA not contained in transp
ortable set
Partitioned table TEST.SALE_DATA is partially contained in the transportable set
: check table partitions by querying sys.dba_tab_partitions
上面的信息显示了我们要传递的表空间有两点不符合传递要求:
● 分区表的默认表空间没有包含在传递的表空间。
● 表分区还有其他的分区,没有在要传递的表空间上。
基于以上两点原因,我们不能直接对分区的表空间进行移植,而这种数据存储的设
计是合理的,所以我们需要考虑使用其他的方式来解决这个问题。
幸运的是,我们找到了一种方法,那就是分区交换。它的方法是这样的:
● 创建一个临时表;
● 在临时表上创建索引;
● 将需要导出的分区数据和分区索引与临时表进行分区交换;
● 将临时表和索引所在的表空间导出。
具体的操作如下:
我们看到,最初的时候,各个分区对应在各自的表空间上。
SQL> select partition_name,tablespace_name,segment_type from user_segments
where segment_name='SALE_DATA';
PARTITION_NAME TABLESPACE_NAME SEGMENT_TYPE
----------------- ----------------- ------------------
SALES_2009_1 TS_SALES_2009_1 TABLE PARTITION
SALES_2009_10 TS_SALES_2009_10 TABLE PARTITION
SALES_2009_11 TS_SALES_2009_11 TABLE PARTITION
SALES_2009_12 TS_SALES_2009_12 TABLE PARTITION
SALES_2009_2 TS_SALES_2009_2 TABLE PARTITION
SALES_2009_3 TS_SALES_2009_3 TABLE PARTITION
SALES_2009_4 TS_SALES_2009_4 TABLE PARTITION
SALES_2009_5 TS_SALES_2009_5 TABLE PARTITION
SALES_2009_6 TS_SALES_2009_6 TABLE PARTITION
SALES_2009_7 TS_SALES_2009_7 TABLE PARTITION
SALES_2009_8 TS_SALES_2009_8 TABLE PARTITION
SALES_2009_9 TS_SALES_2009_9 TABLE PARTITION
SALES_2010_1 TS_SALES_2010_1 TABLE PARTITION
13 rows selected.
每个分区索引也和分区存放在同一个表空间上。
SQL> select partition_name,tablespace_name,segment_type from user_segments
where segment_name='IND_SALE_DATA';
PARTITION_NAME TABLESPACE_NAME SEGMENT_TYPE
----------------- ----------------- ------------------
SALES_2009_1 TS_SALES_2009_1 INDEX PARTITION
SALES_2009_10 TS_SALES_2009_10 INDEX PARTITION
SALES_2009_11 TS_SALES_2009_11 INDEX PARTITION
SALES_2009_12 TS_SALES_2009_12 INDEX PARTITION
SALES_2009_2 TS_SALES_2009_2 INDEX PARTITION
SALES_2009_3 TS_SALES_2009_3 INDEX PARTITION
SALES_2009_4 TS_SALES_2009_4 INDEX PARTITION
SALES_2009_5 TS_SALES_2009_5 INDEX PARTITION
SALES_2009_6 TS_SALES_2009_6 INDEX PARTITION
SALES_2009_7 TS_SALES_2009_7 INDEX PARTITION
SALES_2009_8 TS_SALES_2009_8 INDEX PARTITION
SALES_2009_9 TS_SALES_2009_9 INDEX PARTITION
SALES_2010_1 TS_SALES_2010_1 INDEX PARTITION
13 rows selected.
下面创建一个临时表,并在表上创建索引。
SQL> create table tmp_sale_data_2009_1 as select * from sale_data where 1=2;
Table created.
SQL> create index IND_TMP_SALE_DATA_2009_1 on TMP_SALE_DATA_2009_1(SALES_DATE);
Index created.
最初的时候,我们看到临时表和临时表的索引都默认存放在USERS 表空间上。
SQL> COL SEGMENT_NAME FOR A30;
SQL> select tablespace_name,segment_name,segment_type from user_segments
where segment_name like '%SALE_DATA_2009_1';
TABLESPACE_NAME SEGMENT_NAME SEGMENT_TYPE
---------------------- ----------------------- ------------------
USERS TMP_SALE_DATA_2009_1 TABLE
USERS IND_TMP_SALE_DATA_2009_1 INDEX
首先向要交换的分区中插入一些数据。
SQL> begin
2 for i in 1..10000 loop
3 insert into sale_data values(i,'alan',i*10,to_date('2009-01-12','yyyy-mm-dd'));
4 end loop;
5 commit;
6 end;
7 /
PL/SQL procedure successfully completed.
SQL> select count(*) from sale_data;
COUNT(*)
----------
10000
SQL> select count(*) from sale_data partition(SALES_2009_1);
COUNT(*)
----------
10000
可以看到,要交换的分区SALES_2009_1 包含了10000 条记录。
下面开始进行分区交换,包括分区索引,一并交换到临时表上。
SQL> alter table sale_data exchange partition sales_2009_1
with table tmp_sale_data_2009_1 including indexes with validation;
Table altered.
完成了分区交换,下面我们来看看各个对象所在的表空间情况。
SQL> select partition_name,tablespace_name,segment_type from user_segments
where segment_name = 'SALE_DATA' or segment_name='IND_SALE_DATA' order by 2;
PARTITION_NAME TABLESPACE_NAME SEGMENT_TYPE
----------------- ----------------- ------------------
SALES_2009_10 TS_SALES_2009_10 TABLE PARTITION
SALES_2009_10 TS_SALES_2009_10 INDEX PARTITION
SALES_2009_11 TS_SALES_2009_11 INDEX PARTITION
SALES_2009_11 TS_SALES_2009_11 TABLE PARTITION
SALES_2009_12 TS_SALES_2009_12 INDEX PARTITION
SALES_2009_12 TS_SALES_2009_12 TABLE PARTITION
SALES_2009_2 TS_SALES_2009_2 INDEX PARTITION
SALES_2009_2 TS_SALES_2009_2 TABLE PARTITION
SALES_2009_3 TS_SALES_2009_3 INDEX PARTITION
SALES_2009_3 TS_SALES_2009_3 TABLE PARTITION
SALES_2009_4 TS_SALES_2009_4 INDEX PARTITION
SALES_2009_4 TS_SALES_2009_4 TABLE PARTITION
SALES_2009_5 TS_SALES_2009_5 INDEX PARTITION
SALES_2009_5 TS_SALES_2009_5 TABLE PARTITION
SALES_2009_6 TS_SALES_2009_6 TABLE PARTITION
SALES_2009_6 TS_SALES_2009_6 INDEX PARTITION
SALES_2009_7 TS_SALES_2009_7 TABLE PARTITION
SALES_2009_7 TS_SALES_2009_7 INDEX PARTITION
SALES_2009_8 TS_SALES_2009_8 TABLE PARTITION
SALES_2009_8 TS_SALES_2009_8 INDEX PARTITION
SALES_2009_9 TS_SALES_2009_9 INDEX PARTITION
SALES_2009_9 TS_SALES_2009_9 TABLE PARTITION
SALES_2010_1 TS_SALES_2010_1 INDEX PARTITION
SALES_2010_1 TS_SALES_2010_1 TABLE PARTITION
SALES_2009_1 USERS INDEX PARTITION
SALES_2009_1 USERS TABLE PARTITION
26 rows selected.
SQL> select tablespace_name,segment_name,segment_type from user_segments
where segment_name like '%SALE_DATA_2009_1';
TABLESPACE_NAME SEGMENT_NAME SEGMENT_TYPE
------------------------------ ------------------------------ ------------------
TS_SALES_2009_1 TMP_SALE_DATA_2009_1 TABLE
TS_SALES_2009_1 IND_TMP_SALE_DATA_2009_1 INDEX
SQL>
我们看到,分区SALES_2009_1 和相应的分区索引,已经交换到了USERS 表空间
上;而临时表TMP_SALE_DATA_2009_1 和它的索引IND_TMP_SALE_DATA_2009_1
交换到了以前分区所在的表空间TS_SALES_2009_1 上。
现在分区中的数据已经交换到了临时表中。
SQL> select count(*) from sale_data partition(SALES_2009_1);
COUNT(*)
----------
0
SQL> select count(*) from sale_data;
COUNT(*)
----------
0
SQL> select count(*) from TMP_SALE_DATA_2009_1 ;
COUNT(*)
----------
10000
SQL>
这样就完成了表空间的交换,表空间TS_SALES_2009_1 上面的对象就是只有一个自包
含的表TMP_SALE_DATA_2009_1。
可以通过下面的操作来验证它。
SQL> conn / as sysdba
Connected.
SQL> exec dbms_tts.transport_set_check('TS_SALES_2009_1', TRUE);
PL/SQL procedure successfully completed.
SQL> SELECT * FROM transport_set_violations;
no rows selected
SQL>
我们看到,transport_set_violations 表中没有数据,说明空间已经通过了检查,可以
进行表空间传递操作了。
在进行表空间传递导出前,需要将要操作的表空间设置为只读。
SQL> alter tablespace TS_SALES_2009_1 read only;
Tablespace altered.
下面正式开始导出表空间TS_SALES_2009_1。
D:\>expdp system/oracle DIRECTORY=exp_trans_ts DUMPFILE=tts.dmp
TRANSPORT_TABLESPACES= TS_SALES_2009_1 TRANSPORT_FULL_CHECK=y LOGFILE=tts.log
Export: Release 10.2.0.3.0 - Production on Saturday, 04 September, 2010 9:59:31
Copyright (c) 2003, 2005, Oracle. All rights reserved.
Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, OLAP and Data Mining options
Starting "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01": system/******** DIRECTORY=exp_trans_ts
DUMPFILE=tts.dmp TRANSPORT_TABL
ESPACES= TS_SALES_2009_1 TRANSPORT_FULL_CHECK=y LOGFILE=tts.log
Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK
Processing object type TRANSPORTABLE_EXPORT/TABLE
Processing object type TRANSPORTABLE_EXPORT/INDEX
Processing object type TRANSPORTABLE_EXPORT/INDEX_STATISTICS
Processing object type TRANSPORTABLE_EXPORT/TABLE_STATISTICS
Processing object type TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
Master table "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SYSTEM.SYS_EXPORT_TRANSPORTABLE_01 is:
D:\TTS.DMP
Job "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01" successfully completed at 10:01:34
导出完成后,接下来的工作就是将导出的文件复制到离线数据库服务器上。
在离线数据库中,首先要创建好需要导入的分区表,直接创建在默认的表空间上就
可以,因为这些分区都是空的。
D:\>impdp system/oracle DIRECTORY=exp_trans_ts DUMPFILE=tts.dmp
TRANSPORT_DATAFILES='D:\ORACLE\PRODUCT\10.2.0\ORADATA\
ORCL\ORCL\DATAFILE\ORCL\DATAFILE\\TS_SALE_2009_1.DBF' LOGFILE=tts.log
Import: Release 10.2.0.3.0 - Production on Saturday, 04 September, 2010 10:18:53
Copyright (c) 2003, 2005, Oracle. All rights reserved.
Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, OLAP and Data Mining options
Master table "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01" successfully loaded/unloaded
Starting "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01": system/******** DIRECTORY=exp_trans_ts
DUMPFILE=tts.dmp TRANSPORT_DATA
FILES='D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ORCL\DATAFILE\ORCL\DATAFILE\\TS_SALE_2009_1.DBF'
LOGFILE=tts.log
Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK
Processing object type TRANSPORTABLE_EXPORT/TABLE
Processing object type TRANSPORTABLE_EXPORT/INDEX
Processing object type TRANSPORTABLE_EXPORT/INDEX_STATISTICS
Processing object type TRANSPORTABLE_EXPORT/TABLE_STATISTICS
Processing object type TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
Job "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01" successfully completed at 10:19:16
这时候我们看到,临时表和表空间以及表中的数据都导入到了离线数据库中。
SQL> col segment_name for a30;
SQL> select tablespace_name,segment_name,segment_type from user_segments
where segment_name like '%SALE_DATA_2009_1';
TABLESPACE_NAME SEGMENT_NAME SEGMENT_TYPE
----------------- ----------------- ------------------
TS_SALES_2009_1 TMP_SALE_DATA_2009_1 TABLE
TS_SALES_2009_1 IND_TMP_SALE_DATA_2009_1 INDEX
此时离线数据库中分区及索引所在的表空间情况如下:
SQL> select partition_name,tablespace_name,segment_type from user_segments
where segment_name = 'SALE_DATA' or segment_name='IND_SALE_DATA' order by 2;
PARTITION_NAME TABLESPACE_NAME SEGMENT_TYPE
------------------------------ ------------------------------ ------------------
SALES_2009_1 USERS INDEX PARTITION
SALES_2009_1 USERS TABLE PARTITION
……
26 rows selected.
表中的数据情况:
SQL> select count(*) from TMP_SALE_DATA_2009_1 ;
COUNT(*)
----------
10000
SQL> select count(*) from sale_data partition(SALES_2009_1);
COUNT(*)
----------
0
我们最后一步的工作就是将导入的临时表交换到离线数据库的分区表中。
SQL> alter table sale_data exchange partition sales_2009_1
with table tmp_sale_data_2009_1 including indexes with validation;
Table altered.
SQL> select tablespace_name,segment_name,segment_type from user_segments
where segment_name like '%SALE_DATA_2009_1';
TABLESPACE_NAME SEGMENT_NAME SEGMENT_TYPE
----------------- ----------------- ------------------
USERS TMP_SALE_DATA_2009_1 TABLE
USERS IND_TMP_SALE_DATA_2009_1 INDEX
SQL> select partition_name,tablespace_name,segment_type from user_segments
where segment_name = 'SALE_DATA' or segment_n
ame='IND_SALE_DATA' order by 2;
PARTITION_NAME TABLESPACE_NAME SEGMENT_TYPE
----------------- ----------------- ------------------
SALES_2009_1 TS_SALES_2009_1 INDEX PARTITION
SALES_2009_1 TS_SALES_2009_1 TABLE PARTITION
……
26 rows selected.
我们看到,传递过来的表空间TS_SALES_2009_1 上的数据和索引已经交换到了离
线数据库的分区SALES_2009_1 上。
SQL> select count(*) from TMP_SALE_DATA_2009_1;
COUNT(*)
----------
0
SQL> select count(*) from sale_data partition(SALES_2009_1);
COUNT(*)
----------
10000
SQL>
临时表中已经没有了数据,而以前空的分区现在有了10000 条从在线数据库中传递
过来的数据。
整个过程可以归纳为以下几步:
● 在在线数据库中通过临时表的方式将需要过期处理的分区数据和索引交换出来;
● 通过表空间传递的方式导出表空间;
● 将导出的dmp 文件和表空间数据文件拷贝到离线数据库中;
● 在离线数据库中导入表空间;
● 将导入表空间上的临时表数据和索引交换到离线数据库的分区表中。
对于离线数据库,通常数据是不做修改的,可以将表空间设置为只读,有利于数据
的安全;同时也可以考虑进行分区压缩,提高数据处理的速度。

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

转载于:http://blog.itpub.net/12798004/viewspace-1297198/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值