Advertisement
ExaGridDba

asmdu.sql

Mar 1st, 2014
262
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. SET linesize 200
  2. SET trimspool ON
  3. SET serveroutput ON format wrapped
  4.  
  5. spool asmdu.txt
  6.  
  7. DECLARE
  8.    -- asmdu.sql
  9.    -- ASM directory usage
  10.    -- 2014-03-01
  11.    -- http://pastebin.com/VU7Hj9UV
  12.  
  13.    TYPE typ_rec_dglist IS RECORD (dgdir v$asm_alias.reference_index%TYPE);
  14.  
  15.    TYPE brian_fitzgerald IS TABLE OF typ_rec_dglist
  16.                                    INDEX BY BINARY_INTEGER;
  17.  
  18.    tab_dglist     brian_fitzgerald;
  19.  
  20.    TYPE ExaGridDba
  21.       IS RECORD (subdiridx v$asm_alias.reference_index%TYPE);
  22.  
  23.    TYPE typ_tab_dirlist IS TABLE OF ExaGridDba
  24.                               INDEX BY BINARY_INTEGER;
  25.  
  26.    TYPE typ_rec_dir IS RECORD
  27.    (
  28.       dgname     v$asm_diskgroup.name%TYPE,
  29.       pindex     v$asm_alias.parent_index%TYPE,
  30.       dirname    v$asm_alias.name%TYPE,
  31.       subdirs    typ_tab_dirlist,
  32.       numfiles   NUMBER,
  33.       bytes      v$asm_file.bytes%TYPE,
  34.       DEPTH      NUMBER,
  35.       PATH       VARCHAR2 (500)
  36.    );
  37.  
  38.    TYPE typ_tbl_dir IS TABLE OF typ_rec_dir
  39.                           INDEX BY BINARY_INTEGER;
  40.  
  41.    tbl_dir        typ_tbl_dir;
  42.  
  43.    TYPE typ_rec_results IS RECORD
  44.    (
  45.       numfiles   NUMBER,
  46.       bytes      v$asm_file.bytes%TYPE
  47.    );
  48.  
  49.    g_rootrindex   NUMBER := 0;
  50.  
  51.    SUBTYPE qsortval IS v$asm_alias.name%TYPE;
  52.  
  53.    SUBTYPE qsortarr IS typ_tab_dirlist;
  54.  
  55.    SUBTYPE qsortidx IS v$asm_alias.reference_index%TYPE;
  56.  
  57.    PROCEDURE printdir (rec_dir IN typ_rec_dir)
  58.    IS
  59.    BEGIN
  60.       dbms_output.put_line (
  61.          RPAD ('dgname:', 15) || LPAD (rec_dir.dgname, 30));
  62.       dbms_output.put_line (
  63.          RPAD ('pindex:', 15) || LPAD (rec_dir.pindex, 30));
  64.       dbms_output.put_line (
  65.          RPAD ('dirname:', 15) || LPAD (rec_dir.dirname, 30));
  66.       dbms_output.put_line (
  67.          RPAD ('subdirs:', 15) || LPAD (rec_dir.subdirs.COUNT, 30));
  68.       dbms_output.put_line (
  69.          RPAD ('numfiles:', 15) || LPAD (rec_dir.numfiles, 30));
  70.       dbms_output.put_line (RPAD ('bytes:', 15) || LPAD (rec_dir.bytes, 30));
  71.       dbms_output.put_line (RPAD ('depth:', 15) || LPAD (rec_dir.DEPTH, 30));
  72.    END printdir;
  73.  
  74.    PROCEDURE root
  75.    IS
  76.       rec_dir   typ_rec_dir;
  77.    BEGIN
  78.       rec_dir.pindex := NULL;
  79.       rec_dir.numfiles := 0;
  80.       rec_dir.bytes := 0;
  81.       rec_dir.PATH := '+';
  82.  
  83.       tbl_dir (g_rootrindex) := rec_dir;
  84.    END root;
  85.  
  86.    PROCEDURE diskgroups
  87.    IS
  88.       CURSOR cur_dg
  89.       IS
  90.            SELECT dg.group_number dgnumber, dg.name dgname
  91.              FROM v$asm_diskgroup dg
  92.          ORDER BY dgname;
  93.  
  94.       rec_cur_dg   cur_dg%ROWTYPE;
  95.       i            BINARY_INTEGER := 1;
  96.    BEGIN
  97.       OPEN cur_dg;
  98.  
  99.       LOOP
  100.          FETCH cur_dg INTO rec_cur_dg;
  101.  
  102.          EXIT WHEN cur_dg%notfound;
  103.  
  104.          DECLARE
  105.             rec_dir   typ_rec_dir;
  106.          BEGIN
  107.             rec_dir.dgname := rec_cur_dg.dgname;
  108.             rec_dir.pindex := g_rootrindex;
  109.             rec_dir.dirname := rec_cur_dg.dgname;
  110.             rec_dir.numfiles := 0;
  111.             rec_dir.bytes := 0;
  112.             rec_dir.DEPTH := 1;
  113.  
  114.             tbl_dir (rec_cur_dg.dgnumber * 16777216) := rec_dir;
  115.          END;
  116.  
  117.          tab_dglist (i).dgdir := rec_cur_dg.dgnumber * 16777216;
  118.          i := i + 1;
  119.       END LOOP;
  120.  
  121.       CLOSE cur_dg;
  122.    END diskgroups;
  123.  
  124.    PROCEDURE asmvols
  125.    IS
  126.       CURSOR cur_vol
  127.       IS
  128.            SELECT dg.name dgname,
  129.                   f.group_number dgnumber,
  130.                   f.TYPE file_type,
  131.                   SUM (f.bytes) bytes,
  132.                   COUNT (*) numfiles
  133.              FROM    v$asm_file f
  134.                   join
  135.                      v$asm_diskgroup dg
  136.                   ON f.group_number = dg.group_number
  137.             WHERE (f.group_number, f.file_number, f.incarnation) NOT IN
  138.                      (SELECT a.group_number, a.file_number, a.file_incarnation
  139.                         FROM v$asm_alias a)
  140.          GROUP BY dg.name, f.group_number, f.TYPE;
  141.  
  142.       rec_cur_vol     cur_vol%ROWTYPE;
  143.       rec_dir         typ_rec_dir;
  144.  
  145.       l_dummyrindex   NUMBER := -1;
  146.    BEGIN
  147.       OPEN cur_vol;
  148.  
  149.       LOOP
  150.          FETCH cur_vol INTO rec_cur_vol;
  151.  
  152.          EXIT WHEN cur_vol%notfound;
  153.          rec_dir.dgname := rec_cur_vol.dgname;
  154.          rec_dir.pindex := rec_cur_vol.dgnumber * 16777216;
  155.          rec_dir.dirname := rec_cur_vol.file_type;
  156.          rec_dir.numfiles := rec_cur_vol.numfiles;
  157.          rec_dir.bytes := rec_cur_vol.bytes;
  158.  
  159.          tbl_dir (l_dummyrindex) := rec_dir;
  160.          l_dummyrindex := l_dummyrindex - 1;
  161.       END LOOP;
  162.  
  163.       CLOSE cur_vol;
  164.    END asmvols;
  165.  
  166.    PROCEDURE directories
  167.    IS
  168.       CURSOR cur_dir
  169.       IS
  170.            SELECT dg.name dgname,
  171.                   a.reference_index rindex,
  172.                   a.parent_index pindex,
  173.                   a.name dirname
  174.              FROM    v$asm_alias a
  175.                   join
  176.                      v$asm_diskgroup dg
  177.                   ON a.group_number = dg.group_number
  178.             WHERE a.alias_directory = 'Y'
  179.          ORDER BY dgname, dirname;
  180.  
  181.       rec_cur_dir   cur_dir%ROWTYPE;
  182.       rec_dir       typ_rec_dir;
  183.    BEGIN
  184.       OPEN cur_dir;
  185.  
  186.       LOOP
  187.          FETCH cur_dir INTO rec_cur_dir;
  188.  
  189.          EXIT WHEN cur_dir%notfound;
  190.          rec_dir.dgname := rec_cur_dir.dgname;
  191.          rec_dir.pindex := rec_cur_dir.pindex;
  192.          rec_dir.dirname := rec_cur_dir.dirname;
  193.          rec_dir.numfiles := 0;
  194.          rec_dir.bytes := 0;
  195.  
  196.          tbl_dir (rec_cur_dir.rindex) := rec_dir;
  197.       END LOOP;
  198.  
  199.       CLOSE cur_dir;
  200.    END directories;
  201.  
  202.    PROCEDURE populatedirs
  203.    IS
  204.       l_diridx      v$asm_alias.reference_index%TYPE;
  205.       l_parentidx   v$asm_alias.parent_index%TYPE;
  206.       i             BINARY_INTEGER;
  207.    BEGIN
  208.       l_diridx := tbl_dir.FIRST;
  209.  
  210.       WHILE l_diridx IS NOT NULL
  211.       LOOP
  212.          l_parentidx := tbl_dir (l_diridx).pindex;
  213.  
  214.          IF tbl_dir.EXISTS (l_parentidx)
  215.          THEN
  216.             IF tbl_dir (l_parentidx).subdirs.FIRST IS NULL
  217.             THEN
  218.                i := 1;
  219.             ELSE
  220.                i := tbl_dir (l_parentidx).subdirs.LAST + 1;
  221.             END IF;
  222.  
  223.             tbl_dir (l_parentidx).subdirs (i).subdiridx := l_diridx;
  224.          END IF;
  225.  
  226.          l_diridx := tbl_dir.next (l_diridx);
  227.       END LOOP;
  228.    END populatedirs;
  229.  
  230.    PROCEDURE files
  231.    IS
  232.       CURSOR cur_file
  233.       IS
  234.          SELECT a.group_number,
  235.                 a.parent_index pindex,
  236.                 f.bytes bytes,
  237.                 a.name filename
  238.            FROM    v$asm_file f
  239.                 join
  240.                    v$asm_alias a
  241.                 ON     f.group_number = a.group_number
  242.                    AND f.file_number = a.file_number
  243.                    AND f.incarnation = a.file_incarnation
  244.                    AND a.system_created = 'Y';
  245.  
  246.       rec_cur_file   cur_file%ROWTYPE;
  247.    BEGIN
  248.       OPEN cur_file;
  249.  
  250.       LOOP
  251.          FETCH cur_file INTO rec_cur_file;
  252.  
  253.          EXIT WHEN cur_file%notfound;
  254.  
  255.          IF tbl_dir.EXISTS (rec_cur_file.pindex)
  256.          THEN
  257.             tbl_dir (rec_cur_file.pindex).numfiles :=
  258.                tbl_dir (rec_cur_file.pindex).numfiles + 1;
  259.             tbl_dir (rec_cur_file.pindex).bytes :=
  260.                tbl_dir (rec_cur_file.pindex).bytes + rec_cur_file.bytes;
  261.          ELSE                                                         -- debug
  262.             dbms_output.put_line (
  263.                   'not exists: '
  264.                || rec_cur_file.pindex
  265.                || ' name:'
  266.                || rec_cur_file.filename);
  267.          END IF;
  268.       END LOOP;
  269.  
  270.       CLOSE cur_file;
  271.    END files;
  272.  
  273.    PROCEDURE printresults (rec_dir       IN typ_rec_dir,
  274.                            rec_results   IN typ_rec_results)
  275.    IS
  276.    BEGIN
  277.       dbms_output.put_line (
  278.             LPAD (rec_results.numfiles, 6)
  279.          || ' '
  280.          || LPAD (ROUND (rec_results.bytes / 1024 / 1024), 9)
  281.          || ' '
  282.          || LPAD (' ', 2 * rec_dir.DEPTH, ' ')
  283.          || rec_dir.PATH);
  284.    END printresults;
  285.  
  286.    FUNCTION arrval (arr IN OUT qsortarr, p_idx IN BINARY_INTEGER)
  287.       RETURN qsortval
  288.    IS
  289.    BEGIN
  290.       RETURN tbl_dir (arr (p_idx).subdiridx).dirname;
  291.    END arrval;
  292.  
  293.    PROCEDURE swap (arr   IN OUT qsortarr,
  294.                    l     IN     BINARY_INTEGER,
  295.                    r     IN     BINARY_INTEGER)
  296.    IS
  297.       l_idxtmp   qsortidx;
  298.    BEGIN
  299.       l_idxtmp := arr (l).subdiridx;
  300.       arr (l).subdiridx := arr (r).subdiridx;
  301.       arr (r).subdiridx := l_idxtmp;
  302.    END swap;
  303.  
  304.    PROCEDURE qsort (arr         IN OUT qsortarr,
  305.                     p_lowidx    IN     BINARY_INTEGER,
  306.                     p_highidx   IN     BINARY_INTEGER)
  307.    IS
  308.       l         BINARY_INTEGER := p_lowidx;
  309.       r         BINARY_INTEGER := p_highidx;
  310.       l_pivot   qsortval;
  311.    BEGIN
  312.       l_pivot := arrval (arr, (p_lowidx + p_highidx) / 2);
  313.  
  314.       LOOP
  315.          WHILE arrval (arr, l) < l_pivot
  316.          LOOP
  317.             l := l + 1;
  318.          END LOOP;
  319.  
  320.          WHILE arrval (arr, r) > l_pivot
  321.          LOOP
  322.             r := r - 1;
  323.          END LOOP;
  324.  
  325.          IF l <= r
  326.          THEN
  327.             swap (arr, l, r);
  328.             l := l + 1;
  329.             r := r - 1;
  330.          END IF;
  331.  
  332.          EXIT WHEN l > r;
  333.       END LOOP;
  334.  
  335.       IF p_lowidx < r
  336.       THEN
  337.          qsort (arr, p_lowidx, r);
  338.       END IF;
  339.  
  340.       IF l < p_highidx
  341.       THEN
  342.          qsort (arr, l, p_highidx);
  343.       END IF;
  344.    END qsort;
  345.  
  346.    FUNCTION descend (rec_dir IN OUT typ_rec_dir)
  347.       RETURN typ_rec_results
  348.    IS
  349.       rec_results   typ_rec_results;
  350.    BEGIN
  351.       rec_results.numfiles := rec_dir.numfiles;
  352.       rec_results.bytes := rec_dir.bytes;
  353.  
  354.       IF rec_dir.subdirs.FIRST IS NOT NULL
  355.       THEN
  356.          qsort (rec_dir.subdirs, rec_dir.subdirs.FIRST, rec_dir.subdirs.LAST);
  357.  
  358.          FOR i IN rec_dir.subdirs.FIRST .. rec_dir.subdirs.LAST
  359.          LOOP
  360.             DECLARE
  361.                rec_subresults   typ_rec_results;
  362.                l_subdiridx      v$asm_alias.reference_index%TYPE;
  363.             BEGIN
  364.                l_subdiridx := rec_dir.subdirs (i).subdiridx;
  365.  
  366.                IF rec_dir.PATH = '+'
  367.                THEN
  368.                   tbl_dir (l_subdiridx).PATH :=
  369.                      rec_dir.PATH || tbl_dir (l_subdiridx).dirname;
  370.                ELSE
  371.                   tbl_dir (l_subdiridx).PATH :=
  372.                      rec_dir.PATH || '/' || tbl_dir (l_subdiridx).dirname;
  373.                END IF;
  374.  
  375.                tbl_dir (l_subdiridx).DEPTH := rec_dir.DEPTH + 1;
  376.                rec_subresults := descend (tbl_dir (l_subdiridx));
  377.                rec_results.numfiles :=
  378.                   rec_results.numfiles + rec_subresults.numfiles;
  379.                rec_results.bytes := rec_results.bytes + rec_subresults.bytes;
  380.             END;
  381.          END LOOP;
  382.       END IF;
  383.  
  384.       printresults (rec_dir, rec_results);
  385.       RETURN rec_results;
  386.    END descend;
  387.  
  388.    PROCEDURE traverse
  389.    IS
  390.       rec_subresults   typ_rec_results;
  391.    BEGIN
  392.       rec_subresults := descend (tbl_dir (g_rootrindex));
  393.    END traverse;
  394. BEGIN
  395.    root;
  396.    diskgroups;
  397.    asmvols;
  398.    directories;
  399.    populatedirs;
  400.    files;
  401.    traverse;
  402. END;
  403. /
  404.  
  405. quit
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement