软件名称
mysql_exporter(MySQL 指标采集工具)
操作系统支持
- mysql_exporter:CentOS 7/8、Ubuntu、Debian 等主流 Linux 发行版(本文以 CentOS 7 为例)
软件介绍
mysql_exporter 是 Prometheus 生态里的 “MySQL 数据侦察兵”,能把 MySQL 的运行指标(比如连接数、慢查询、磁盘 IO)扒得明明白白,给监控平台喂数据;但它本身部署繁琐、且仅限局域网访问。搭配 cpolar 这款 “内网穿墙术” 工具,既能用 Shell 脚本一键部署 mysql_exporter,又能把内网的监控端口暴露到公网,不管你在公司、家里还是星巴克,都能随时看 MySQL 的 “健康报告”。
mysql_exporter的出色功能
1. mysql_exporter:MySQL 的 “贴身体检医生”
不用手动写 SQL 查指标,它能自动采集 MySQL 的核心运行数据(复制状态、进程列表、性能_schema 数据),数据格式完美适配 Prometheus,监控面板直接能用,省去 90% 的指标采集开发工作。
2. 自动化部署脚本:运维的 “懒人神器”
把下载、建用户、配权限、写服务文件这些繁琐步骤打包,root 用户一条命令跑完,从 “部署 1 台机器半小时” 变成 “部署 100 台机器喝杯茶”,还能避免人为配置错误。
实用场景
场景 1:中小企业多服务器 MySQL 监控部署
痛点:公司有 10 台 MySQL 服务器,运维人员手动部署 mysql_exporter,每台都要下载包、建监控用户、配 systemd 服务,耗时耗力还容易出现 “这台端口错了、那台权限没给够” 的问题;且 Prometheus 在公网,内网 MySQL 监控数据抓不到。
爽点:用自动化脚本批量执行,10 台机器 10 分钟部署完毕,配置完全统一;再用 cpolar 给每台机器的 mysql_exporter 配置公网地址,Prometheus 直接抓公网地址,不用折腾 VPN,运维坐在工位上就能看全公司的 MySQL 状态。
场景 2:个人开发者本地 MySQL 项目远程监控
痛点:在家用本地服务器搭了 MySQL 测试环境,想在公司查看测试库的运行指标,但本地服务器没公网 IP,监控数据只能在家看。
爽点:用脚本一键装完 mysql_exporter,再用 cpolar 生成免费公网地址,公司电脑打开 Prometheus,填上网址就能实时看本地 MySQL 的连接数、慢查询,远程调试时不用来回跑,效率直接起飞。
cpolar 内网穿透技术带来的便利
-
不用抢公网 IP,零成本打通内外网
不管是公司内网机房、家里的 NAS,还是本地开发机,只要能上网,cpolar 就能给 mysql_exporter 分配公网地址,不用向运营商申请公网 IP,也不用折腾路由器端口映射,小白也能 5 分钟搞定。
-
异地访问无限制,监控数据随手看
出差在外想查公司 MySQL 的监控数据?不用连麻烦的 VPN,打开手机 / 笔记本,通过 cpolar 的公网地址就能访问 mysql_exporter 的 metrics 页面,或者在 Prometheus 里看实时监控,走到哪监控到哪。
-
数据传输加密,安全不翻车
cpolar 支持 HTTPS 加密隧道,mysql_exporter 的监控数据从内网传到公网的过程中全程加密,不用担心数据被拦截、篡改,比裸奔的公网访问安全 10 倍。
-
固定地址不跑偏,配置一次管到底
担心 cpolar 随机域名总变?只需在 cpolar 后台预留一个二级子域名,绑定到 mysql_exporter 的隧道上,就能得到永久固定的公网地址,Prometheus 配置一次就不用改,再也不用天天更新抓取目标。
-
全平台适配,在哪都能用
不管你的 mysql_exporter 装在 Linux、Windows 还是 macOS 上,cpolar 都能适配,不用因为系统不同重新学配置,一套操作走天下。
总结
mysql_exporter 本身是 MySQL 监控的 “好帮手”,但手动部署的繁琐、局域网访问的限制,让它的好用程度打了折扣;而自动化部署脚本直接解决了 “部署难、配置乱” 的问题,cpolar 则补上了 “内网服务外网访问” 的短板。两者组合,就像给 MySQL 监控装了 “全自动部署引擎”+“内网穿墙翅膀”:运维人员不用再跟重复的配置步骤死磕,开发者不用再被公网 IP 限制手脚,不管是企业批量部署还是个人远程监控,都能一键搞定、随时随地访问。
如果你还在为 MySQL 监控部署头疼,或者想让内网的监控数据 “飞” 到公网,试试 mysql_exporter + 自动化脚本 + cpolar 的组合,绝对能让你从 “运维救火队员” 变成 “摸鱼小能手”!
闲着挣钱才是人生最高追求,这个能让运维小伙伴们闲一阵子的奇妙组合,快去安装吧!
本文将详细介绍脚本的设计思路与使用方法,助你轻松告别手动配置,迈入自动化运维新阶段。
1.为什么选择shell脚本一键安装?
选择Shell脚本一键安装mysqld_exporter,主要是为了提升部署效率、保证配置一致性并降低人为操作错误风险。
在生产环境中,往往需要在多台服务器上快速部署监控组件,手动执行下载、解压、创建用户、配置MySQL权限、编写systemd服务等步骤不仅繁琐,还容易因环境差异导致配置遗漏或权限问题。
通过Shell脚本自动化整个流程,可以实现“一次编写,处处运行”,确保所有节点的安装路径、用户权限、监听端口和认证信息完全统一,同时支持以非root用户(如 prometheus)安全运行,并自动配置开机自启,极大简化了Prometheus监控体系的落地与维护成本。
-
部署高效快捷
一条命令即可完成下载、配置、授权、启动全过程,大幅缩短部署时间。
-
配置标准化
所有服务器使用相同的路径、用户、端口和权限策略,避免“环境漂移”问题。
-
减少人为错误
自动创建MySQL监控用户并授予权限,避免手动操作导致的拼写错误或权限遗漏。
-
安全合规
自动以专用非登录用户(如prometheus)运行服务,并设置配置文件权限为600,防止密码泄露。
-
自动开机自启
集成systemd服务管理,确保系统重启后监控组件自动恢复运行。
-
便于批量运维
可结合Ansible、SaltStack或直接通过SSH批量执行,适用于大规模集群统一部署。
-
可版本化与复用
脚本可纳入Git管理,实现变更追踪、回滚和跨项目复用,提升DevOps能力。
2.编写shell脚本
部署MySQL Exporter(mysqld_exporter)的步骤,简单明了如下:
-
创建专用监控用户
在MySQL中创建一个仅用于监控的用户(如 mysqld_exporter),并授予必要权限:REPLICATION CLIENT PROCESS SELECT on performance_schema.*
-
下载并解压 mysqld_exporter
从 Prometheus 官方 GitHub 下载对应版本的二进制包,解压到指定目录(如 /app/mysqld_exporter)。
-
配置数据库连接凭证
创建一个配置文件(如 localhost_db.cnf),写入监控用户的用户名和密码,格式为标准 MySQL 客户端配置(含 **[client]**段),并设置权限为 600,确保安全。
-
创建systemd服务
编写systemd服务文件,以非root用户(如prometheus)运行mysqld_exporter,指定配置文件路径和监听端口(默认 :9105),并启用开机自启。
-
启动并验证服务
启动服务,检查状态是否正常,并通过浏览器或 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管理界面后,点击左侧仪表盘的隧道管理——创建隧道:
-
隧道名称:可自定义,本例使用了:mysql_exporter,注意不要与已有的隧道名称重复
-
协议:http
-
本地地址:9105
-
域名类型:随机域名
-
地区:选择China Top
创建成功后,打开左侧在线隧道列表,可以看到刚刚通过创建隧道生成了公网地址,接下来就可以在其他电脑或者移动端设备(异地)上,使用地址访问。
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,点击右侧的编辑。
修改隧道信息,将保留成功的二级子域名配置到隧道中
- 域名类型:选择二级子域名
- Sub Domain:填写保留成功的二级子域名
- 地区: China Top
点击更新
更新完成后,打开在线隧道列表,此时可以看到随机的公网地址已经发生变化,地址名称也变成了保留和固定的二级子域名名称。
最后,我们使用固定的公网地址在任意设备的浏览器中访问,可以看到成功访问本地部署的页面,这样一个永久不会变化的二级子域名公网网址即设置好了。
结尾
在传统运维中,部署mysql_exporter往往涉及下载二进制文件、创建监控用户、配置MySQL权限、编写服务文件、设置开机自启等多个繁琐步骤,不仅耗时还容易出错。如今,借助Shell脚本实现全自动部署,只需一条命令,即可完成从环境准备到服务运行的全流程:自动安装依赖、创建专用监控账号、生成安全配置文件、配置systemd服务并启用开机自启。整个过程标准化、可重复、零人工干预,大幅提升了部署效率与系统一致性,真正实现“一键交付,开箱即用”,让数据库监控触手可及。