当前位置:首页 > Oracle > 正文内容

ORACLE的用户对象在不同表空间之间的移动

管理员11年前 (2009-09-20)Oracle283

某环境上有两个用户USERA 和 USERB ,两个用户的默认表空间都是TBS1,并且这两个用户的对象都在这个表空间上,现在有这样一个需求,把用户USERB分离出来,称到一个新建的表空间TBS2上,应该说是一个比较单的需求,马上就可以想到两个方法来达到这个目的。

第一种是采用exp/imp 的方法,在ORACLE 9i 及以前的版本,表空间一旦创建,表空间的名字就不让再改了,所以大家基本上都采用这样一个方法,在PL/SQL 、TOAD 或一些其他的可视化的工具,把建表、索引等语句都导出来,生成一个 .SQL 文件,再新建用户、授权限并且用新用户登录进来,在command 里执行刚才导出来的 SQL 文件,再用 imp 加 ignore=y 参数,就可完成数据的导入,如果是10G后以后的版本,先对表空间重新命名,再 exp 导出,再把表空间改成原来的名字,再新建一个表空间和刚才改的名字一样,再建用户、授权最后再导入,也是不一错的选择。

第二种,也就是今天所用的一种方法,对表对象或大字段对象直接使用 MOVE 的方法,来达到移动数据的方法,这个方法有几下个不足:(1)不对表包含有LONG 类型的表进行操作,(2)MOVE后,IX 或PK 可能处于无效状态,也必须重新建立,并必须要重新收集统计信息,(3)这里暂时没有分区表的信息,以后补上。

基本的步骤如下:

1. 先查出当前用户都有哪些段:

SQL> select distinct segment_type , tablespace_name from user_segments ;
SEGMENT_TYPE       TABLESPACE_NAME
------------------ ------------------------------
INDEX              TBS2
LOBINDEX           TBS2
LOBSEGMENT         TBS2
TABLE              TBS2

SQL>

2. 移动表对象对新的表空间

我们可以先从 user_tables 里查询到所有表的名称及所在表空间信息,移动表对象的语法示例如下:

SQL> alter table report1 move tablespace TBS2 ;

表已更改。

SQL>

3. 移动大字段对象对新的表空间

大字段列和表的对应关系,我们可以从 user_lobs 中查到 ,移动大字段对象的语法的示例如下:

SQL> alter table api_t_bflog
  2  move lob(send_details) store as(tablespace TBS2) ;

表已更改。

4. 移动索引到新的表空间

SQL> alter index usertype rebuild tablespace TBS2 ;

索引已更改。

SQL>

5. 语句生成语句

select 'alter table ' || table_name || ' move tablespace TBS2; '
  from user_tables
 where tablespace_name <> ' TBS2 '
union all
select 'alter table ' || table_name || ' move lob(' || column_name ||
       ') store as(tablespace TBS2 );'
  from user_lobs
 where segment_name in (select segment_name
                          from user_segments
                         where tablespace_name <> 'TBS2'
                           and segment_type = 'LOBSEGMENT')
union all
select 'alter index ' || index_name || ' rebuild tablespace TBS2 ;'
  from user_indexes
 where tablespace_name <> ' TBS2 '
   and index_type <> 'LOB'

完成!

打赏 支付宝打赏 微信打赏
    扫描二维码至手机访问

    扫描二维码推送至手机访问。

    版权声明:本文由卖水果的net发布,如需转载请注明出处。

    转载请注明出处:http://www.msgde.net/oracle/oracle_table_move_tablespace.html

    分享给朋友:

    发表评论

    访客

    ◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。