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

use*_*625 28 oracle move oracle11g

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

Rah*_*thi 52

试试这个:-

ALTER TABLE <TABLE NAME to be moved> MOVE TABLESPACE <destination TABLESPACE NAME>
Run Code Online (Sandbox Code Playgroud)

IVAN在评论中提出了非常好的建议,因此我想在我的回答中加入

注意:这将使所有表的索引无效.所以这个命令通常紧随其后

alter index <owner>."<index_name>" rebuild;
Run Code Online (Sandbox Code Playgroud)

  • 注意:这将使所有表的索引无效.因此,此命令通常后跟"alter index <name> rebuild". (7认同)
  • 在上面的基础上,这将找到obs tbs并在同一个go中生成ALTER ...`SELECT Segment_Name,Segment_Type,Tablespace_Name,Bytes,Blocks,Extents,q'[ALTER]'|| Segment_Type || 问'[]'|| 用户|| 问'[.]'|| Segment_Name || 例如Segment_Type ='INDEX'那么q'[REBUILD]'ELSE q'[MOVE]'END || 问'[TABLESPACE]'|| q'[TABLESPACE_NAME_GOES_HERE]'|| q'[;]'FROM Dba_Segments WHERE Owner = USER AND Tablespace_Name <>'TABLESPACE_NAME_GOES_HERE'ODER BY Segment_Name;` (2认同)

小智 11

使用sql来自sql:

假脱机输出到文件:

select 'alter index '||owner||'.'||index_name||' rebuild tablespace TO_TABLESPACE_NAME;' from all_indexes where owner='OWNERNAME';
Run Code Online (Sandbox Code Playgroud)

spoolfile将具有以下内容:

alter index OWNER.PK_INDEX rebuild tablespace CORRECT_TS_NAME;
Run Code Online (Sandbox Code Playgroud)

  • @Jan:只有当索引名称包含小写字母时,这才是正确的。如果遵循良好的做法,我的意思是所有索引仅使用大写字母命名,则无需引用名称。 (2认同)

Roo*_*000 8

移动表:

第一次运行:

SELECT 'ALTER TABLE <schema_name>.' || OBJECT_NAME ||' MOVE TABLESPACE '||' <tablespace_name>; '
FROM ALL_OBJECTS
WHERE OWNER = '<schema_name>'
AND OBJECT_TYPE = 'TABLE' <> '<TABLESPACE_NAME>';
Run Code Online (Sandbox Code Playgroud)

- 或在评论中建议(没有自己测试)

SELECT 'ALTER TABLE <SCHEMA>.' || TABLE_NAME ||' MOVE TABLESPACE '||' TABLESPACE_NAME>; ' 
FROM dba_tables 
WHERE OWNER = '<SCHEMA>' 
AND TABLESPACE_NAME <> '<TABLESPACE_NAME>
Run Code Online (Sandbox Code Playgroud)

<schema_name>用户的名称在哪里.并且<tablespace_name>是目标表空间.

结果你得到如下行:

ALTER TABLE SCOT.PARTS移动TABLESPACE用户;

将结果粘贴到脚本或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>';
Run Code Online (Sandbox Code Playgroud)

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

结果你应该得到类似的东西:

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%';
Run Code Online (Sandbox Code Playgroud)

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

结果你应该得到类似的东西:

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

将结果粘贴到脚本或oracle sql开发人员(如应用程序)中并运行它.

哦还有一件事:

出于某种原因,我无法移动"DOMAIN"类型索引.作为一种解决方法,我放弃了索引.将用户的默认表空间更改为de desired tablespace.然后再次重新创建索引.有一个更好的方法,但它对我有用.

  • SELECT'ALTER TABLE <SCHEMA>.' || TABLE_NAME ||' MOVE TABLESPACE'||' <TABLESPACE_NAME>'FROM dba_tables WHERE OWNER ='<SCHEMA>'和TABLESPACE_NAME <>'<TABLESPACE_NAME>'; 过滤器的表已在所需的表空间中 (3认同)