移动表和索引到指定的表空间是dba必须知道的技能。
一、首先,我们来讲一下为什么要移动表到到空间,我经历过移动有两种情况要移动表和索引的
1、当表和索引产生打量了的碎片的时候;
2、重新设计单独的索引表空间,把表和索引分离。
二、开动
1、移动表,如果移动单个表到指定的空间,很简单。
alter table table_Name move tablespace jscn;
2、移动某个用户的所有表到指定的表空间,比如我们要移动jscn这个用户到jscndata表空间里面,我们首先以jscn移动登录plsq
[oracle@rac1 ~]$ sqlplus jscn/jscn123
SQL> set pagesize 200
SQL> select 'alter table '|| table_name ||' move tablespace jscndata;' from user_all_tables;
'ALTERTABLE'||TABLE_NAME||'MOVETABLESPACEJSCNDATA;'
--------------------------------------------------------------------------------
alter table PRODUCT_POP_TYPE move tablespace jscndata;
alter table PRODUCT_RELATION move tablespace jscndata;
alter table PROMOTIONS_GIFT_P move tablespace jscndata;
alter table PROMOTIONS_JOIN_P move tablespace jscndata;
...........
然后,我们把下面的语句刷一遍就可以了,
如果语句一直卡住,怎么办?
没事可以看看后台日志啊
tail -f /oracle/ora10g/admin/jscn/bdump/alert_jscn1.log
看到reod日志在疯狂地切换,因为我的数据很大啊,(redo不知道,我去,那你可以不用搞数据库了)
Current log# 2 seq# 308 mem# 0: +DATA/jscn/onlinelog/group_2.267.768517119
Thread 1 cannot allocate new log, sequence 309
Checkpoint not complete
Current log# 2 seq# 308 mem# 0: +DATA/jscn/onlinelog/group_2.267.768517119
Mon Dec 19 17:58:26 2011
Thread 1 advanced to log sequence 309 (LGWR switch)
Current log# 1 seq# 309 mem# 0: +DATA/jscn/onlinelog/group_1.278.768517115
Mon Dec 19 17:58:32 2011
Thread 1 advanced to log sequence 310 (LGWR switch)
Current log# 2 seq# 310 mem# 0: +DATA/jscn/onlinelog/group_2.267.768517119
Mon Dec 19 17:58:36 2011
查看一下结果
SQL> select table_name ,tablespace_name from user_tables;
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
PRODUCT_POP_TYPE JSCNDATA
PRODUCT_RELATION JSCNDATA
PROMOTIONS_GIFT_P JSCNDATA
PROMOTIONS_JOIN_P JSCNDATA
PROMOTIONS_OFFERS JSCNDATA
...........
3、移动索引
1)因为我们这里字段有clob类型,clob默认会创建索引,所以移动的时候要先移动clob字段所产生的索引。
下面这个例子,我要把jscn用户下所有的clob索引移动到jscnindex表空间中
SQL> set linesize 200
SELECT 'alter table ' ||t.table_name ||
' move tablespace jscndata lob (' || t.column_name ||
') store as(tablespace JSCNINDEX);' v_sql
FROM user_lobs t
V_SQL
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
alter table STORE_PAGE move tablespace jscndata lob (CONTENT) store as(tablespace JSCNINDEX);
alter table STORE move tablespace jscndata lob (SHIP_TYPE_CONTENT) store as(tablespace JSCNINDEX);
alter table STORE move tablespace jscndata lob (SERVICE_CONTENT) store as(tablespace JSCNINDEX);
然后把V_SQL里面的语句所有的全部刷一遍就可以了
2)重建普通的索引
SQL> set pagesize 200
SQL> select 'alter index '|| index_name ||' rebuild tablespace jscnindex;' from user_indexes;
'ALTERINDEX'||INDEX_NAME||'REBUILDTABLESPACEJSCNINDEX;'
------------------------------------------------------------------------------------------------------------------------------------------------
alter index YDORDERTRACER_UUID rebuild tablespace jscnindex;
alter index PK_YDORDER rebuild tablespace jscnindex;
alter index VISIT_LOG_ID rebuild tablespace jscnindex;
alter index PK_VIR_ACCOUNT_LOG rebuild tablespace jscnindex;
把语句在plsql里面刷一遍就可以了
刷语句的过程中如果碰到
SQL> alter index SYS_IL0000052047C00118$$ rebuild tablespace jscnindex
*
ERROR at line 1:
ORA-02327: cannot create index on expression with datatype LOB
不要紧,miss就可以了