1
package DBD::MySQL::Server::Instance::Innodb;
5
our @ISA = qw(DBD::MySQL::Server::Instance);
7
my %ERRORS=( OK => 0, WARNING => 1, CRITICAL => 2, UNKNOWN => 3 );
8
my %ERRORCODES=( 0 => 'OK', 1 => 'WARNING', 2 => 'CRITICAL', 3 => 'UNKNOWN' );
14
handle => $params{handle},
16
warningrange => $params{warningrange},
17
criticalrange => $params{criticalrange},
28
if ($params{mode} =~ /server::instance::innodb/) {
30
DBD::MySQL::Server::Instance::Innodb::Internals->new(%params);
37
if ($params{mode} =~ /server::instance::innodb/) {
38
$self->{internals}->nagios(%params);
39
$self->merge_nagios($self->{internals});
44
package DBD::MySQL::Server::Instance::Innodb::Internals;
48
our @ISA = qw(DBD::MySQL::Server::Instance::Innodb);
50
our $internals; # singleton, nur ein einziges mal instantiierbar
57
handle => $params{handle},
58
bufferpool_hitrate => undef,
62
warningrange => $params{warningrange},
63
criticalrange => $params{criticalrange},
65
bless($internals, $class);
66
$internals->init(%params);
75
$self->debug("enter init");
77
($dummy, $self->{have_innodb})
78
= $self->{handle}->fetchrow_array(q{
79
SHOW VARIABLES LIKE 'have_innodb'
81
if ($self->{have_innodb} eq "NO") {
82
$self->add_nagios_critical("the innodb engine has a problem (have_innodb=no)");
83
} elsif ($self->{have_innodb} eq "DISABLED") {
85
} elsif ($params{mode} =~ /server::instance::innodb::bufferpool::hitrate/) {
86
($dummy, $self->{bufferpool_reads})
87
= $self->{handle}->fetchrow_array(q{
88
SHOW /*!50000 global */ STATUS LIKE 'Innodb_buffer_pool_reads'
90
($dummy, $self->{bufferpool_read_requests})
91
= $self->{handle}->fetchrow_array(q{
92
SHOW /*!50000 global */ STATUS LIKE 'Innodb_buffer_pool_read_requests'
94
if (! defined $self->{bufferpool_reads}) {
95
$self->add_nagios_critical("no innodb buffer pool info available");
97
$self->valdiff(\%params, qw(bufferpool_reads
98
bufferpool_read_requests));
99
$self->{bufferpool_hitrate_now} =
100
$self->{delta_bufferpool_read_requests} > 0 ?
101
100 - (100 * $self->{delta_bufferpool_reads} /
102
$self->{delta_bufferpool_read_requests}) : 100;
103
$self->{bufferpool_hitrate} =
104
$self->{bufferpool_read_requests} > 0 ?
105
100 - (100 * $self->{bufferpool_reads} /
106
$self->{bufferpool_read_requests}) : 100;
108
} elsif ($params{mode} =~ /server::instance::innodb::bufferpool::waitfree/) {
109
($dummy, $self->{bufferpool_wait_free})
110
= $self->{handle}->fetchrow_array(q{
111
SHOW /*!50000 global */ STATUS LIKE 'Innodb_buffer_pool_wait_free'
113
if (! defined $self->{bufferpool_wait_free}) {
114
$self->add_nagios_critical("no innodb buffer pool info available");
116
$self->valdiff(\%params, qw(bufferpool_wait_free));
117
$self->{bufferpool_wait_free_rate} =
118
$self->{delta_bufferpool_wait_free} / $self->{delta_timestamp};
120
} elsif ($params{mode} =~ /server::instance::innodb::logwaits/) {
121
($dummy, $self->{log_waits})
122
= $self->{handle}->fetchrow_array(q{
123
SHOW /*!50000 global */ STATUS LIKE 'Innodb_log_waits'
125
if (! defined $self->{log_waits}) {
126
$self->add_nagios_critical("no innodb log info available");
128
$self->valdiff(\%params, qw(log_waits));
129
$self->{log_waits_rate} =
130
$self->{delta_log_waits} / $self->{delta_timestamp};
132
} elsif ($params{mode} =~ /server::instance::innodb::needoptimize/) {
133
#fragmentation=$(($datafree * 100 / $datalength))
135
#http://www.electrictoolbox.com/optimize-tables-mysql-php/
136
my @result = $self->{handle}->fetchall_array(q{
137
SHOW TABLE STATUS WHERE Data_free / Data_length > 0.1 AND Data_free > 102400
139
printf "%s\n", Data::Dumper::Dumper(\@result);
147
my $now = $params{lookback} ? '_now' : '';
148
if ($self->{have_innodb} eq "DISABLED") {
149
$self->add_nagios_ok("the innodb engine has been disabled");
150
} elsif (! $self->{nagios_level}) {
151
if ($params{mode} =~ /server::instance::innodb::bufferpool::hitrate/) {
152
my $refkey = 'bufferpool_hitrate'.($params{lookback} ? '_now' : '');
154
$self->check_thresholds($self->{$refkey}, "99:", "95:"),
155
sprintf "innodb buffer pool hitrate at %.2f%%", $self->{$refkey});
156
$self->add_perfdata(sprintf "bufferpool_hitrate=%.2f%%;%s;%s;0;100",
157
$self->{bufferpool_hitrate},
158
$self->{warningrange}, $self->{criticalrange});
159
$self->add_perfdata(sprintf "bufferpool_hitrate_now=%.2f%%",
160
$self->{bufferpool_hitrate_now});
161
} elsif ($params{mode} =~ /server::instance::innodb::bufferpool::waitfree/) {
163
$self->check_thresholds($self->{bufferpool_wait_free_rate}, "1", "10"),
164
sprintf "%ld innodb buffer pool waits in %ld seconds (%.4f/sec)",
165
$self->{delta_bufferpool_wait_free}, $self->{delta_timestamp},
166
$self->{bufferpool_wait_free_rate});
167
$self->add_perfdata(sprintf "bufferpool_free_waits_rate=%.4f;%s;%s;0;100",
168
$self->{bufferpool_wait_free_rate},
169
$self->{warningrange}, $self->{criticalrange});
170
} elsif ($params{mode} =~ /server::instance::innodb::logwaits/) {
172
$self->check_thresholds($self->{log_waits_rate}, "1", "10"),
173
sprintf "%ld innodb log waits in %ld seconds (%.4f/sec)",
174
$self->{delta_log_waits}, $self->{delta_timestamp},
175
$self->{log_waits_rate});
176
$self->add_perfdata(sprintf "innodb_log_waits_rate=%.4f;%s;%s;0;100",
177
$self->{log_waits_rate},
178
$self->{warningrange}, $self->{criticalrange});