服务器其它

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 服务器其它 > shell脚本部署mysql_exporter

shell脚本命令搞定mysql_exporter部署,重复配置自动化

作者:User_芊芊君子

本文使用shell脚本一键部署mysql_exporter,并步骤,确保多台服务器配置一致且高效,通过预编译密码和权限,脚本自动创建MySQL监控用户、配置权限、写service文件并启动服务,此外,文章还探讨了使用cpolar解决跨网络监控问题,生成固定公网地址让Prometheus抓取内网MySQL指标

前言

在多台服务器上部署 mysql_exporter 这件事,手动做的话每一步都不能少:下载二进制包、MySQL 建监控用户、授权、写 systemd 服务文件、配凭证文件。跑一台的时候还好,批量跑的时候每台都来一遍,容易出错也浪费时间。

这篇的核心是把整个部署流程写成一个 Shell 脚本:一条命令跑完下载、安装、建用户、配权限、写服务、启动服务这些步骤。脚本里硬编码了 MySQL root 密码和 exporter 用户的密码,跑的时候按需改一下就行。跑完之后 systemd 服务自动注册好,开机自启,prometheus 直接抓 metrics 地址就能用。

脚本本身不复杂,关键是把原本需要查文档一步步做的内容变成了可复用的工具。对于需要同时维护多台 MySQL 实例的人来说,把这个脚本存下来,后续扩缩容的时候直接跑命令比逐台操作效率高得多。

1.为什么选择shell脚本一键安装?

选择Shell脚本一键安装mysqld_exporter,主要是为了提升部署效率、保证配置一致性并降低人为操作错误风险

在生产环境中,往往需要在多台服务器上快速部署监控组件,手动执行下载、解压、创建用户、配置MySQL权限、编写systemd服务等步骤不仅繁琐,还容易因环境差异导致配置遗漏或权限问题。

通过Shell脚本自动化整个流程,可以实现“一次编写,处处运行”,确保所有节点的安装路径、用户权限、监听端口和认证信息完全统一,同时支持以非root用户(如 prometheus)安全运行,并自动配置开机自启,极大简化了Prometheus监控体系的落地与维护成本。

2.编写shell脚本

部署MySQL Exporter(mysqld_exporter)的步骤,简单明了如下:

  1. 创建专用监控用户

    在MySQL中创建一个仅用于监控的用户(如 mysqld_exporter),并授予必要权限:REPLICATION CLIENT PROCESS SELECT on performance_schema.*

  2. 下载并解压 mysqld_exporter

    从 Prometheus 官方 GitHub 下载对应版本的二进制包,解压到指定目录(如 /app/mysqld_exporter)。

  3. 配置数据库连接凭证

    创建一个配置文件(如 localhost_db.cnf),写入监控用户的用户名和密码,格式为标准 MySQL 客户端配置(含 **[client]**段),并设置权限为 600,确保安全。

  4. 创建systemd服务

    编写systemd服务文件,以非root用户(如prometheus)运行mysqld_exporter,指定配置文件路径和监听端口(默认 :9105),并启用开机自启。

  5. 启动并验证服务

    启动服务,检查状态是否正常,并通过浏览器或 curl,确认指标可访问。

按照这个部署步骤,我已经把脚本写出来啦,需要的小伙伴仅供参考~(我安装的版本是0.18.0)

#!/bin/bash
# 一键安装 mysqld_exporter for CentOS 7
# 使用固定 MySQL root密码自动建用户
# 监控用户: mysqld_exporter / Sjixin520!

set -e

VERSION="v0.18.0"
INSTALL_DIR="/app/mysqld_exporter"
PORT="9105"

MYSQL_ROOT_USER="root"
MYSQL_ROOT_PASS="Sjixin52!"
EXPORTER_USER="mysqld_exporter"
EXPORTER_PASS="Sjixin52!"

RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m'

log() { echo -e "${GREEN}[INFO]${NC} $1"; }
error() { echo -e "${RED}[ERROR]${NC} $1" >&2; exit 1; }

if [ "$EUID" -ne 0 ]; then
    error "请以 root 用户运行此脚本!"
fi

# 安装依赖
log "安装必要工具..."
yum install -y wget tar &>/dev/null

# 下载mysqld_exporter
URL="https://github.com/prometheus/mysqld_exporter/releases/download/${VERSION}/mysqld_exporter-${VERSION#v}.linux-amd64.tar.gz"
log "正在下载mysqld_exporter ${VERSION} ..."
wget -O /tmp/mysqld_exporter.tar.gz "$URL" || error "下载失败"

# 解压到/app/mysqld_exporter
mkdir -p "$INSTALL_DIR"
tar -zxvf /tmp/mysqld_exporter.tar.gz -C "$INSTALL_DIR" --strip-components=1
chown -R root:root "$INSTALL_DIR"

# 确保prometheus用户存在
if ! id "prometheus" &>/dev/null; then
    log "创建prometheus系统用户..."
    useradd --system --shell /sbin/nologin --no-create-home prometheus
fi

# 自动创建MySQL监控用户
log "正在连接MySQL并创建监控用户 '$EXPORTER_USER' ..."

# 测试root登录是否成功
if ! mysql -u"$MYSQL_ROOT_USER" -p"$MYSQL_ROOT_PASS" -e "SELECT 1;" >/dev/null 2>&1; then
    error "无法使用root / Sjixin52! 登录MySQL,请确认MySQL正在运行且密码正确"
fi

# 创建exporter用户
mysql -u"$MYSQL_ROOT_USER" -p"$MYSQL_ROOT_PASS" <<SQL
CREATE USER IF NOT EXISTS '$EXPORTER_USER'@'localhost' IDENTIFIED BY '$EXPORTER_PASS';
GRANT REPLICATION CLIENT, PROCESS ON *.* TO '$EXPORTER_USER'@'localhost';
GRANT SELECT ON performance_schema.* TO '$EXPORTER_USER'@'localhost';
FLUSH PRIVILEGES;
SQL

log "MySQL监控用户创建成功!"

# 创建.my.cnf文件
cat > "$INSTALL_DIR/localhost_db.cnf" <<EOF
[client]
user=$EXPORTER_USER
password=$EXPORTER_PASS
host=localhost
EOF

chmod 600 "$INSTALL_DIR/localhost_db.cnf"
chown prometheus:prometheus "$INSTALL_DIR/localhost_db.cnf"

# 创建systemd服务
cat > /etc/systemd/system/mysqld_exporter.service <<EOF
[Unit]
Description=MySQL Exporter
After=network.target

[Service]
Type=simple
User=prometheus
ExecStart=$INSTALL_DIR/mysqld_exporter \\
    --config.my-cnf=$INSTALL_DIR/localhost_db.cnf \\
    --web.listen-address=:9105
Restart=on-failure
RestartSec=10
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
EOF

# 启动服务
log "启动 mysqld_exporter 服务..."
systemctl daemon-reload
systemctl enable --now mysqld_exporter

log "✅ 安装完成!"
log "指标地址: http://$(hostname -I | awk '{print $1}'):${PORT}/metrics"
log "服务状态: systemctl status mysqld_exporter"

3.使用脚本部署mysql_exporter

编辑一个mysql_exporter.sh文件:

vi mysql_exporter.sh
#!/bin/bash
# 一键安装 mysqld_exporter for CentOS 7
# 使用固定 MySQL root密码自动建用户
# 监控用户: mysqld_exporter / Sjixin520!

set -e

VERSION="v0.18.0"
INSTALL_DIR="/app/mysqld_exporter"
PORT="9105"

MYSQL_ROOT_USER="root"
MYSQL_ROOT_PASS="Sjixin52!"
EXPORTER_USER="mysqld_exporter"
EXPORTER_PASS="Sjixin52!"

RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m'

log() { echo -e "${GREEN}[INFO]${NC} $1"; }
error() { echo -e "${RED}[ERROR]${NC} $1" >&2; exit 1; }

if [ "$EUID" -ne 0 ]; then
    error "请以 root 用户运行此脚本!"
fi

# 安装依赖
log "安装必要工具..."
yum install -y wget tar &>/dev/null

# 下载mysqld_exporter
URL="https://github.com/prometheus/mysqld_exporter/releases/download/${VERSION}/mysqld_exporter-${VERSION#v}.linux-amd64.tar.gz"
log "正在下载mysqld_exporter ${VERSION} ..."
wget -O /tmp/mysqld_exporter.tar.gz "$URL" || error "下载失败"

# 解压到/app/mysqld_exporter
mkdir -p "$INSTALL_DIR"
tar -zxvf /tmp/mysqld_exporter.tar.gz -C "$INSTALL_DIR" --strip-components=1
chown -R root:root "$INSTALL_DIR"

# 确保prometheus用户存在
if ! id "prometheus" &>/dev/null; then
    log "创建prometheus系统用户..."
    useradd --system --shell /sbin/nologin --no-create-home prometheus
fi

# 自动创建MySQL监控用户
log "正在连接MySQL并创建监控用户 '$EXPORTER_USER' ..."

# 测试root登录是否成功
if ! mysql -u"$MYSQL_ROOT_USER" -p"$MYSQL_ROOT_PASS" -e "SELECT 1;" >/dev/null 2>&1; then
    error "无法使用root / Sjixin52! 登录MySQL,请确认MySQL正在运行且密码正确"
fi

# 创建exporter用户
mysql -u"$MYSQL_ROOT_USER" -p"$MYSQL_ROOT_PASS" <<SQL
CREATE USER IF NOT EXISTS '$EXPORTER_USER'@'localhost' IDENTIFIED BY '$EXPORTER_PASS';
GRANT REPLICATION CLIENT, PROCESS ON *.* TO '$EXPORTER_USER'@'localhost';
GRANT SELECT ON performance_schema.* TO '$EXPORTER_USER'@'localhost';
FLUSH PRIVILEGES;
SQL

log "MySQL监控用户创建成功!"

# 创建.my.cnf文件
cat > "$INSTALL_DIR/localhost_db.cnf" <<EOF
[client]
user=$EXPORTER_USER
password=$EXPORTER_PASS
host=localhost
EOF

chmod 600 "$INSTALL_DIR/localhost_db.cnf"
chown prometheus:prometheus "$INSTALL_DIR/localhost_db.cnf"

# 创建systemd服务
cat > /etc/systemd/system/mysqld_exporter.service <<EOF
[Unit]
Description=MySQL Exporter
After=network.target

[Service]
Type=simple
User=prometheus
ExecStart=$INSTALL_DIR/mysqld_exporter \\
    --config.my-cnf=$INSTALL_DIR/localhost_db.cnf \\
    --web.listen-address=:9105
Restart=on-failure
RestartSec=10
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target
EOF

# 启动服务
log "启动 mysqld_exporter 服务..."
systemctl daemon-reload
systemctl enable --now mysqld_exporter

log "✅ 安装完成!"
log "指标地址: http://$(hostname -I | awk '{print $1}'):${PORT}/metrics"
log "服务状态: systemctl status mysqld_exporter"

添加完成后,执行该文件:

sh mysql_exporter.sh

执行过程还是很顺利的,我们来一下终极验证,查看mysqld_exporter服务是否启动成功:

systemctl status mysqld_exporter

我们自动脚本就编写成功啦!

这样,无论你有上百台机器都不怕啦~

众所周知,mysql_exporter是搭配prometheus来使用的,接下来,跟我一起搭配prometheus来使用吧~

4.prometheus监控mysql_exporter

找到prometheus的配置文件,编辑添加如下内容(由于我是在另一台机器上安装的prometheus,所以写了mysql_exporter的Ip地址,正常写localhost就可以):

vi prometheus.yml
      - targets: ["192.168.42.146:9105"]
        labels:
          app: "mysql_exporter"

使用浏览器ip+9090打开promethues的页面:

我们可以看到prometheus已经抓取到192.168.42.146里面的mysql_exporter服务啦!

那么,现在我有一个疑问:**当MySQL Exporter与Prometheus部署在同一个局域网内时,监控自然畅通无阻;但如果它们不在同一网络环境——比如 Prometheus在公网服务器,而MySQL数据库位于内网或本地开发环境中,无法被外网直接访问,这时该怎么办?**别担心!cpolar正是解决这类跨网络监控难题的利器。通过cpolar的内网穿透能力,我们可以安全、稳定地将内网中运行的mysqld_exporter(默认监听 :9105)暴露到公网,生成一个临时或固定的公网地址。Prometheus只需将该地址配置为抓取目标,即可像访问本地服务一样采集内网MySQL的性能指标,全程无需修改防火墙策略、无需公网IP,也无需暴露数据库本身。更重要的是,cpolar支持HTTPS加密、身份认证和隧道保活,确保监控数据传输的安全性与可靠性。无论是远程调试、混合云架构,还是边缘设备监控,cpolar都能轻松打通网络壁垒,让Prometheus的“眼睛”看得更远、更广。所以,无论你的数据库藏得多深,只要有一条出网通道,cpolar就能帮你把监控数据“送出去”

5.安装cpolar内网穿透工具

cpolar 可以将你本地电脑中的服务(如 SSH、Web、数据库)映射到公网。即使你在家里或外出时,也可以通过公网地址连接回本地运行的开发环境。

❤️以下是安装cpolar步骤:

使用一键脚本安装命令:

sudo curl https://get.cpolar.sh | sh

安装完成后,执行下方命令查看cpolar服务状态:(如图所示即为正常启动)

sudo systemctl status cpolar

Cpolar安装和成功启动服务后,在浏览器上输入虚拟机主机IP加9200端口即:【ip:9200】访问Cpolar管理界面,使用Cpolar官网注册的账号登录,登录后即可看到cpolar web 配置界面,接下来在web 界面配置即可:

打开浏览器访问本地9200端口,使用cpolar账户密码登录即可,登录后即可对隧道进行管理。

6.配置公网地址

登录cpolar web UI管理界面后,点击左侧仪表盘的隧道管理——创建隧道:

创建成功后,打开左侧在线隧道列表,可以看到刚刚通过创建隧道生成了公网地址,接下来就可以在其他电脑或者移动端设备(异地)上,使用地址访问。

Prometheus可以通过这个公网地址38c53143.r2.cpolar.top访问到运行在本地9105端口的mysql_exporter服务,从而抓取系统指标。

      - targets: ["38c53143.r2.cpolar.top"]
        labels:
          app: "mysql_exporter"

抓取成功!

7.保留固定公网地址

使用cpolar为其配置二级子域名,该地址为固定地址,不会随机变化。

点击左侧的预留,选择保留二级子域名,地区选择china Top,然后设置一个二级子域名名称,我这里演示使用的是mysqll,大家可以自定义。填写备注信息,点击保留。

登录cpolar web UI管理界面,点击左侧仪表盘的隧道管理——隧道列表,找到所要配置的隧道mysql_exporter,点击右侧的编辑

修改隧道信息,将保留成功的二级子域名配置到隧道中

点击更新

更新完成后,打开在线隧道列表,此时可以看到随机的公网地址已经发生变化,地址名称也变成了保留和固定的二级子域名名称。

最后,我们使用固定的公网地址在任意设备的浏览器中访问,可以看到成功访问本地部署的页面,这样一个永久不会变化的二级子域名公网网址即设置好了。

结尾

脚本的价值在于把手动操作变成可复制的命令。把部署流程写进脚本里,不只是省时间,更重要的是减少人为操作带来的差异——每台机器的路径、用户权限、配置文件内容都能保持一致,出问题的时候排查逻辑也是统一的。

mysql_exporter 本身接入 Prometheus 的链路很标准:起服务、Prometheus 配 job 拉 metrics、告警规则针对具体的指标阈值来配。cpolar 在这里解决的是 Prometheus 和 exporter 不在同一网络的连通性问题,属于特定场景下的方案。

整体来说,这套脚本适合需要批量部署或者经常迁移环境的场景,一条命令搞定比查文档一步步做要可靠得多。

到此这篇关于shell脚本命令搞定mysql_exporter部署,重复配置自动化的文章就介绍到这了,更多相关shell脚本部署mysql_exporter内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文