【问题标题】:Query to display all tablespaces in a database and datafiles查询以显示数据库和数据文件中的所有表空间
【发布时间】:2016-07-12 13:40:28
【问题描述】:

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

【问题讨论】:

标签: oracle oracle11g oracle10g


【解决方案1】:

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

select tablespace_name, 
       file_name
from dba_tablespaces
order by tablespace_name, 
         file_name;

【讨论】:

  • 你试过你的代码了吗?这是行不通的。也许您已经尝试过这样做: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;
【解决方案2】:

在 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'

【讨论】:

    【解决方案3】:
    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; 
    

    【讨论】:

      【解决方案4】:

      如果要获取当前数据库实例中使用的所有表空间的列表,可以使用 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
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-27
        • 2012-02-25
        • 1970-01-01
        • 1970-01-01
        • 2017-06-24
        • 1970-01-01
        相关资源
        最近更新 更多