diff options
-rw-r--r-- | contrib/check_oracle_tbs | 62 |
1 files changed, 37 insertions, 25 deletions
diff --git a/contrib/check_oracle_tbs b/contrib/check_oracle_tbs index bcc4af8..0efdd1e 100644 --- a/contrib/check_oracle_tbs +++ b/contrib/check_oracle_tbs | |||
@@ -1,9 +1,7 @@ | |||
1 | #!/usr/local/bin/perl -w | 1 | #!/usr/local/bin/perl -w |
2 | 2 | ||
3 | # (c)2003 John Koyle, RFP Depot, LLC. | 3 | # (c)2004 John Koyle, RFP Depot, LLC. |
4 | # This is free software use it however you would like. | 4 | # This is free software use it however you would like. |
5 | # Thanks to the folks at http://www.think-forward.com for the SQL query | ||
6 | |||
7 | 5 | ||
8 | use strict; | 6 | use strict; |
9 | use DBI; | 7 | use DBI; |
@@ -25,10 +23,10 @@ my $orapwd = ""; | |||
25 | 23 | ||
26 | 24 | ||
27 | if (!$ENV{ORACLE_HOME}) { | 25 | if (!$ENV{ORACLE_HOME}) { |
28 | $ENV{ORACLE_HOME} = '/a01/app/oracle/product/9.2.0.1'; | 26 | $ENV{ORACLE_HOME} = '/u01/app/oracle/product/9.2'; |
29 | } | 27 | } |
30 | 28 | ||
31 | #*****************You shouldn't need to modify anything below here ************* | 29 | #******************************************************************************* |
32 | my $state = $ERRORS{'UNKNOWN'}; | 30 | my $state = $ERRORS{'UNKNOWN'}; |
33 | my $answer = undef; | 31 | my $answer = undef; |
34 | 32 | ||
@@ -37,10 +35,12 @@ my $VERSION = sprintf("%d.%02d", $MAJOR_VERSION - 1, $MINOR_VERSION); | |||
37 | 35 | ||
38 | my $opt_debug; # -d|--debug | 36 | my $opt_debug; # -d|--debug |
39 | my $opt_help; # -h|--help | 37 | my $opt_help; # -h|--help |
40 | my $opt_version; # -V|--version | 38 | my $opt_version; # -V|--version |
41 | my $opt_warn_space; # -w|--warn-space | 39 | my $opt_warn_space; # -w|--warn-space |
42 | my $opt_crit_space; # -c|--crit-space | 40 | my $opt_crit_space; # -c|--crit-space |
43 | 41 | ||
42 | |||
43 | |||
44 | my $help = <<MARK; # help statement | 44 | my $help = <<MARK; # help statement |
45 | 45 | ||
46 | check_oracle_tbs v$VERSION | 46 | check_oracle_tbs v$VERSION |
@@ -60,6 +60,7 @@ MARK | |||
60 | 60 | ||
61 | Getopt::Long::config('no_auto_abbrev', 'no_ignore_case'); | 61 | Getopt::Long::config('no_auto_abbrev', 'no_ignore_case'); |
62 | 62 | ||
63 | |||
63 | my $rc = GetOptions( | 64 | my $rc = GetOptions( |
64 | "debug|d" => \$opt_debug, | 65 | "debug|d" => \$opt_debug, |
65 | "help|h" => \$opt_help, | 66 | "help|h" => \$opt_help, |
@@ -103,17 +104,18 @@ if (! defined $opt_crit_space) | |||
103 | 104 | ||
104 | my $array_ref = executeSQL(); | 105 | my $array_ref = executeSQL(); |
105 | 106 | ||
107 | # Don't match certain tablespaces. | ||
106 | foreach my $row (@$array_ref) { | 108 | foreach my $row (@$array_ref) { |
107 | my ( $tbs_name, $tot_mb, $free_mb, $free_pct, $used_pct, $fsfi) = @$row; | 109 | my ( $tbs_name, $free_mb, $tot_mb, $free_pct) = @$row; |
108 | if ($opt_debug) { print STDOUT "Output: $tbs_name\t$tot_mb\t$free_mb\t$free_pct\t$used_pct\t$fsfi\n\n"; } | 110 | if ($opt_debug) { print STDOUT "Output: $tbs_name\t$tot_mb\t$free_mb\t$free_pct\n\n"; } |
109 | if ($used_pct > (100 - $opt_crit_space) && $tbs_name !~ /RBS/) { | 111 | if ($free_pct < $opt_crit_space && $tbs_name !~ /RBS/ && $tbs_name !~ /PERFSTAT/ && $tbs_name !~ /UNDOTBS/) { |
110 | $state = $ERRORS{'CRITICAL'}; | 112 | $state = $ERRORS{'CRITICAL'}; |
111 | $answer .= "$tbs_name = $used_pct\% "; | 113 | $answer .= "Critical: $tbs_name = $free_pct\% "; |
112 | last; | 114 | last; |
113 | } | 115 | } |
114 | if ($used_pct > (100 - $opt_warn_space) && $tbs_name !~ /RBS/) { | 116 | if ($free_pct < $opt_warn_space && $tbs_name !~ /RBS/ && $tbs_name !~ /PERFSTAT/ && $tbs_name !~ /UNDOTBS/) { |
115 | $state = $ERRORS{'WARNING'}; | 117 | $state = $ERRORS{'WARNING'}; |
116 | $answer .= "$tbs_name = $used_pct\% "; | 118 | $answer .= "Warning: $tbs_name = $free_pct\% "; |
117 | } | 119 | } |
118 | } | 120 | } |
119 | 121 | ||
@@ -132,6 +134,7 @@ foreach my $key (keys %ERRORS) { | |||
132 | } | 134 | } |
133 | exit $state; | 135 | exit $state; |
134 | 136 | ||
137 | #------------------SUBS------------------------------------------------------- | ||
135 | sub executeSQL | 138 | sub executeSQL |
136 | { | 139 | { |
137 | my ($dbh, $sth, $results); | 140 | my ($dbh, $sth, $results); |
@@ -140,20 +143,29 @@ sub executeSQL | |||
140 | 143 | ||
141 | eval { | 144 | eval { |
142 | $dbh->{RaiseError} = 1; | 145 | $dbh->{RaiseError} = 1; |
143 | # This query is taken from this URL and used with permission: http://www.think-forward.com/sql/tspace.htm | ||
144 | $sth = $dbh->prepare(q{ | 146 | $sth = $dbh->prepare(q{ |
145 | select df.tablespace_name tspace, | 147 | select ts.tablespace_name, |
146 | df.bytes/(1024*1024) tot_ts_size, | 148 | trunc(sum(ts.free_b)/1024/1024) free, |
147 | sum(fs.bytes)/(1024*1024) free_ts_size, | 149 | trunc(sum(ts.max_b)/1024/1024) total, |
148 | round(sum(fs.bytes)*100/df.bytes) ts_pct, | 150 | trunc( sum(ts.free_b)/sum(ts.max_b)*1000) / 10 as pct_free |
149 | round((df.bytes-sum(fs.bytes))*100/df.bytes) ts_pct1, | 151 | from |
150 | ROUND(100*SQRT(MAX(fs.bytes)/SUM(fs.bytes))* | 152 | (select a.file_id, |
151 | (1/SQRT(SQRT(COUNT(fs.bytes)))) ,2) FSFI | 153 | a.tablespace_name, |
152 | from dba_free_space fs, (select tablespace_name, sum(bytes) bytes | 154 | decode(a.autoextensible,'YES',a.maxsize-a.bytes+b.free,'NO',b.free) free_b, |
153 | from dba_data_files | 155 | a.maxsize max_b |
154 | group by tablespace_name ) df | 156 | from (select file_id, |
155 | where fs.tablespace_name = df.tablespace_name | 157 | tablespace_name, |
156 | group by df.tablespace_name, df.bytes | 158 | autoextensible, |
159 | bytes, | ||
160 | decode(autoextensible,'YES',maxbytes,bytes) maxsize | ||
161 | from dba_data_files) a, | ||
162 | (select file_id, | ||
163 | tablespace_name, | ||
164 | sum(bytes) free | ||
165 | from dba_free_space | ||
166 | group by file_id, tablespace_name) b | ||
167 | where a.file_id=b.file_id(+)) ts | ||
168 | group by tablespace_name | ||
157 | }); | 169 | }); |
158 | 170 | ||
159 | $sth->execute(); | 171 | $sth->execute(); |