查询以显示数据库和数据文件中的所有表空间

mlh*_*zan 4 oracle oracle10g oracle11g

如何编写查询以显示数据库中的所有表空间,假设db及其对应的数据文件属于用户SCOTT。我可以连接到SCOTT帐户并查看它,但是我想以sysdba身份连接到sys,以查看所有表空间和数据文件都属于SCOTT。

小智 19

如果要获取当前数据库实例中使用的所有表空间的列表,可以使用 DBA_TABLESPACES 视图,如以下 SQL 脚本示例所示:

SQL> connect SYSTEM/fyicenter
Connected.

SQL> SELECT TABLESPACE_NAME, STATUS, CONTENTS
  2  FROM USER_TABLESPACES;
TABLESPACE_NAME                STATUS    CONTENTS
------------------------------ --------- ---------
SYSTEM                         ONLINE    PERMANENT
UNDO                           ONLINE    UNDO
SYSAUX                         ONLINE    PERMANENT
TEMP                           ONLINE    TEMPORARY
USERS                          ONLINE    PERMANENT
Run Code Online (Sandbox Code Playgroud)

http://dba.fyicenter.com/faq/oracle/Show-All-Tablespaces-in-Current-Database.html


小智 11

SELECT a.file_name,
       substr(A.tablespace_name,1,14) tablespace_name,
       trunc(decode(A.autoextensible,'YES',A.MAXSIZE-A.bytes+b.free,'NO',b.free)/1024/1024) free_mb,
       trunc(a.bytes/1024/1024) allocated_mb,
       trunc(A.MAXSIZE/1024/1024) capacity,
       a.autoextensible ae
FROM (
     SELECT file_id, file_name,
            tablespace_name,
            autoextensible,
            bytes,
            decode(autoextensible,'YES',maxbytes,bytes) maxsize
     FROM   dba_data_files
     GROUP BY file_id, file_name,
              tablespace_name,
              autoextensible,
              bytes,
              decode(autoextensible,'YES',maxbytes,bytes)
     ) a,
     (SELECT file_id,
             tablespace_name,
             sum(bytes) free
      FROM   dba_free_space
      GROUP BY file_id,
               tablespace_name
      ) b
WHERE a.file_id=b.file_id(+)
AND A.tablespace_name=b.tablespace_name(+)
ORDER BY A.tablespace_name ASC; 
Run Code Online (Sandbox Code Playgroud)


MMK*_*ami 9

一般来说,在oracle中,我将在下一节中提到许多事实:

  • 每个数据库可以有许多模式/用户(逻辑分区)。
  • 每个数据库可以具有许多表空间(逻辑除法)。
  • 模式是属于用户的一组对象(表,索引,视图等)。
  • 在Oracle中,可以将用户视为与架构相同的用户。
  • 数据库分为称为表空间的逻辑存储单元,这些逻辑存储单元将相关的逻辑结构分组在一起。例如,表空间通常对应用程序的所有对象进行分组,以简化某些管理操作。您可能有一个用于应用程序数据的表空间,以及一个用于应用程序索引的表空间。

因此,您的问题“查看所有表空间和数据文件都属于SCOTT”是有点错误的。

但是,有些DBA视图包含有关所有数据库对象的信息,而不论所有者是谁。只有具有DBA特权的用户才能访问以下视图:DBA_DATA_FILES,DBA_TABLESPACES,DBA_FREE_SPACE,DBA_SEGMENTS。

因此,以sysdba的身份连接到数据库,并通过这些有用的视图运行查询。例如,此查询可以帮助您查找用户对象所在的所有表空间及其数据文件:

SELECT DISTINCT sgm.TABLESPACE_NAME , dtf.FILE_NAME
FROM DBA_SEGMENTS sgm
JOIN DBA_DATA_FILES dtf ON (sgm.TABLESPACE_NAME = dtf.TABLESPACE_NAME)
WHERE sgm.OWNER = 'SCOTT'
Run Code Online (Sandbox Code Playgroud)


EdS*_*ens -4

数据库、表空间和数据文件都不属于任何用户。您有 MS SQL 背景吗?

select tablespace_name, 
       file_name
from dba_tablespaces
order by tablespace_name, 
         file_name;
Run Code Online (Sandbox Code Playgroud)

  • 你试过你的代码吗?这是行不通的。也许您尝试过这样做:`select a.tablespace_name, b.file_name from dba_tablespaces a join dba_data_files b on (a.tablespace_name=b.tablespace_name) order by tablespace_name;` (4认同)