【问题标题】:How to Get all table space name, Allocated size, Free size, Capacity from single query?如何从单个查询中获取所有表空间名称、分配大小、空闲大小、容量?
【发布时间】:2013-10-08 06:06:01
【问题描述】:

我怎样才能以以下格式获取有关我的数据库中所有表空间的信息。

TABLESPACE_NAME | FILE_NAME |  ALLOCATED_MB  | FREE_MB |  CAPACITY |

有没有办法自动将所有表空间的每日大小存储在另一个表中?实际上,我需要每天准备有关表空间的清单。所以我不想创建前端,它会根据每天存储有关表空间大小信息的表自动通过电子邮件向我发送表空间大小详细信息..

【问题讨论】:

标签: oracle


【解决方案1】:

尝试以下查询以获取 oracle 中的所有表空间详细信息。假设您具有访问 dba 表的必要权限。

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; 

【讨论】:

  • 经过一些修改,这个查询可以完美运行,但是有没有办法将这些信息自动存储在另一个表中,而不是每天运行插入查询。
  • 目前我认为没有自动存储信息的选项。
  • 相反,您可以创建一个过程来比较表空间大小的差异,并使用dbms_scheduler 每天运行。
【解决方案2】:
Select a.tablespace_name,a.file_name,a.bytes/1024/1024 TABLESPACE_SIZE_MB,
Sum(b.bytes)/1024/1024 FREE_IN_MB from dba_free_space b,dba_data_files a
Where a.tablespace_name = b.tablespace_name
AND a.file_id = b.file_id
GROUP by a.tablespace_name, a.file_name,a.bytes/1024/1024
Order by a.tablespace_name, a.file_name;

您可以运行此查询,这可能会有所帮助。

【讨论】:

    【解决方案3】:

    在 Oracle 中参考以下链接:

    How do I calculate tables size in Oracle

    https://forums.oracle.com/thread/2160787

    COLUMN TABLE_NAME FORMAT A32
    COLUMN OBJECT_NAME FORMAT A32
    COLUMN OWNER FORMAT A10
    
    SELECT
       owner, table_name, TRUNC(sum(bytes)/1024/1024) Meg
    FROM
    (SELECT segment_name table_name, owner, bytes
     FROM dba_segments
     WHERE segment_type = 'TABLE'
     UNION ALL
     SELECT i.table_name, i.owner, s.bytes
     FROM dba_indexes i, dba_segments s
     WHERE s.segment_name = i.index_name
     AND   s.owner = i.owner
     AND   s.segment_type = 'INDEX'
     UNION ALL
     SELECT l.table_name, l.owner, s.bytes
     FROM dba_lobs l, dba_segments s
     WHERE s.segment_name = l.segment_name
     AND   s.owner = l.owner
     AND   s.segment_type = 'LOBSEGMENT'
     UNION ALL
     SELECT l.table_name, l.owner, s.bytes
     FROM dba_lobs l, dba_segments s
     WHERE s.segment_name = l.index_name
     AND   s.owner = l.owner
     AND   s.segment_type = 'LOBINDEX')
    WHERE owner in UPPER('&owner')
    GROUP BY table_name, owner
    HAVING SUM(bytes)/1024/1024 > 10  /* Ignore really small tables */
    ORDER BY SUM(bytes) desc
    ;
    

    SQL中参考下面

    Get size of all tables in database

    【讨论】:

    • 谢谢,这正是我正在寻找的,但我不想列出所有表空间而不是表空间。
    【解决方案4】:

    以上有用。希望这在这里也有帮助:

    https://ora-data.blogspot.in/2016/12/how-to-find-details-of-tablespace.html

    用不同的命令检查表空间的详细信息,上面的命令可能不起作用:

    SQL>select round((bytes/1024)/1024,0) "Used Space(MB)",
    round(total,0) "Allocated size(MB)",
    round(max,0) "Maximum allowable(MB)",
    round(max-(BYTES/1024)/1024,0) "Effective free(MB)",
    round(((max-(BYTES/1024)/1024)/max)*100,2) "FREE(%)"
    from SYS.SM$TS_USED,
    (select sum((BYTES/1024)/1024) total, sum((decode(MAXBYTES,0,bytes,maxbytes)/1024)/1024) max
    from dba_data_files where tablespace_name='&1') where tablespace_name='&1'; 
    

    【讨论】:

      猜你喜欢
      • 2018-03-14
      • 2023-03-23
      • 1970-01-01
      • 2016-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-19
      • 1970-01-01
      相关资源
      最近更新 更多