首页 > 解决方案 > 如何从段名中查找 Oracle 数据库对象名?

问题描述

我已将所有表和索引移至其他表空间。操作后, user_tablesuser_indexes中的所有对象都具有新的表空间名称。

但是在user_segments中,还有一些旧的表空间名称:

问题:

  1. 为什么 user_indexes 中没有具有旧表空间名称的对象,而user_segments中的某些段具有旧表空间?

  2. 如何从段名称中找出数据库对象名称,以便它们也可以移动到新的表空间?

标签: databaseoracle12ctablespace

解决方案


我不是 DBA。

无论如何,看看它是否有意义。

路径看起来是这样的:表的数据在数据块 > 范围 > 段 > 表空间中。

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>

推荐阅读