#!/bin/sh MYSQL="mysql --defaults-file=/etc/zabbix/my.cnf" MYSQLADMIN="mysqladmin --defaults-file=/etc/zabbix/my.cnf" MODE="$1" case "$MODE" in version) $MYSQL -V ;; ping) $MYSQLADMIN ping |\ fgrep -c alive ;; global_status) $MYSQL -BNe "SHOW GLOBAL STATUS WHERE variable_name='"$2"'" |\ awk ' { gsub("ON", "1", $2); gsub("OFF", "0", $2); gsub("Non-Primary", "2", $2); gsub("Primary", "1", $2); gsub("Disconnected", "0", $2); print $2; }' ;; global_variables) $MYSQL -BNe "SHOW GLOBAL VARIABLES WHERE variable_name='"$2"'" |\ awk ' { gsub("one-thread-per-connection", "0", $2); gsub("pool-of-threads", "1", $2); gsub("no-threads", "2", $2); print $2; }' ;; extended_status) $MYSQLADMIN extended-status |\ awk -F"|" -v NAME=$2 ' { gsub(" ", "", $2); if ($2 == NAME) { gsub(" ", "", $3); print $3; } }' ;; innodb_metrics) $MYSQL -BNe "SELECT $3 FROM information_schema.innodb_metrics WHERE name = '"$2"'" ;; trx_rseg_history_len) $MYSQL -BNe 'SHOW ENGINE INNODB STATUS\G' |\ awk '/^History list length/ { print $4; }' ;; trx_duration_max) $MYSQL -BNe ' SELECT IFNULL(MAX(UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(trx_started)), 0) FROM information_schema.innodb_trx;' ;; used_log_lsn) $MYSQL -BNe 'SHOW ENGINE INNODB STATUS\G' |\ awk ' /^Log sequence number/ { log_lsn_current = $4; } /^Last checkpoint at/ { log_lsn_last_checkpoint = $4; } END { print log_lsn_current - log_lsn_last_checkpoint; }' ;; max_checkpoint_age) $MYSQL -BNe 'SHOW ENGINE INNODB STATUS\G' |\ awk '/^Max checkpoint age/ { print $4; }' ;; slave_workers_idle) $MYSQL -BNe " SELECT COUNT(*) FROM information_schema.processlist WHERE user = 'system user' AND state = 'Waiting for an event from Coordinator'" ;; channels_discover) $MYSQL -e "SHOW SLAVE STATUS\G" |\ awk ' BEGIN { printf "{\"data\":["; n = 0; } /Channel_Name:/ { if (n == 1) { printf ","; } gsub("Channel_Name:", "", $0); gsub(/^ *| *$/, "", $0); printf "{\"{#REPLICATION_CHANNEL}\":\"%s\"}", $0; n = 1; } END { printf "]}"; }' ;; channel_status) $MYSQL -e "SHOW SLAVE STATUS\G" |\ awk -F":" -v CHANNEL="$2" -v NAME="$3" ' BEGIN { v = ""; n = ""; } /Channel_Name:/ { gsub("Channel_Name:", "", $0); gsub(/^ *| *$/, "", $0); n = $0; } { if (index($0, " " NAME ":")) { gsub(NAME ":", "", $0); gsub(/^ *| *$/, "", $0); gsub("Connecting", "2", $0); gsub("Yes", "1", $0); gsub("No", "0", $0); v = $0; } } /^\*+ [^1]/ { if (n == CHANNEL) { print v; } } END { if (n == CHANNEL) { print v; } }' ;; wsrep_hang_count) $MYSQL -BNe "SELECT COUNT(*) FROM information_schema.processlist WHERE time > 10 AND state LIKE 'wsrep: initiating replication for write set (-1)'" ;; health) for i in 1 2 3 ; do timeout 9 $MYSQL -BNe "SELECT 1 LIMIT 0" if [ "$?" -eq "0" ]; then echo "0" exit fi done echo "1" ;; esac