【问题标题】:How to find Oracle database object name from segment name?如何从段名中查找 Oracle 数据库对象名?
【发布时间】:2019-10-20 09:14:29
【问题描述】:
我已将所有表和索引移至其他表空间。操作完成后,user_tables 和 user_indexes 中的所有对象都有新的表空间名称。
但是在user_segments中,还有一些旧的表空间名称:
- Partition_name:null,
- Segment_type:表或索引,
- Segment_subtype:ASSM。
问题:
为什么 user_indexes 中没有具有旧表空间名称的对象,而 user_segments 中的某些段具有旧表空间?
如何从段名中找出数据库对象名,以便它们也可以移动到新的表空间?
【问题讨论】:
标签:
database
oracle12c
tablespace
【解决方案1】:
我不是 DBA。
不管怎样,看看有没有道理。
路径如下:表的数据在数据块>extent>segment>tablespace中。
SQL> select t.table_name,
2 e.extent_id,
3 s.segment_name,
4 s.segment_type,
5 s.segment_subtype,
6 s.tablespace_name
7 from user_tables t join user_extents e on e.segment_name = t.table_name
8 join user_segments s on s.segment_name = e.segment_name
9 where t.table_name = 'EMP';
TABLE_NAME EXTENT_ID SEGMENT_NAME SEGMENT_TYPE SEGMENT_SU TABLESPACE_NAME
---------- ---------- ------------ ------------ ---------- --------------------
EMP 0 EMP TABLE ASSM USERS
SQL>
显然,segment name = table name 这意味着如果您想查找属于某个表空间的对象,那么这可能就是您要查找的内容:
SQL> select s.segment_name, s.segment_type
2 from user_segments s
3 where s.tablespace_name = 'USERS';
SEGMENT_NAME SEGMENT_TYPE
------------ ------------
T1 TABLE
T2 TABLE
EMP TABLE
DEPT TABLE
<snip>
PK_SC1 INDEX
SYS_C007864 INDEX
SYS_C007928 INDEX
33 rows selected.
SQL>