【问题标题】:How to move table from one tablespace to another in oracle 11goracle 11g 如何将表从一个表空间移动到另一个表空间
【发布时间】:2013-08-22 01:38:50
【问题描述】:

我运行oracle 11g,需要将table (tbl1) 从一个tablespace (tblspc1) 移动到另一个(tblspc2)。最简单的方法是什么?

【问题讨论】:

  • 您至少可以发布您迄今为止尝试过的内容吗?
  • 如果你想移动分区表,我几年前写过我如何将表从一个表空间移动到另一个表空间:move partitioned tables

标签: oracle oracle11g move


【解决方案1】:

试试这个:-

ALTER TABLE <TABLE NAME to be moved> MOVE TABLESPACE <destination TABLESPACE NAME>

来自 cmets 中 IVAN 的非常好的建议,所以想在我的回答中添加

注意:这将使所有表的索引无效。所以这个命令后面通常跟

alter index <owner>."<index_name>" rebuild;

【讨论】:

  • 注意:这将使所有表的索引无效。所以这个命令后面通常跟“alter index rebuild”。
  • @Ivan:- 感谢 Ivan。好点。在答案中也添加了这个!! +1 :)
  • 在上述基础上,这将找到 obs tbs 并同时生成 ALTER...SELECT Segment_Name, Segment_Type, Tablespace_Name, Bytes, Blocks, Extents, q'[ALTER ]' || Segment_Type || q'[ ]' || USER || q'[.]' || Segment_Name || CASE WHEN Segment_Type = 'INDEX' THEN q'[ REBUILD ]' ELSE q'[ MOVE ]' END || q'[ TABLESPACE ]' || q'[TABLESPACE_NAME_GOES_HERE]' || q'[;]' FROM Dba_Segments WHERE Owner = USER AND Tablespace_Name &lt;&gt; 'TABLESPACE_NAME_GOES_HERE' ORDER BY Segment_Name;
  • @Allen 您的评论应该是一个单独的答案。但是,如果有 LOB 列,则需要使用 ALTER TABLE TABLE_NAME MOVE LOB(COLUMN_NAME) STORE AS (TABLESPACE DEST_TABLESPACE) 将它们排除并单独移动
【解决方案2】:

试试这个把你的表 (tbl1) 移动到表空间 (tblspc2)。

alter table tb11 move tablespace tblspc2;

【讨论】:

    【解决方案3】:

    使用来自sqlsql

    将其输出到文件:

    select 'alter index '||owner||'.'||index_name||' rebuild tablespace TO_TABLESPACE_NAME;' from all_indexes where owner='OWNERNAME';
    

    spoolfile 会有这样的东西:

    alter index OWNER.PK_INDEX rebuild tablespace CORRECT_TS_NAME;
    

    【讨论】:

    • 您必须在 index_name 周围使用“...”,否则您将收到错误“ORA-01418:指定的索引不存在”。所以命令应该是:select 'alter index '||owner||'."'||index_name||'" rebuild tablespace TO_TABLESPACE_NAME;'从 all_indexes where owner='OWNERNAME';
    • @Jan:仅当索引名称包含小写字母时才正确。如果遵循良好做法,即所有索引仅使用大写字母命名,则无需引用名称。
    【解决方案4】:

    移动桌子:

    第一次运行:

    SELECT 'ALTER TABLE <schema_name>.' || OBJECT_NAME ||' MOVE TABLESPACE '||' <tablespace_name>; '
    FROM ALL_OBJECTS
    WHERE OWNER = '<schema_name>'
    AND OBJECT_TYPE = 'TABLE' <> '<TABLESPACE_NAME>';
    

    --或者在cmets中建议(自己没有测试过)

    SELECT 'ALTER TABLE <SCHEMA>.' || TABLE_NAME ||' MOVE TABLESPACE '||' TABLESPACE_NAME>; ' 
    FROM dba_tables 
    WHERE OWNER = '<SCHEMA>' 
    AND TABLESPACE_NAME <> '<TABLESPACE_NAME>
    

    其中&lt;schema_name&gt; 是用户名。 &lt;tablespace_name&gt; 是目标表空间。

    因此,您会得到如下行:

    ALTER TABLE SCOT.PARTS 移动表空间用户;

    将结果粘贴到脚本或类似应用程序的 oracle sql 开发人员中并运行它。

    移动索引:

    第一次运行:

    SELECT 'ALTER INDEX <schema_name>.'||INDEX_NAME||' REBUILD TABLESPACE <tablespace_name>;' 
    FROM ALL_INDEXES
    WHERE OWNER = '<schema_name>'
    AND TABLESPACE_NAME NOT LIKE '<tablespace_name>';
    

    此代码中的最后一行可以为您节省大量时间,因为它过滤掉了已经在正确表空间中的索引。

    因此你应该得到类似的东西:

    ALTER INDEX SCOT.PARTS_NO_PK REBUILD TABLESPACE 用户;

    将结果粘贴到脚本或类似应用程序的 oracle sql 开发人员中并运行它。

    最后但同样重要的是,移动 LOB:

    第一次运行:

    SELECT 'ALTER TABLE <schema_name>.'||LOWER(TABLE_NAME)||' MOVE LOB('||LOWER(COLUMN_NAME)||') STORE AS (TABLESPACE <table_space>);'
    FROM DBA_TAB_COLS
    WHERE OWNER = '<schema_name>' AND DATA_TYPE like '%LOB%';
    

    这会将 LOB 对象移动到另一个表空间。

    因此你应该得到类似的东西:

    ALTER TABLE SCOT.bin$6t926o3phqjgqkjabaetqg==$0 MOVE LOB(calendar) STORE AS (TABLESPACE USERS);

    将结果粘贴到脚本或类似应用程序的 oracle sql 开发人员中并运行它。

    还有一件事:

    由于某种原因,我无法移动“DOMAIN”类型索引。作为一种解决方法,我删除了索引。将用户的默认表空间更改为所需的表空间。然后重新创建索引。 可能有更好的方法,但它对我有用。

    【讨论】:

    • 选择'ALTER TABLE 。' ||表名 ||'移动表空间'||' ' FROM dba_tables WHERE OWNER = '' AND TABLESPACE_NAME '';过滤器的表已经在所需的表空间中
    • 答案中的第一个查询应替换为 Barun 的查询。
    【解决方案5】:

    我尝试了许多脚本,但它们并不适用于所有对象。您不能将群集对象从一个 tablespace 移动到另一个。为此,您必须使用 expdp,因此我建议 expdp 是将所有对象移动到不同表空间的最佳选择。

    下面是命令:

    nohup expdp \"/ as sysdba\" DIRECTORY=test_dir DUMPFILE=users.dmp LOGFILE=users.log TABLESPACES=USERS &
    

    详情可以查看this link

    【讨论】:

    • 如果不是 Oracle 支持人员告诉您,您不应该使用 sysdba 进行导出。
    • 导出不够。您也必须删除和导入对象。
    猜你喜欢
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 2021-05-04
    • 2017-03-22
    • 2021-10-12
    • 2019-12-30
    • 2019-08-16
    • 1970-01-01
    相关资源
    最近更新 更多