File: //proc/self/root/lib64/nagios/plugins/check_mysql_all.sh
#!/bin/bash
# Ref - 8698jxvww - Consolidated MySQL checks
#
SQL_PID=$(sudo pgrep mysqld)
MARIADB_PID=$(sudo pgrep mariadb)
if [[ -n "${SQL_PID}" ]]; then
PID=${SQL_PID}
SQL=MySQL
sql_admin_bin="/usr/bin/mysqladmin"
if [[ -e "/opt/mysql-8.0/bin/mysql" ]]; then
sql_client="/opt/mysql-8.0/bin/mysql"
else
sql_client="/usr/bin/mysql"
fi
VER=$(${sql_client} --version 2>/dev/null| awk '{print $3}' | cut -d ',' -f1)
elif [[ -n "${MARIADB_PID}" ]]; then
PID=${MARIADB_PID}
SQL=MariaDB
if [[ -e "/usr/bin/mysqladmin" ]]; then
sql_admin_bin="/usr/bin/mysqladmin"
else
sql_admin_bin="/usr/bin/mariadb-admin"
fi
if [[ -e "/usr/bin/mysql" ]]; then
sql_client="/usr/bin/mysql"
VER=$(${sql_client} --version 2>/dev/null| grep -oP '[0-9]+\.[0-9]+\.[0-9]+(?=-MariaDB)')
else
sql_client="/usr/bin/mariadb"
VER=$(${sql_client} --version 2>/dev/null| grep -oP '[0-9]+\.[0-9]+\.[0-9]+(?=-MariaDB)')
fi
else
echo "MySQL Status: [[ CRITICAL ]] - No SQL process found"
exit 2
fi
mysql_status_check_func() {
mysql_status_check=$(${sql_admin_bin} status 2>/dev/null)
if echo "${mysql_status_check}" | grep -qi uptime; then
echo "${mysql_status_check}"
else
echo "${SQL} Check - [[ CRITICAL ]] - ${mysql_status_check}"
fi
}
mariadb_provider=$(${sql_client} -V 2>/dev/null | grep MariaDB)
if [[ -n "${mariadb_provider}" ]]; then
inf_table="information_schema.GLOBAL_STATUS"
else
inf_table="performance_schema.global_status"
fi
mysql_status_connections_func() {
mysql_conn_data=$(${sql_client} -Nse "
SELECT
CONCAT(
'Query/Execute processes: ',
(SELECT COUNT(*) FROM information_schema.processlist WHERE COMMAND NOT IN ('Sleep', 'Binlog Dump')),
'; ',
'Open_table_definitions / @@table_definition_cache: ',
(SELECT VARIABLE_VALUE FROM ${inf_table} WHERE VARIABLE_NAME = 'Open_table_definitions'),
'/',
@@table_definition_cache,
'; ',
'queries with cache lock: ',
(SELECT VARIABLE_VALUE FROM ${inf_table} WHERE VARIABLE_NAME = 'Table_locks_waited')
) AS status_summary;
" 2>/dev/null)
max_qe_processes=$(${sql_client} -Nse "SELECT COUNT(*) FROM information_schema.processlist WHERE COMMAND NOT IN ('Sleep', 'Binlog Dump');" 2>/dev/null)
if [[ -n "${max_qe_processes}" ]]; then
if [[ "${max_qe_processes}" -lt 50 ]]; then
echo "${SQL} Connections: OK - ${mysql_conn_data}"
else
echo "${SQL} Connections: [[ CRITICAL ]] - ${mysql_conn_data}"
fi
else
echo "${SQL} Connections: [[ CRITICAL ]] - unable to read the database for Connections"
fi
}
mysql_status_connect_time_func() {
mysql_select_test=$(${sql_client} -e "SELECT 100000;" 2>/dev/null)
if [[ -n "${mysql_select_test}" ]]; then
if echo "${mysql_select_test}" | grep -q 100000; then
mysql_conn_time_raw=$( { time ${sql_client} -e "SELECT 1;" >/dev/null 2>&1; } 2>&1 | grep real | awk '{print $2}' | sed 's/^0m//;s/s$//')
mysql_conn_time=$(printf "%.0f" "${mysql_conn_time_raw}")
if [[ "${mysql_conn_time}" -gt 5 ]]; then
echo "${SQL} Connection time: [[ CRITICAL ]] - ${mysql_conn_time_raw} second(s)"
else
echo "${SQL} Connection time: OK - ${mysql_conn_time_raw} seconds"
fi
else
echo "${SQL} Connection time: [[ CRITICAL ]] - failed to run a SELECT query"
fi
else
echo "${SQL} Connection time: [[ CRITICAL ]] - unable run SELECT query"
fi
}
mysql_status_memory_func() {
mysql_mem=$(sudo grep VmRSS /proc/${PID}/status | awk '{print $2}');
mysql_mem_in_gb=$(sudo grep VmRSS /proc/${PID}/status | awk '{print int($2/1024/1024)}');
total_mem=$(sudo grep MemTotal /proc/meminfo | awk '{print $2}')
total_mem_in_gb=$(sudo grep MemTotal /proc/meminfo | awk '{print int($2/1024/1024)}')
mysql_mem_usage_p=$(( (${mysql_mem} * 100) / ${total_mem} ))
if [ "${total_mem_in_gb}" -ge 35 ]; then
ninety_p_in_gb=$((${total_mem_in_gb}*90/100))
if [[ "${mysql_mem_in_gb}" -ge "${ninety_p_in_gb}" ]];then
echo "${SQL} Memory Usage: [[ CRITICAL ]] - ${usagep}% of total RAM, usage ${mysql_mem_in_gb}GB of ${total_mem_in_gb}GB"
else
echo "${SQL} Memory Usage: OK - ${mysql_mem_in_gb}GB/${total_mem_in_gb}GB"
fi
else
echo "${SQL} Memory Usage: OK - ${mysql_mem_in_gb}GB of ${total_mem_in_gb}GB"
fi
}
mysql_status_open_files_func() {
mysql_conn_open_files=$(${sql_client} -Nse "SELECT variable_value FROM ${inf_table} WHERE variable_name = 'Open_files';" 2>/dev/null)
if [[ -n "${mysql_conn_open_files}" ]]; then
mysql_conn_open_files_max=$(${sql_client} -Nse "SELECT @@global.open_files_limit;" 2>/dev/null)
mysql_conn_open_files_used_percent=$(awk -v open="${mysql_conn_open_files}" -v max="${mysql_conn_open_files_max}" \ 'BEGIN {printf "%.0f", (open/max)*100}')
if [[ "${mysql_conn_open_files_used_percent}" -gt 95 ]]; then
echo "${SQL} Open Files: [[ CRITICAL ]] - ${mysql_conn_open_files} open files out of ${mysql_conn_open_files_max} limit (${mysql_conn_open_files_used_percent}%)"
else
echo "${SQL} Open Files: OK - ${mysql_conn_open_files} open files out of ${mysql_conn_open_files_max} limit (${mysql_conn_open_files_used_percent}%)"
fi
else
echo "${SQL} Open Files: [[ CRITICAL ]] - unable to read the database for Openfiles"
fi
}
mysql_status_threads_func() {
mysql_conn_threads_data=$(${sql_client} -Nse "SHOW STATUS LIKE 'Threads_%';" 2>/dev/null| column -t | sed 's/ */ /g')
mysql_Threads_connected=$(awk '/Threads_connected/ {print $2}' <<< "${mysql_conn_threads_data}")
if [[ -n "${mysql_Threads_connected}" ]]; then
if [[ "${mysql_Threads_connected}" -gt 200 ]]; then
echo "${SQL} Threads: [[ CRITICAL ]] - ${mysql_Threads_connected} Threads connected of 200 threshold - ${mysql_conn_threads_data}" | sed ':a;N;$!ba;s/\n/, /g'
else
echo "${SQL} Threads: OK - ${mysql_conn_threads_data}" | sed ':a;N;$!ba;s/\n/, /g'
fi
else
echo "${SQL} Threads: [[ CRITICAL ]] - unable to read the database for Threads"
fi
}
mysql_check_runner() {
mysql_status_check_func
mysql_status_connections_func
mysql_status_connect_time_func
mysql_status_memory_func
mysql_status_open_files_func
mysql_status_threads_func
}
mysql_check_data_raw=$(mysql_check_runner)
mysql_check_data_all=$(echo "${mysql_check_data_raw}"| sed ':a;N;$!ba;s/\n/ | /g')
mysql_check_data_alerts=$(echo "${mysql_check_data_raw}"| grep CRIT | sed ':a;N;$!ba;s/\n/ | /g')
if echo "${mysql_check_data_all}" | grep -q CRIT; then
echo "Check ${SQL} ($VER) Status: CRIT - ${mysql_check_data_alerts}"
exit 2
else
echo "Check ${SQL} ($VER) Status: ${mysql_check_data_all}"
exit 0
fi