当前位置: 首页 > 面试题库 >

在Oracle 11g中,如何将分区表从一个表空间移动到另一个表空间?

公良育
2023-03-14
问题内容

我有一个属于表空间 报告 的分区表。我想将其移至表空间 记录

一种可能性是删除表并在新表空间中重新创建它,但这对我来说不是一个选择,因为表中有数据需要在移动后幸存。

我首先使用以下命令检查分区是否真正属于表空间报告:

SELECT * FROM user_tab_partitions WHERE table_name = 'REQUESTLOG';

然后我只是尝试:

ALTER TABLE requestLog MOVE TABLESPACE record;

但这给了我错误ORA-145111``无法对已分区的对象执行操作’‘。

然后我发现我可以使用以下方法移动单个分区:

ALTER TABLE requestLog MOVE PARTITION "2009-12-29" TABLESPACE report;

但是由于该表有60个分区(基于日期),并且由于可能需要对多个系统执行此操作,因此我想遍历所有分区名,并将每个分区名移至新的表空间。我曾尝试过,但无法完全使SQL正常工作。

即使我将所有现有分区都移动到新表空间,在创建新分区时仍然存在问题。新分区仍在旧表空间 报告中 创建。如何更改以便在新表空间 记录 中创建新分区?


问题答案:

您还必须考虑可能使索引无效的索引,以解决有关重置默认表空间的问题,我认为这是您要实现的完整过程:

1)移动分区(根据zbrrigschn盲zlets的回答进行PL / SQL循环

这些是我在定义a_tname,a_destTS,vTname和vTspName的匿名块包装程序中使用的过程-它们应为您提供大致的概念:

procedure mvTabPart (a_tname in varchar2, a_destTS in varchar2) is
cursor pCur(vTname varchar2, vTspName varchar2) is
  select table_name, partition_name
  from user_tab_partitions
  where table_name = vTname
      and tablespace_name not like vTspName
  order by partition_position desc;
begin
for pRow in pCur(a_tname, a_destTS) loop
 sqlStmnt := 'alter table '||pRow.table_name||
             ' move partition '||pRow.partition_name||
             ' tablespace '||a_destTS;
execute immediate sqlStmnt;
end loop;
end mvTabPart;

2)设置表默认分区表空间,以便在那里创建新分区:

    procedure setDefTabPart (a_tname in varchar2, a_destTS in varchar2) is
    cursor tCur(vTname varchar2) is
      select table_name
      from user_part_tables
      where table_name = vTname;
    begin
    for tRow in tCur(a_tname) loop
     sqlStmnt := 'alter table '||tRow.table_name||
                 ' modify default attributes '||
                 ' tablespace '||a_destTS;
    execute immediate sqlStmnt;
    end loop;
end setDefNdxPart;

3)设置索引默认分区表空间,以便在需要的位置创建新的索引分区(如果有):

procedure setDefNdxPart (a_tname in varchar2, a_destTS in varchar2) is
cursor iCur(vTname varchar2) is
  select index_name
  from user_part_indexes
  where index_name in (select index_name
             from user_indexes where table_name = vTname);
begin
for iRow in iCur(a_tname) loop
 sqlStmnt := 'alter index '||iRow.index_name||
             ' modify default attributes '||
             ' tablespace '||a_destTS;
execute immediate sqlStmnt;
end loop;

end setDefNdxPart;

4)重建需要重建并且不在所需表空间中的所有分区索引:

procedure mvNdxPart (a_tname in varchar2, a_destTS in varchar2) is
cursor ndxCur(vTname varchar2, vTspName varchar2) is
select i.index_name index_name, ip.partition_name partition_name
  from user_ind_partitions ip, user_indexes i
  where i.index_name = ip.index_name
     and i.table_name = vTname
     and i.partitioned = 'YES'
     and (ip.tablespace_name not like vTspName or ip.status not like 'USABLE')
  order by index_name, partition_name ;
begin
for ndxRow in ndxCur(a_tname, a_destTS) loop
 sqlStmnt := 'alter index '||ndxRow.index_name||
             ' rebuild partition '||ndxRow.partition_name||
             ' tablespace '||a_destTS;
execute immediate sqlStmnt ;
end loop;
end mvNdxPart;

5)重建任何全局索引

procedure mvNdx (a_tname in varchar2, a_destTS in varchar2) is
cursor ndxCur(vTname varchar2, vTspName varchar2) is
  select index_name
  from user_indexes
  where table_name = vTname
       and partitioned = 'NO'
       and (tablespace_name not like vTspName or status like 'UNUSABLE')
  order by index_name ;
begin
for ndxRow in ndxCur(a_tname, a_destTS) loop
 sqlStmnt := 'alter index '||ndxRow.index_name||
             ' rebuild tablespace '||a_destTS;
execute immediate sqlStmnt ;
end loop;
end mvNdx;


 类似资料:
  • 在我的AnyLogic模型中,容器代理在主代理中移动到不同的位置。 Main包含位于特定位置的多个块代理实例。Block包含一台多桥桥式起重机,该起重机应能捡起集装箱并将其运至当地仓库。 当容器被放置在块的起重机范围内的吸引器处时,块内的一个进程被调用。此进程包含入口、移动起重机和出口块。在移动起重机块中,在抓取步骤中,AnyLogic给我以下错误: 所有块代理都位于main中的不同坐标处。它们各

  • 我正在使用开发一个应用程序,我必须创建一个历史表,基本上我只是从主表复制旧记录,并在主表记录更新或删除时插入历史表。我在创建了一个类型为时间戳的字段,没有时区。当我使用select query从主表中选择行时,我会在=处创建

  • 我试图在从一个表创建一个值后将其插入另一个表我有两个数据库“mem”和“location” 我想从mem表中添加主键id,并将其插入到位置表中的user_id列中。 我有一个sql查询在我的注册表单页面,自动递增'id'在mem表中,但似乎没有添加相同的值到位置表中的user_id, 有人能帮忙吗!

  • 我试图通过将不需要的记录移动到墓地表中,在数据库中进行一些垃圾收集。如果我有这四张桌子- 版本(id为主键) Version_history(version_id是外键) Version_graveyard(此处已丢弃版本行) Version_history_graveyard(此处为废弃版本历史记录行) 它包括以下步骤- 获取要删除的所有版本ID 通知所有人要删除的版本ID。(所以我需要在实际移

  • 问题内容: 我有两个具有相同结构的表。我需要从一个表中选择数据,然后将它们存储到另一个表中。 我怎样才能做到这一点? 问题答案: 因为它们是相同的结构,所以您可以做

  • 我发现了几个类似的问题,但似乎没有一个能准确回答我的问题,而且我不太擅长SQL,所以这是我的问题: 我有有多行; 我想将这些行(特定的行-如name1、name2、name3)迁移到不同表中的一行中,其中列将匹配名称。 下面是表2: 我可能知道如何编写能够做到这一点的SQL,但只能逐行编写。迁移这些数据的好方法是什么?理想情况下,我也会在完成后删除表1中的行。