ZBLOG

shell脚本如何远程探测两台数据库是否在线?

在Shell脚本中远程探测两台数据库是否在线,通常需要根据数据库类型(如MySQL、PostgreSQL、Oracle等)使用对应的客户端工具或网络探测方法。以下是针对常见数据库的几种通用方案:


一、通用网络层探测(不依赖数据库协议)

如果只需检查数据库端口是否开放(快速但无法验证数据库实际服务状态),可使用以下命令:

# 使用 nc (netcat) 检查端口
nc -z -w 2 <IP地址> <端口号> && echo "在线" || echo "离线"

# 使用 telnet(若未安装nc)
timeout 2 telnet <IP地址> <端口号> 2>&1 | grep "Connected" && echo "在线" || echo "离线"

# 示例:检测192.168.1.10的MySQL端口(3306)
nc -z -w 2 192.168.1.10 3306 && echo "MySQL在线" || echo "MySQL离线"

二、数据库协议层探测(推荐,更准确)

1. MySQL/MariaDB

使用 mysqladminmysql 客户端执行简单查询:

# 方法1:mysqladmin ping
mysqladmin -h <主机IP> -P <端口> -u <用户名> -p<密码> ping 2>/dev/null | grep "alive" && echo "在线" || echo "离线"

# 方法2:mysql执行简单查询
mysql -h <主机IP> -P <端口> -u <用户名> -p<密码> -e "SELECT 1;" 2>/dev/null && echo "在线" || echo "离线"

# 示例(注意-p后无空格):
mysql -h 192.168.1.10 -P 3306 -u root -pmypassword -e "SELECT 1;" >/dev/null 2>&1 && echo "MySQL在线" || echo "MySQL离线"

2. PostgreSQL

使用 psql 客户端执行简单查询:

psql -h <主机IP> -p <端口> -U <用户名> -d postgres -c "SELECT 1;" >/dev/null  2>&1 && echo "在线" ||   echo   "离线"

3. Redis

使用 redis-cli 发送PING命令:

redis-cli -h <主机IP> -p <端口> PING  2>/dev/null | grep   "PONG" &&   echo   "在线" ||   echo   “离线”

4. MongoDB

使用 mongoshmongo (旧版本):

mongosh --host <主机IP>:<端口> --eval   "db.adminCommand('ping')"  2>/dev/null | grep   \"ok\"\ :\ 1 &&   echo   “在线” ||   echo “离线”

三、封装成Shell函数示例(以MySQL为例)

#!/bin/bash

check_mysql() {
    local host=$1
    local port=$2
    local user=$3
    local pass=$4

    if mysql -h "$host" -P "$port"     u "$user"-p"$pass"-e     “SELECT    1;” >/dev/null     2>&1; then
        echo "[SUCCESS] MySQL at $host:$port is ONLINE"
        return     0
    else  
        echo "[ERROR] MySQL at $host:$port is OFFLINE"
        return     1  
    fi  
}

#   调用示例:检查两台数据库
check_mysql    192.168.1.10     3306     root     mypassword  
check_mysql    192.168.1.11     3306     root     anotherpass  

四、增强版脚本(支持超时和超时控制)

为避免长时间阻塞,建议添加超时限制:

#!/bin/bash

check_db_timeout() {
    local host=$1  
    local port=$2  
    local user=$3  
    local pass=$4  
    local timeout=5     #   设置超时时间(秒)

    #   使用timeout命令限制执行时间  
    if timeout $timeout mysql       h       "$host"-P       "$port"-u       "$user"-p       "$pass"-e         “SELECT        1;” >/dev/null         2>&1; then    
        return         0    
            else    
                return         1    
                    fi    
}

#   调用并判断返回值  
if check_db_timeout        192        168        0        100        3306        root        password; then    
            echo        “数据库        192        168        0        100:3306          正常”    
                else    
                            echo        “数据库异常或超时”    
                                fi   

注意事项:

  • 密码安全: 直接传递密码在命令行可能泄露信息(可通过配置文件隐藏密码,如MySQL的.my.cnf)。
  • 错误处理: 建议将错误输出重定向到日志文件(如 2>> error.log)。
  • 依赖工具: 确保系统已安装对应数据库客户端(如 mysql-clientpostgresql-client)。
  • 防火墙规则: 确保脚本运行环境与数据库之间的网络连通性。

如果需要频繁检测,可结合定时任务(如cron)实现自动化监控。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=24232

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?