The Mother of all ASM scripts
I gave that post the low-key title of The ASM script of all ASM scripts. Now that script has been improved I have to go a bit further with the hyperbole and we have the The Mother of all ASM scripts. If it ever gets improved then the next post will just be called ‘Who’s the Daddy’.
I have been using the current script across all our systems for the last 3 years and I find it very useful, a colleague, Allan Webster, has added a couple of improvements and it is now better than before.
The improvements show current disk I/O statistics and a breakdown of the types of files in each disk group and the total sizes of that filetype. The I/O statistics are useful when you have a lot of databases, many of which are test and development and so you do not look at them as that often. It just gives a quick overview that allows you to get a feel if anything is wrong and to see what the system is actually doing. There are also a few comments at the beginning defining the various ASM views available.
REM ASM views:REM VIEW |ASM INSTANCE |DB INSTANCEREM ----------------------------------------------------------------------------------------------------------REM V$ASM_DISKGROUP |Describes a disk group (number, name, size |Contains one row for every open ASMREM |related info, state, and redundancy type) |disk in the DB instance.REM V$ASM_CLIENT |Identifies databases using disk groups |Contains no rows.REM |managed by the ASM instance. |REM V$ASM_DISK |Contains one row for every disk discovered |Contains rows only for disks in theREM |by the ASM instance, including disks that |disk groups in use by that DB instance.REM |are not part of any disk group. |REM V$ASM_FILE |Contains one row for every ASM file in every |Contains rows only for files that areREM |disk group mounted by the ASM instance. |currently open in the DB instance.REM V$ASM_TEMPLATE |Contains one row for every template present in |Contains no rows.REM |every disk group mounted by the ASM instance. |REM V$ASM_ALIAS |Contains one row for every alias present in |Contains no rows.REM |every disk group mounted by the ASM instance. |REM v$ASM_OPERATION |Contains one row for every active ASM long |Contains no rows.REM |running operation executing in the ASM instance. |set wrap offset lines 155 pages 9999col "Group Name" for a6 Head "Group|Name"col "Disk Name" for a10col "State" for a10col "Type" for a10 Head "Diskgroup|Redundancy"col "Total GB" for 9,990 Head "Total|GB"col "Free GB" for 9,990 Head "Free|GB"col "Imbalance" for 99.9 Head "Percent|Imbalance"col "Variance" for 99.9 Head "Percent|Disk Size|Variance"col "MinFree" for 99.9 Head "Minimum|Percent|Free"col "MaxFree" for 99.9 Head "Maximum|Percent|Free"col "DiskCnt" for 9999 Head "Disk|Count"promptprompt ASM Disk Groupsprompt ===============SELECT g.group_number "Group", g.name "Group Name", g.state "State", g.type "Type", g.total_mb/1024 "Total GB", g.free_mb/1024 "Free GB", 100*(max((d.total_mb-d.free_mb)/d.total_mb)-min((d.total_mb-d.free_mb)/d.total_mb))/max((d.total_mb-d.free_mb)/d.total_mb) "Imbalance", 100*(max(d.total_mb)-min(d.total_mb))/max(d.total_mb) "Variance", 100*(min(d.free_mb/d.total_mb)) "MinFree", 100*(max(d.free_mb/d.total_mb)) "MaxFree", count(*) "DiskCnt"FROM v$asm_disk d, v$asm_diskgroup gWHERE d.group_number = g.group_number andd.group_number <> 0 andd.state = 'NORMAL' andd.mount_status = 'CACHED'GROUP BY g.group_number, g.name, g.state, g.type, g.total_mb, g.free_mbORDER BY 1;prompt ASM Disks In Useprompt ================col "Group" for 999col "Disk" for 999col "Header" for a9col "Mode" for a8col "State" for a8col "Created" for a10 Head "Added To|Diskgroup"--col "Redundancy" for a10--col "Failure Group" for a10 Head "Failure|Group"col "Path" for a19--col "ReadTime" for 999999990 Head "Read Time|seconds"--col "WriteTime" for 999999990 Head "Write Time|seconds"--col "BytesRead" for 999990.00 Head "GigaBytes|Read"--col "BytesWrite" for 999990.00 Head "GigaBytes|Written"col "SecsPerRead" for 9.000 Head "Seconds|PerRead"col "SecsPerWrite" for 9.000 Head "Seconds|PerWrite"select group_number "Group", disk_number "Disk", header_status "Header", mode_status "Mode", state "State", create_date "Created"--, redundancy "Redundancy", total_mb/1024 "Total GB", free_mb/1024 "Free GB", name "Disk Name"--, failgroup "Failure Group", path "Path"--, read_time "ReadTime"--, write_time "WriteTime"--, bytes_read/1073741824 "BytesRead"--, bytes_written/1073741824 "BytesWrite", read_time/reads "SecsPerRead", write_time/writes "SecsPerWrite"from v$asm_disk_statwhere header_status not in ('FORMER','CANDIDATE')order by group_number, disk_number/Prompt File Types in DiskgroupsPrompt ========================col "File Type" for a16col "Block Size" for a5 Head "Block|Size"col "Gb" for 9990.00col "Files" for 99990break on "Group Name" skip 1 nodupselect g.name "Group Name", f.TYPE "File Type", f.BLOCK_SIZE/1024||'k' "Block Size", f.STRIPED, count(*) "Files", round(sum(f.BYTES)/(1024*1024*1024),2) "Gb"from v$asm_file f,v$asm_diskgroup gwhere f.group_number=g.group_numbergroup by g.name,f.TYPE,f.BLOCK_SIZE,f.STRIPEDorder by 1,2;clear breakprompt Instances currently accessing these diskgroupsprompt ==============================================col "Instance" form a8select c.group_number "Group", g.name "Group Name", c.instance_name "Instance"from v$asm_client c, v$asm_diskgroup gwhere g.group_number=c.group_number/prompt Free ASM disks and their pathsprompt ==============================col "Disk Size" form a9select header_status "Header", mode_status "Mode", path "Path", lpad(round(os_mb/1024),7)||'Gb' "Disk Size"from v$asm_diskwhere header_status in ('FORMER','CANDIDATE')order by path/prompt Current ASM disk operationsprompt ===========================select *from v$asm_operation/ |
This is how some of the changes look
Added To Total Free Seconds SecondsGroup Disk Header Mode State Diskgroup GB GB Disk Name Path PerRead PerWrite----- ---- --------- -------- -------- ---------- ------ ------ ---------- ------------------- ------- --------1 0 MEMBER ONLINE NORMAL 20-FEB-09 89 88 FRA_0000 /dev/oracle/disk388 .004 .0021 1 MEMBER ONLINE NORMAL 31-MAY-10 89 88 FRA_0001 /dev/oracle/disk260 .002 .0021 2 MEMBER ONLINE NORMAL 31-MAY-10 89 88 FRA_0002 /dev/oracle/disk260 .007 .0022 15 MEMBER ONLINE NORMAL 04-MAR-10 89 29 DATA_0015 /dev/oracle/disk203 .012 .0232 16 MEMBER ONLINE NORMAL 04-MAR-10 89 29 DATA_0016 /dev/oracle/disk203 .012 .0212 17 MEMBER ONLINE NORMAL 04-MAR-10 89 29 DATA_0017 /dev/oracle/disk203 .007 .0262 27 MEMBER ONLINE NORMAL 31-MAY-10 89 29 DATA_0027 /dev/oracle/disk260 .011 .0232 28 MEMBER ONLINE NORMAL 31-MAY-10 89 29 DATA_0028 /dev/oracle/disk259 .009 .0202 38 MEMBER ONLINE NORMAL 31-MAY-10 89 29 DATA_0038 /dev/oracle/disk190 .012 .0252 39 MEMBER ONLINE NORMAL 31-MAY-10 89 29 DATA_0039 /dev/oracle/disk189 .014 .0152 40 MEMBER ONLINE NORMAL 31-MAY-10 89 30 DATA_0040 /dev/oracle/disk260 .011 .0242 41 MEMBER ONLINE NORMAL 31-MAY-10 89 30 DATA_0041 /dev/oracle/disk260 .009 .0222 42 MEMBER ONLINE NORMAL 31-MAY-10 89 29 DATA_0042 /dev/oracle/disk260 .011 .0182 43 MEMBER ONLINE NORMAL 31-MAY-10 89 29 DATA_0043 /dev/oracle/disk260 .003 .0262 44 MEMBER ONLINE NORMAL 31-MAY-10 89 29 DATA_0044 /dev/oracle/disk260 .008 .0192 45 MEMBER ONLINE NORMAL 31-MAY-10 89 30 DATA_0045 /dev/oracle/disk193 .008 .0182 46 MEMBER ONLINE NORMAL 31-MAY-10 89 30 DATA_0046 /dev/oracle/disk192 .007 .0242 47 MEMBER ONLINE NORMAL 31-MAY-10 89 30 DATA_0047 /dev/oracle/disk191 .005 .0222 48 MEMBER ONLINE NORMAL 31-MAY-10 89 29 DATA_0048 /dev/oracle/disk190 .008 .0212 49 MEMBER ONLINE NORMAL 31-MAY-10 89 29 DATA_0049 /dev/oracle/disk189 .008 .0262 50 MEMBER ONLINE NORMAL 31-MAY-10 89 29 DATA_0050 /dev/oracle/disk261 .009 .03056 rows selected.File Types in Diskgroups========================Group BlockName File Type Size STRIPE Files Gb------ ---------------- ----- ------ ------ --------DATA CONTROLFILE 16k FINE 1 0.01DATAFILE 16k COARSE 404 2532.58ONLINELOG 1k FINE 3 6.00PARAMETERFILE 1k COARSE 1 0.00TEMPFILE 16k COARSE 13 440.59FRA AUTOBACKUP 16k COARSE 2 0.02CONTROLFILE 16k FINE 1 0.01ONLINELOG 1k FINE 3 6.00 |
Comments
Post a Comment