【问题标题】:monitoring MySQL slave status监控 MySQL 从站状态
【发布时间】:2015-12-03 17:19:24
【问题描述】:

我正在使用 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 表示关闭但使用时遇到问题以这种方式返回值。

【问题讨论】:

标签: mysql replication nagios


【解决方案1】:

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

例如:

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

因此,要将其转换为 0 或 1,有几种可能性。 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

【讨论】:

    【解决方案2】:

    我强烈考虑使用:

    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 线程都在运行时,该值仅是 '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
    

    【讨论】:

    • 我测试了类似的东西,发现在 5.1 上不支持在子查询中使用 SHOW SLAVE STATUS。或 5.6
    • @MichaelBerkowski 有趣。可能需要查看针对性能模式的复制表的查询以更直接地获取此信息(尽管不方便)。
    • 这也是一个很好的答案,不幸的是(正如 Michael Berkowski 所说)我的 MySQL 服务器不允许我使用 (SHOW SLAVE STATUS) 作为子查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    相关资源
    最近更新 更多