Oracle 全文索引的表空间转移

   工作中经常会转移表空间,表和一般的索引都没有什么问题,如果表有全文索引的话就需要做特别的处理,不能将全文索引和普通索引一样通过rebuild index来处理,需要将此全文索引先删除然后重建。具体方法如下:

1.如果没有建立preference的话,那么Oracle会将这些对象存放到默认表空间中,并根据默认表空间的存储参数设置这些对象的存储参数。

CONTEXT索引生成表的规则是DR$+索引名+$+表用途标识。

DR$IND_T_DOCS$I存储的是索引数据表(Index data table);

DR$IND_T_DOCS$K存储的是键值映射表(Keymap table);

DR$IND_T_DOCS$R是ROWID表(Rowid table);

DR$IND_T_DOCS$N是负键值链表(Negative list table);

DR$IND_T_DOCS$P这个表只有在CONTEXT索引中设置BASIC_WORDLIST的SUBSTRING_INDEX属性后才会生成,用来保存单词的部分内容。

用户tnsh的默认表空间是TNS2008,所以这些索引对象都放在了TNS2008.

SQL> select default_tablespace from dba_users where username='TNSH';

DEFAULT_TABLESPACE
------------------------------
TNS2008

SQL> drop index TNSH.I_PRODUCT_NAME_3;

Index dropped.

SQL> CREATE INDEX TNSH.I_PRODUCT_NAME_3 ON TNSH.PRODUCT_NAME
  2  (PRODUCT_NAME)
  3  INDEXTYPE IS CTXSYS.CONTEXT
  4  PARAMETERS('SYNC ( ON COMMIT)')
  5  NOPARALLEL;

SQL> select owner,index_name,index_type,table_name,tablespace_name
  2  from dba_indexes where owner='TNSH' and table_name  like '%PRODUCT_NAME_3%';

OWNER  INDEX_NAME                     INDEX_TYPE      TABLE_NAME                               TABLESPACE
------ ------------------------------ --------------- ---------------------------------------- ----------
TNSH   SYS_IOT_TOP_494187             IOT - TOP       DR$I_PRODUCT_NAME_3$N                    TNS2008
TNSH   SYS_IOT_TOP_494182             IOT - TOP       DR$I_PRODUCT_NAME_3$K                    TNS2008
TNSH   SYS_IL0000494184C00002$$       LOB             DR$I_PRODUCT_NAME_3$R                    TNS2008
TNSH   SYS_IL0000494179C00006$$       LOB             DR$I_PRODUCT_NAME_3$I                    TNS2008
TNSH   DR$I_PRODUCT_NAME_3$X          NORMAL          DR$I_PRODUCT_NAME_3$I                    TNS2008

由于这个索引 没有使用BASIC_WORDLIST的SUBSTRING_INDEX,所以没有DR$IND_T_DOCS$P的表。

更改默认表空间后试一下:

SQL> alter user tnsh default tablespace  tns2008_TMP;

User altered.

SQL> drop index TNSH.I_PRODUCT_NAME_3;

Index dropped.

SQL> CREATE INDEX TNSH.I_PRODUCT_NAME_3 ON TNSH.PRODUCT_NAME
  2  (PRODUCT_NAME)
  3  INDEXTYPE IS CTXSYS.CONTEXT
  4  PARAMETERS('SYNC ( ON COMMIT)')
  5  NOPARALLEL;

Index created.

SQL> select owner,index_name,index_type,table_name,tablespace_name
  2  from dba_indexes where owner='TNSH' and table_name  like '%PRODUCT_NAME_3%';

OWNER  INDEX_NAME                     INDEX_TYPE      TABLE_NAME                               TABLESPACE_NAME
------ ------------------------------ --------------- ---------------------------------------- ---------------
TNSH   SYS_IOT_TOP_494199             IOT - TOP       DR$I_PRODUCT_NAME_3$N                    TNS2008_TMP
TNSH   SYS_IOT_TOP_494194             IOT - TOP       DR$I_PRODUCT_NAME_3$K                    TNS2008_TMP
TNSH   SYS_IL0000494196C00002$$       LOB             DR$I_PRODUCT_NAME_3$R                    TNS2008_TMP
TNSH   SYS_IL0000494191C00006$$       LOB             DR$I_PRODUCT_NAME_3$I                    TNS2008_TMP
TNSH   DR$I_PRODUCT_NAME_3$X          NORMAL          DR$I_PRODUCT_NAME_3$I                    TNS2008_TMP

这些索引的表空间使用了默认的表空间。

所以在没有使用preferences的时候,更改用户的默认表空间后重建全文索引就可以了。

 

如果不能通过改变默认表空间的办法,就需要指定preferences了。

建立一个新的preference,最好在ctxsys用户下建立:

SQL> conn ctxsys/ctxsys
Connected.
SQL>  exec CTX_DDL.CREATE_PREFERENCE('TNSH_STORAGE', 'BASIC_STORAGE');

PL/SQL procedure successfully completed.

SQL> begin
  2   CTX_DDL.SET_ATTRIBUTE('TNSH_STORAGE', 'I_TABLE_CLAUSE', 'TABLESPACE TNS2008_TMP');
  3   CTX_DDL.SET_ATTRIBUTE('TNSH_STORAGE', 'K_TABLE_CLAUSE', 'TABLESPACE TNS2008_TMP');
  4   CTX_DDL.SET_ATTRIBUTE('TNSH_STORAGE', 'R_TABLE_CLAUSE', 'TABLESPACE TNS2008_TMP');
  5   CTX_DDL.SET_ATTRIBUTE('TNSH_STORAGE', 'N_TABLE_CLAUSE', 'TABLESPACE TNS2008_TMP');
  6   CTX_DDL.SET_ATTRIBUTE('TNSH_STORAGE', 'P_TABLE_CLAUSE', 'TABLESPACE TNS2008_TMP');
  7   CTX_DDL.SET_ATTRIBUTE('TNSH_STORAGE', 'I_INDEX_CLAUSE', 'TABLESPACE TNS2008_TMP');
  8   end;
  9  /

PL/SQL procedure successfully completed.

SQL> conn l5m/l5m
Connected.

SQL> alter user tnsh default tablespace  tns2008;

User altered.

SQL> drop index TNSH.I_PRODUCT_NAME_3;

Index dropped.

SQL> CREATE INDEX TNSH.I_PRODUCT_NAME_3 ON TNSH.PRODUCT_NAME
  2  (PRODUCT_NAME)
  3  INDEXTYPE IS CTXSYS.CONTEXT
  4  PARAMETERS('SYNC ( ON COMMIT) STORAGE CTXSYS.TNSH_STORAGE');  

Index created.

SQL> select owner,index_name,index_type,table_name,tablespace_name
  2  from dba_indexes where owner='TNSH' and table_name  like '%PRODUCT_NAME_3%';

OWNER  INDEX_NAME                     INDEX_TYPE      TABLE_NAME                               TABLESPACE_NAME
------ ------------------------------ --------------- ---------------------------------------- ---------------
TNSH   SYS_IOT_TOP_494214             IOT - TOP       DR$I_PRODUCT_NAME_3$N                    TNS2008_TMP
TNSH   SYS_IOT_TOP_494209             IOT - TOP       DR$I_PRODUCT_NAME_3$K                    TNS2008_TMP
TNSH   SYS_IL0000494211C00002$$       LOB             DR$I_PRODUCT_NAME_3$R                    TNS2008_TMP
TNSH   SYS_IL0000494206C00006$$       LOB             DR$I_PRODUCT_NAME_3$I                    TNS2008_TMP
TNSH   DR$I_PRODUCT_NAME_3$X          NORMAL          DR$I_PRODUCT_NAME_3$I                    TNS2008_TMP

这时全文索引所使用的表空间就使用了preference所设定的表空间了。

preference相关的视图:

查看所有preference,CTS_PREFERENCES

SQL> select * from CTX_PREFERENCES where pre_name='TNSH_STORAGE';

PRE_OWNER                      PRE_NAME                       PRE_CLASS                      PRE_OBJECT
------------------------------ ------------------------------ ------------------------------ ------------------------------
CTXSYS                         TNSH_STORAGE                   STORAGE                        BASIC_STORAGE

查看preference的值,CTX_PREFERENCE_VALUES

SQL>  select * from CTX_PREFERENCE_VALUES  where prv_preference='TNSH_STORAGE';

PRV_OWNER  PRV_PREFERENCE       PRV_ATTRIBUTE        PRV_VALUE
---------- -------------------- -------------------- --------------------------------------------------
CTXSYS     TNSH_STORAGE         I_TABLE_CLAUSE       TABLESPACE TNS2008_TMP
CTXSYS     TNSH_STORAGE         K_TABLE_CLAUSE       TABLESPACE TNS2008_TMP
CTXSYS     TNSH_STORAGE         R_TABLE_CLAUSE       TABLESPACE TNS2008_TMP
CTXSYS     TNSH_STORAGE         N_TABLE_CLAUSE       TABLESPACE TNS2008_TMP
CTXSYS     TNSH_STORAGE         I_INDEX_CLAUSE       TABLESPACE TNS2008_TMP
CTXSYS     TNSH_STORAGE         P_TABLE_CLAUSE       TABLESPACE TNS2008_TMP

6 rows selected.

更多的视图参考文档:

https://docs.oracle.com/cd/B19306_01/text.102/b14218/toc.htm

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值