TTS方式传送分区表

创建一个临时表;

在临时表上创建索引;

将需要导出的分区数据和分区索引与临时表进行分区交换;

将临时表和索引所在的表空间导出。

首先自己建立一个测试的分区表 
SQL> alter system set db_create_file_dest='D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ORCL\DATAFILE\';---- 
 
其中第一条语句是设定一个数据文件存放路径,让Oracle 自动在该路径下创建文件,并使用Oracle 自己的方式为数
 
据文件命名。
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.
 
 
接下来的语句就是为每个表分区创建一个独立的表空间,从表空间名字上就可以看出来。另外,同时为每个分区索引
 
创建一个索引表空间。然后我们创建表,将表的每个分区放到自己对应的表空间上。
 
下面是创建表的语句,包含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 
 );
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 ,
 );
Index created.
 
 
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
 
从上面的结果可以看到,每个分区和分区索引都创建在各自的表空间上了。
下面我们就要为导出分区表空间做准备了。
 
 
 创建一个临时表;
 在临时表上创建索引;
 将需要导出的分区数据和分区索引与临时表进行分区交换;
 将临时表和索引所在的表空间导出。
 
 
我们看到,最初的时候,各个分区对应在各自的表空间上。
 
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
 
 
每个分区索引也和分区存放在同一个表空间上。
 
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
 
 
下面创建一个临时表,并在表上创建索引。
 
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> 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
 
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
 
 
我们看到,分区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
 
这样就完成了表空间的交换,表空间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
 
我们看到,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_CH
 
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\
 
这时候我们看到,临时表和表空间以及表中的数据都导入到了离线数据库中。
 
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
……
 
表中的数据情况:
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_name='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
……
 
我们看到,传递过来的表空间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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值