监控 MySQL 奴隶状态

monitoring MySQL slave status

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

SHOW GLOBAL STATUS like 'slave_running'     

将return:

Variable_name   Value
Slave_running   OFF/ON

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

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

例如:

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

所以要将其转换为零或一,有几种可能性。 MySQL 会将布尔值视为 0 或 1,因此您可以直接比较它 = 'ON'

将上面的内容包装在子查询中(因为它 returns 一个值)并与 '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

我会强烈考虑使用:

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 slave 上的线程都为 运行 时,该值仅为 'On'),但在更精细的监控方面可能无法满足您的需求。例如,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