ITPub博客

首页 > Linux操作系统 > Linux操作系统 > show_space脚本

show_space脚本

原创 Linux操作系统 作者:CaptainKobe 时间:2010-01-21 19:48:06 0 删除 编辑
CREATE OR REPLACE PROCEDURE show_space(
  --this procedure can only be used for non-partitioned tables,indexex,clusters
  seg_name VARCHAR2
) AS
  blks_1       NUMBER;
  bytes_1      NUMBER;
  blks_2       NUMBER;
  bytes_2      NUMBER;
  blks_3       NUMBER;
  bytes_3      NUMBER;
  blks_4       NUMBER;
  bytes_4      NUMBER;
  blks_f       NUMBER;
  bytes_f      NUMBER;
  blks_u       NUMBER;
  bytes_u      NUMBER;
  tblks        NUMBER;
  tbs          NUMBER;
  ublks        NUMBER;
  ubs          NUMBER;
  luefid       NUMBER;
  luebid       NUMBER;
  lastub       NUMBER;
  free_blks     NUMBER;
  isassm       VARCHAR2(10);
  seg_type     VARCHAR2(10);
  PROCEDURE output(
    in_str   VARCHAR2
   ,in_num   NUMBER
   ,isformat NUMBER DEFAULT 0
  ) IS
    format_num VARCHAR2(20);
  BEGIN
    IF isformat = 0 THEN
      dbms_output.put_line(rpad(in_str, 35, '-') || '> ' || in_num);
    ELSE
      IF in_num / 1024 / 1024 < 1 AND in_num / 1024 / 1024 <> 0 THEN
        format_num := '0' || to_char(round(in_num / 1024 / 1024, 2));
      ELSE
        format_num := to_char(round(in_num / 1024 / 1024, 2));
      END IF;
      dbms_output.put_line(rpad(in_str, 35, '-') || '> ' || format_num ||
                           '(m)');
    END IF;
  END;

BEGIN
  --1.ensure segment_type
  SELECT a.segment_type
  INTO seg_type
  FROM dba_segments a
  WHERE a.segment_name = upper(seg_name);
  --2.ensure segment_space_management
  --(1).if it is table
  IF upper(seg_type)=upper('table') THEN
    SELECT a.segment_space_management
    INTO isassm
    FROM dba_tablespaces a, dba_tables b
    WHERE b.table_name = upper(seg_name)
          AND a.tablespace_name = b.tablespace_name;
  --(2).if it is index
  ELSIF upper(seg_type)=upper('index') THEN
    SELECT a.segment_space_management
    INTO isassm
    FROM dba_tablespaces a, dba_indexes b
    WHERE b.index_name = upper(seg_name)
          AND a.tablespace_name = b.tablespace_name;
  --(3).if it is cluster
  ELSIF upper(seg_type)=upper('cluster') THEN
    SELECT a.segment_space_management
    INTO isassm
    FROM dba_tablespaces a, dba_clusters b
    WHERE b.cluster_name = upper(seg_name)
          AND a.tablespace_name = b.tablespace_name;
  END IF;
  dbms_output.put_line('');
  dbms_output.put_line('## '||'the tablespace of this segment is ' || upper(isassm) || ' ##');
  dbms_output.put_line('');
  --3.dbms_space.unused_space
  dbms_space.unused_space(
    segment_owner             => upper(USER),
    segment_name              => upper(seg_name),
    segment_type              => upper(seg_type),
    total_blocks              => tblks,
    total_bytes               => tbs,
    unused_blocks             => ublks,
    unused_bytes              => ubs,
    last_used_extent_file_id  => luefid,
    last_used_extent_block_id => luebid,
    last_used_block           => lastub
  );
  output('total_blocks', tblks);
  output('total_bytes', tbs, 1);
  output('unused_blocks', ublks);
  output('unused_bytes', ubs, 1);
  output('last_used_extent_file_id', luefid);
  output('last_used_extent_block_id', luebid);
  output('last_used_block', lastub);
  --4.dbms_space.space_usage,this can only be used for assm
  IF upper(isassm) = upper('auto') THEN
      dbms_space.space_usage(
        segment_owner      => upper(USER),
        segment_name       => upper(seg_name),
        segment_type       => upper(seg_type),
        unformatted_blocks => blks_u,
        unformatted_bytes  => bytes_u,
        fs1_blocks         => blks_1,
        fs2_blocks         => blks_2,
        fs3_blocks         => blks_3,
        fs4_blocks         => blks_4,
        fs1_bytes          => bytes_1,
        fs2_bytes          => bytes_2,
        fs3_bytes          => bytes_3,
        fs4_bytes          => bytes_4,
        full_blocks        => blks_f,
        full_bytes         => bytes_f
      );
      output('unformatted_blocks', blks_u);
      output('unformatted_bytes', bytes_u, 1);
      output(' 0% --  25% free space blocks', blks_1);
      output(' 0% --  25% free space bytes', bytes_1, 1);
      output('25% --  50% free space blocks', blks_2);
      output('25% --  50% free space bytes', bytes_2, 1);
      output('50% --  75% free space blocks', blks_3);
      output('50% --  75% free space bytes', bytes_3, 1);
      output('75% -- 100% free space blocks', blks_4);
      output('75% -- 100% free space bytes', bytes_4, 1);
      output('full_blocks', blks_f);
      output('full_bytes', bytes_f, 1);
  END IF;
  --5.dbms_space.free_blocks,this can only be used for MSSM
  IF upper(isassm) = upper('manual') THEN
    dbms_space.free_blocks(
      segment_owner     => upper(USER),
      segment_name      => upper(seg_name),
      segment_type      => upper(seg_type),
      freelist_group_id => 0,
      free_blks         => free_blks
    );
    output('free_blocks',free_blks);
  END IF;
END;

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22745099/viewspace-625715/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: decode17
下一篇: show_space应用
请登录后发表评论 登录
全部评论

注册时间:2010-01-11

  • 博文量
    23
  • 访问量
    23613