Oracle12.2怎么将分区移动到不同的表空间中

64次阅读
没有评论

共计 3560 个字符,预计需要花费 9 分钟才能阅读完成。

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

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

SQL  create table jy.salestable
 2 (s_productid number,
 3 s_saledate date,
 4 s_custid number,
 5 s_totalprice number)
 6 tablespace users
 7 partition by range(s_saledate)
 8 (partition sal10q1 values less than (to_date( 01-apr-2010 ,  dd-mon-yyyy)),
 9 partition sal10q2 values less than (to_date( 01-jul-2010 ,  dd-mon-yyyy)),
 10 partition sal10q3 values less than (to_date( 01-oct-2010 ,  dd-mon-yyyy)),
 11 partition sal10q4 values less than (to_date( 01-jan-2011 ,  dd-mon-yyyy)));
Table created.

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

SQL  create index jy.sales_index on jy.salestable (s_saledate, s_productid, s_custid) local;
Index created.

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

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

SQL  conn jy/jy@jypdb
Connected.

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

SQL  begin
 2 dbms_redefinition.can_redef_table(
 3 uname =   jy ,
 4 tname =   salestable ,
 5 options_flag =  DBMS_REDEFINITION.CONS_USE_ROWID,
 6 part_name =   sal10q1, sal10q2 
 7 end;
 8 /
PL/SQL procedure successfully completed.

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

SQL  create table jy.int_salestb1
 2 (s_productid number,
 3 s_saledate date,
 4 s_custid number,
 5 s_totalprice number)
 6 tablespace example;
Table created.
SQL  create table jy.int_salestb2
 2 (s_productid number,
 3 s_saledate date,
 4 s_custid number,
 5 s_totalprice number)
 6 tablespace example;
Table created.

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

SQL  begin
 2 dbms_redefinition.start_redef_table(
 3 uname =   jy ,
 4 orig_table =   salestable ,
 5 int_table =   int_salestb1, int_salestb2 ,
 6 col_mapping =  NULL,
 7 options_flag =  DBMS_REDEFINITION.CONS_USE_ROWID,
 8 part_name =   sal10q1, sal10q2 ,
 9 continue_after_errors =  TRUE);
 10 end;
 11 /
PL/SQL procedure successfully completed.

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

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

SQL  create index jy.int_sales1_index on jy.int_salestb1
 2 (s_saledate, s_productid, s_custid)
 3 tablespace example;
Index created.
SQL  create index jy.int_sales2_index on jy.int_salestb2
 2 (s_saledate, s_productid, s_custid)
 3 tablespace example;
Index created.

6. 可选操作同步中间表

SQL  begin
 2 dbms_redefinition.sync_interim_table(
 3 uname =   jy ,
 4 orig_table =   salestable ,
 5 int_table =   int_salestb1, int_salestb2 ,
 6 part_name =   sal10q1, sal10q2 ,
 7 continue_after_errors =  TRUE);
 8 end;
 9 /
PL/SQL procedure successfully completed.

7. 完成重定义操作

SQL  begin
 2 dbms_redefinition.finish_redef_table(
 3 uname =   jy ,
 4 orig_table =   salestable ,
 5 int_table =   int_salestb1, int_salestb2 ,
 6 part_name =   sal10q1, sal10q2 ,
 7 continue_after_errors =  TRUE);
 8 end;
 9 /
PL/SQL procedure successfully completed.

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

SQL  select base_table_owner, base_table_name, operation, status from dba_redefinition_status;
no rows selected

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

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

SQL  select partition_name, tablespace_name from dba_tab_partitions where table_name =  SALESTABLE  and table_owner= JY 
PARTITION_NAME TABLESPACE_NAME
-------------------------------------------------------------------------------- ------------------------------
SAL10Q1 EXAMPLE
SAL10Q2 EXAMPLE
SAL10Q3 USERS
SAL10Q4 USERS

到此联机重定义操作完成

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

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-01发表,共计3560字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)