对象迁移表空间引出的三个小问题

简介: 我们有一个开发库,默认表空间是TEST_TBS,但今天查看开发库的时候,发现有些表和字段并不在用户默认使用的表空间中,而在USERS表空间,之所以可能是之前开发人员执行SQL是从其他库复制过来的,连通tablespace USERS名称一块复制了,为了规范,就需要将这些对象转移下表空间,期间碰见了几个常见的小问题,值得记录一下。

我们有一个开发库,默认表空间是TEST_TBS,但今天查看开发库的时候,发现有些表和字段并不在用户默认使用的表空间中,而在USERS表空间,之所以可能是之前开发人员执行SQL是从其他库复制过来的,连通tablespace USERS名称一块复制了,为了规范,就需要将这些对象转移下表空间,期间碰见了几个常见的小问题,值得记录一下。

问题1:新建的一张表,为什么dba_segments视图中没有找到对应的表和索引记录
实验:
创建一张表和一个索引:

CREATE TABLE tbl_tbl(ID NUMBER);
CREATE INDEX idx_tbl_tbl ON tbl_tbl(ID);

检索dba_segments发现记录为空:

SELECT * FROM dba_segments WHERE segment_name IN ('TBL_TBL', 'IDX_TBL_TBL');

明明已经创建了,为何显示为空?
其实这还需要补充下,测试环境为11g,有一个新特性叫延迟分配段空间,就是不会像之前的版本中create table之后就会为其分配段空间,而是在真正使用了之后才会为其分配段空间,这样可以做到真正的节省,只有真正用了,才会给你空间,即使你创建了,也不会初始分配任何段空间。例如现在向其中插入一条数据:

INSERT INTO TBL_TBL VALUES(1);

即使此时rollback了,再查询如下语句,也是可以找到记录了:

SELECT * FROM dba_segments WHERE segment_name IN ('TBL_TBL', 'IDX_TBL_TBL');

另外,user_tables和user_indexes视图中都有一个SEGMENT_CREATED字段,在create之后,这个字段值都是NO,只有像上面真正使用了,该字段值才会变为YES。

问题2:如何移动表和索引对象
这其实是一个语法问题了,对于表的移动:

alter table XXX move tablespace TEST_TBS;

对于索引的移动,这么用是错的:

alter index XXX move tablespace TEST_TBS;

应该是:

alter index XXX rebuild (online) tablespace TEST_TBS;

其中online的解释:

[ONLINE]
Enables you to continue to perform updates, insertions, and deletions on a base table. It does not enable you to query the base table.

http://docs.oracle.com/cd/E11882_01/text.112/e24436/csql.htm#CCREF0100

另外,找到所有需要移动的表:

SELECT 'alter table ' || table_name || ' move tablespace test_tbs;' FROM user_tables WHERE tablespace_name <> 'TEST_TBS';

找到所有需要移动的索引:

SELECT 'alter index ' || index_name || ' rebuild online tablespace test_tbs;' FROM user_indexes WHERE tablespace_name <> 'TEST_TBS';

问题3:LOB对象如何移动
从user_indexes视图中可以查询出LOB对象,对于LOB对象如果使用上述alter index方式转表空间会提示:

ORA-02327:无法以数据类型LOB的表达式创建索引

应该使用如下语法:

alter table XXX MOVE lob(LOB字段名称) store as (tablespace test_tbs);

http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_3001.htm#i2104128

目录
相关文章
|
SQL Oracle 关系型数据库
探秘Oracle表空间、用户、表之间的关系
 之前的DRP项目虽然用到了oracle,但是所有数据库对象的建立都是按文档来的,并没有仔细思考总结,后面再次用到oracle时,不能再那么糊里糊涂的用了,得稍微探索一下下了,究竟这些oracle中的数据库对象之间都存在什么关系呢?
探秘Oracle表空间、用户、表之间的关系
|
4月前
|
存储 关系型数据库 MySQL
认真学习InnoDB的数据存储结构中的区、段与表空间
认真学习InnoDB的数据存储结构中的区、段与表空间
56 2
|
存储 编解码 自然语言处理
谈谈元数据和数据字典的区别
今天在群里有朋友讨论元数据和数据字典的问题,元数据是解释数据的数据,数据字典也能解释数据,不都是解释数据的吗,怎们不同呢?接下来咱们就简单的讨论下这个问题,希望读完本文再没有这种困惑。
谈谈元数据和数据字典的区别
|
存储 关系型数据库 MySQL
独立表空间结构(1)之区---InnoDB表空间(二十七)
独立表空间结构(1)之区---InnoDB表空间(二十七)
|
存储 关系型数据库 MySQL
独立表空间结构(2)之段---InnoDB表空间(二十八)
独立表空间结构(2)之段---InnoDB表空间(二十八)
|
存储 关系型数据库 MySQL
段的结构 (4)---独立表空间结构(三十)
段的结构 (4)---独立表空间结构(三十)
|
存储 关系型数据库 MySQL
独立表空间&系统表空间总结---innoDB表空间(三十五)
独立表空间&系统表空间总结---innoDB表空间(三十五)
|
存储 关系型数据库 MySQL
整体结构&InnoDB数据字典(1) --系统表空间结构(三十三)
整体结构&InnoDB数据字典(1) --系统表空间结构(三十三)
|
存储 Oracle 关系型数据库
Oracle 数据库表空间不足拓展方法实例演示,表空间剩余大小查看,通过新增表空间文件拓展表空间,表空间文件路径查看
Oracle 数据库表空间不足拓展方法实例演示,表空间剩余大小查看,通过新增表空间文件拓展表空间,表空间文件路径查看
218 0
Oracle 数据库表空间不足拓展方法实例演示,表空间剩余大小查看,通过新增表空间文件拓展表空间,表空间文件路径查看
|
存储 监控 Oracle
Oracle数据库实例、用户、表、表空间之间关系
数据库:   Oracle数据库是数据的物理存储。这就包括(数据文件ORA或者DBF、控制文件、联机日志、参数文件)。   其实Oracle数据库的概念和其它数据库不一样,这里的数据库是一个操作系统只有一个库。可以看作是Oracle就只有一个大数据库。
2110 0

热门文章

最新文章