如果在建表时不按规范,很可能会出现一个库中的多个表分别存储在不同的表空间中,当遇到数据迁移的情况就比较麻烦,一种方法是在要迁移到的数据库中建立多个表空间,来匹配原来的数据库,这样可以防止迁移时没有表空间报错,方法简单,但要占用很多无用的空间(建多个表空间);第二种方法就是迁移前将原来数据库中的表都移动到同一个表空间中,我们主要介绍第二种方法。
用pl/sql developer查看表空间可以发现,属于一个表空间的有三种数据:tables、indexes、clusters,clusters不常用,很多时候不建立,我们主要考虑tables和indexes的移动。
tables改变表空间可以用“alter table TABLE_NAME move tablespace NEW_TABLESPACE”实现,即使有的表中包含大字段(blob,clob)也可以移动成功,不会提示错误。
更改表所属表空间的sql语句只移动了表本身的存储空间,而跟随表的indexes因为和表存放的段不同,所以并没有移动,仍然在原来的表空间中, 对于没有大字段的表移动这些索引可以用“alter index INDEX_NAME rebuild NEW_TABLESPACE”,即可顺利迁移索引。
而对于含有大字段的表,因为大字段和表存储在不同的段上,建立表时,数据库会自动的为大字段建立索引,查看表结构是看不到这些隐藏的索引的,可以通过“select * from user_indexes”查看。这些大字段的索引用“alter indexes ...”是不行的,数据库会提示:“无法以数据类型LOB的表达式创建索引”,如果想要移动这些LOB索引,必须用特定的语法来移动:
移动完后,表,普通索引,大字段索引就都迁移到新的表空间去了。