监视MySQL从属状态

时间:2015-12-03 17:19:25

标签: mysql replication nagios

我使用Nagios和mysql_check_health pugin来监控我的MySQL数据库。我需要能够从sql查询返回一个数值到我的插件,告诉我复制的数据库是否启动并运行。 所以这就是我所拥有的......

SHOW GLOBAL STATUS like 'slave_running'     

将返回:

Variable_name   Value
Slave_running   OFF/ON

我需要从插件的简单查询中返回一个数值,任何人都有任何想法...我的想法是返回3 - LENGTH(Slave_running),这将= = 1为ON 0关闭但有麻烦以这种方式使用返回值。

2 个答案:

答案 0 :(得分:0)

可以在information_schema.GLOBAL_STATUS表中访问全局状态变量,您可以从中查询该值。这样可以很容易地根据ON/OFF状态将其有条件地转换为0或1。

例如:

> SELECT VARIABLE_VALUE 
    FROM information_schema.GLOBAL_STATUS
    WHERE VARIABLE_NAME = 'slave_running';
+----------------+
| VARIABLE_VALUE |
+----------------+
| ON             |
+----------------+

因此,要将其转换为零或一,有几种可能性。 MySQL会将布尔值视为0或1,因此您只需将其与= 'ON'

进行比较即可

在子查询中包含上述内容(因为它返回一个值)并与'ON'进行比较:

> SELECT (
   'ON' = (SELECT VARIABLE_VALUE
    FROM information_schema.GLOBAL_STATUS
    WHERE VARIABLE_NAME = 'slave_running')
  ) AS state;
+-------+
| state |
+-------+
|     1 |
+-------+

或类似的表达式,格式为CASE

> SELECT CASE WHEN (
    SELECT VARIABLE_VALUE
    FROM information_schema.GLOBAL_STATUS
    WHERE VARIABLE_NAME = 'slave_running') = 'ON' THEN 1
  ELSE 0 END AS state;                                                                                                                                       
+-------+
| state |
+-------+
|     1 |
+-------+

在上述两种情况中,我将结果别名为'state',但您可以使用任何列别名来读取输出,相应地替换AS state

那里有什么?

我无法帮助,但想知道是否已经为此目的构建了Nagios插件,found this as a possibility

答案 1 :(得分:-1)

我强烈考虑使用:

SHOW SLAVE STATUS

作为您的信息查询。这为您提供了一些可以监控的关键字段。

由此,您可能会考虑对以下字段发出警告:

Slave_IO_Running: Yes / No (tells you if binary log feed from master is working)
Slave_SQL_Running: Yes / No (tells you if slave's SQL execution thread is runing)
Seconds_Behind_Master: INT value (you should set appropriate low value here to alarm off of)

Slave_running全局状态可以用于确定整体状态(当从属服务器上的IO线程和SQL线程都在运行时,该值仅为“打开”),但可能无法提供您想要的更多内容粒度监控。例如,IO线程中的中断可以被认为是比SQL线程中断更高的严重性事件(并且可能具有完全不同的恢复方案)。 Seconds_Behind_Master也可能是监控的关键,因为您可能正在快速运行IO和SQL线程,而没有意识到奴隶因某些原因无法跟上。

如果您需要转换为从属状态值的INT值结果,您可以执行以下操作:

SELECT
    (CASE WHEN a.Slave_IO_Running = 'Yes' THEN 1 ELSE 0 END)
        AS Slave_IO_Running,
    (CASE WHEN a.Slave_SQL_Running = 'Yes' THEN 1 ELSE 0 END)
        AS Slave_SQL_Running,
    a.Seconds_Behind_Master AS Seconds_Behind_Master
FROM (SHOW SLAVE STATUS) AS a