oracle 11g 如何将表从一个表空间移动到另一个表空间

Posted

技术标签:

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

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

【问题讨论】:

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

试试这个:-

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

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

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

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

【讨论】:

From the documentation;和more here 注意:这将使所有表的索引无效。所以这个命令后面通常跟“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 进行导出。 导出不够。您也必须删除和导入对象。

以上是关于oracle 11g 如何将表从一个表空间移动到另一个表空间的主要内容,如果未能解决你的问题,请参考以下文章

oracle数据库如何把表从一个表空间移到另一个表空间

oracle数据库如何把表从一个表空间移到另一个表空间

如何将表从一个mysql数据库复制到另一个mysql数据库

将表从 Postgres RDS 迁移到另一个 RDS

将表从一个数据库复制到另一个

将 hive 表从一个数据库转移到另一个