本篇内容主要讲解“Oracle12.2怎么将分区移动到不同的表空间中”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Oracle12.2怎么将分区移动到不同的表空间中”吧!

下面的例子将演示如何联机重定义多个分区并将基于范围分区的表salestable的两个分区移动到新表空间中。原始表jy.salestable的创建如下:

SQL>createtablejy.salestable2(s_productidnumber,3s_saledatedate,4s_custidnumber,5s_totalpricenumber)6tablespaceusers7partitionbyrange(s_saledate)8(partitionsal10q1valueslessthan(to_date('01-apr-2010','dd-mon-yyyy')),9partitionsal10q2valueslessthan(to_date('01-jul-2010','dd-mon-yyyy')),10partitionsal10q3valueslessthan(to_date('01-oct-2010','dd-mon-yyyy')),11partitionsal10q4valueslessthan(to_date('01-jan-2011','dd-mon-yyyy')));Tablecreated.

这个例子会将分区sal10q1与sal10q2移动到example表空间中。sal10q3与sal10q4分区不会被移动。为了移动分区表空间example必须存在。这里已经先创建好了表空间example。对原始表jy.salestable创建一个本地分区索引,操作如下:

SQL>createindexjy.sales_indexonjy.salestable(s_saledate,s_productid,s_custid)local;Indexcreated.

注意,在12.2中也可以执行alter table ... move partition ... online语句来将分区移动到其它表空间中。

联机重定义操作如下:
1.用要执行联机重定义操作的用户登录数据库

SQL>connjy/jy@jypdbConnected.

2.验证原始表jy.salestable是否可以执行联机重定义

SQL>begin2dbms_redefinition.can_redef_table(3uname=>'jy',4tname=>'salestable',5options_flag=>DBMS_REDEFINITION.CONS_USE_ROWID,6part_name=>'sal10q1,sal10q2');7end;8/PL/SQLproceduresuccessfullycompleted.

3.在新表空间example中创建中间表。因为这是对分区执行联机重定义,因此中间表不能是分区表。

SQL>createtablejy.int_salestb12(s_productidnumber,3s_saledatedate,4s_custidnumber,5s_totalpricenumber)6tablespaceexample;Tablecreated.SQL>createtablejy.int_salestb22(s_productidnumber,3s_saledatedate,4s_custidnumber,5s_totalpricenumber)6tablespaceexample;Tablecreated.

4.使用rowid方法来执行重定义操作

SQL>begin2dbms_redefinition.start_redef_table(3uname=>'jy',4orig_table=>'salestable',5int_table=>'int_salestb1,int_salestb2',6col_mapping=>NULL,7options_flag=>DBMS_REDEFINITION.CONS_USE_ROWID,8part_name=>'sal10q1,sal10q2',9continue_after_errors=>TRUE);10end;11/PL/SQLproceduresuccessfullycompleted.

注意,part_name参数用来指定所有要重定义的分区,int_table参数用来指定每个分区所对应的中间表,continue_after_errors参数被设置为true,因此重定义操作即使当某个特定分区遇到错误也会继续执行。

5.在中间表上创建任何本地索引

SQL>createindexjy.int_sales1_indexonjy.int_salestb12(s_saledate,s_productid,s_custid)3tablespaceexample;Indexcreated.SQL>createindexjy.int_sales2_indexonjy.int_salestb22(s_saledate,s_productid,s_custid)3tablespaceexample;Indexcreated.

6.可选操作同步中间表

SQL>begin2dbms_redefinition.sync_interim_table(3uname=>'jy',4orig_table=>'salestable',5int_table=>'int_salestb1,int_salestb2',6part_name=>'sal10q1,sal10q2',7continue_after_errors=>TRUE);8end;9/PL/SQLproceduresuccessfullycompleted.

7.完成重定义操作

SQL>begin2dbms_redefinition.finish_redef_table(3uname=>'jy',4orig_table=>'salestable',5int_table=>'int_salestb1,int_salestb2',6part_name=>'sal10q1,sal10q2',7continue_after_errors=>TRUE);8end;9/PL/SQLproceduresuccessfullycompleted.

8.可选操作,查询dba_redefinition_status视图来确保对每个分区都重定义操作成功

SQL>selectbase_table_owner,base_table_name,operation,statusfromdba_redefinition_status;norowsselected

如果有任何分区重定义失败,视图dba_redefinition_errors会显示出错误原因,修正故障重新执行联机重定义操作。

下面的查询显示了表jy.salestable有两个分区已经移动到了新的表空间example中了

SQL>selectpartition_name,tablespace_namefromdba_tab_partitionswheretable_name='SALESTABLE'andtable_owner='JY';PARTITION_NAMETABLESPACE_NAME--------------------------------------------------------------------------------------------------------------SAL10Q1EXAMPLESAL10Q2EXAMPLESAL10Q3USERSSAL10Q4USERS

到此联机重定义操作完成

到此,相信大家对“Oracle12.2怎么将分区移动到不同的表空间中”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!