11人参与 • 2026-09-20 • Mysql
第一次部署 mysqld_exporter 时,下载二进制、建 mysql 监控账号、写连接配置、补 systemd 服务,看起来都不难;真正烦的是机器一多,这些步骤就会不停重复。更麻烦的是,少一个权限、路径写错一处、服务忘了开机自启,最后往往不是“安装失败”这么直接,而是 prometheus 抓不到指标后再倒回来排查。我更愿意把这类固定动作写进脚本,让重复部署尽量变成一套可复用流程,但同时也会保留对账号、密码、端口和权限的检查。尤其监控组件一旦开始批量铺开,真正难维护的往往不是安装本身,而是不同机器之间版本不一致、配置不一致、凭据散落和后续无法追溯,这些问题比“多敲几条命令”更麻烦。
这次我在 centos 7 上使用 shell 脚本部署 mysqld_exporter v0.18.0:脚本自动安装依赖、下载程序到 /app/mysqld_exporter、创建 prometheus 系统用户和 mysql 监控用户、生成 localhost_db.cnf、注册 systemd,并让服务监听 9105。随后先让 prometheus 在局域网抓取 192.168.42.146:9105,再安装 cpolar,把 9105 web 指标入口映射到公网,验证随机地址抓取,最后配置固定二级子域名 mysqll。我更看重“脚本到底自动化了哪些步骤、prometheus 实际抓到了什么”,而不是把“一键执行”直接等同于所有环境都能无脑复制。

这类监控组件最适合自动化的地方,就是安装步骤高度重复。
如果每台机器都手工做一遍,通常要反复处理这些事情:
机器少的时候,手工还能接受;机器一多,真正消耗时间的是重复操作和后续排错。
所以我更愿意把目标定得简单一点:
脚本负责把固定部署步骤标准化,prometheus 负责抓指标,cpolar 只在跨网络场景下提供 9105 的公网访问入口。
这三层职责分开以后,后面哪一层出问题也更容易定位。
当前脚本使用的版本是:
v0.18.0
安装目录:
/app/mysqld_exporter
监听端口:
9105
整体流程包括:
wget 和 tar;prometheus 系统用户;mysqld_exporter 数据库监控用户;replication client、process 和 performance_schema 查询权限;localhost_db.cnf;600;mysqld_exporter.service。完整脚本如下:
#!/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"这里有一个我会特别留意的地方:脚本里直接写入了 mysql root 和 exporter 的固定密码。
代码按当前内容原样保留,但如果后面准备把脚本放进 git、ansible 或多台机器批量使用,我不会把“能自动跑”当成“凭据管理已经解决”。脚本自动化的是部署流程,不是密码治理。
先创建脚本文件:
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"
这里脚本文件名叫:
mysql_exporter.sh
而实际下载的二进制、systemd 服务以及当前项目名称都使用:
mysqld_exporter
两种写法在当前流程里同时存在,我按现有内容保留,不强行统一。
保存完成以后运行:
sh mysql_exporter.sh

如果整个流程能够顺利执行,脚本会依次完成依赖安装、下载、mysql 用户创建、配置文件生成和 systemd 注册。
但我不会只看“脚本没报错”就结束。
真正关键的是再确认服务状态。
执行:
systemctl status mysqld_exporter

当前结果显示 mysqld_exporter 服务已经成功启动。
脚本中还会输出类似:
http://主机ip:9105/metrics
的指标地址。
到这里,真正验证的是:
mysql → mysqld_exporter → 9105 → systemd 服务正常运行。
mysqld_exporter 跑起来以后,再去配置 prometheus。
打开:
vi prometheus.yml
当前示例加入:
- targets: ["192.168.42.146:9105"]
labels:
app: "mysql_exporter"

这里 prometheus 和 mysqld_exporter 不在同一台机器,所以抓取目标写的是:
192.168.42.146:9105
如果都在同一台机器,当前说明写的是可以使用 localhost。
接着通过:
ip + 9090
打开 prometheus 页面。

当前页面已经能够看到 prometheus 抓取到:
192.168.42.146
上的 mysql_exporter 服务。
这一层先把最基础的监控链验证清楚:
mysql → mysqld_exporter 9105 → prometheus 局域网抓取。
如果 prometheus 和 mysqld_exporter 位于同一个局域网,直接写内网 ip 就可以。
问题出现在另一种场景:
192.168.42.146:9105。这时候真正需要开放的是:
mysqld_exporter 的指标入口 9105
而不是把 mysql 数据库本身直接暴露出去。
cpolar 在这套方案里的职责也只有这一层:
把本地 mysqld_exporter 的 9105 http 指标页面提供给外部 prometheus 访问。
数据库指标仍然由 mysqld_exporter 采集,prometheus 仍然负责抓取和存储。
执行当前安装命令:
sudo curl https://get.cpolar.sh | sh

安装完成以后检查服务状态:
sudo systemctl status cpolar

服务正常以后,通过主机 ip + 9200 打开 cpolar web 管理页面。
当前页面写的是:
ip:9200
同时链接目标为:
http://localhost:9200/
实际访问时,以当前环境真正能打开的地址为准。

进入【隧道管理 → 创建隧道】。
当前配置为:
mysql_exporterhttp9105china top
创建以后,到在线隧道列表查看公网地址。

当前示例得到:
38c53143.r2.cpolar.top
接下来 prometheus 的目标配置改为:
- targets: ["38c53143.r2.cpolar.top"]
labels:
app: "mysql_exporter"

随后页面显示抓取成功。

这一层真正验证的是:
内网 mysqld_exporter 9105 → cpolar http 公网地址 → 外部 prometheus 抓取。
当前 prometheus target 按现有配置原样写为:
38c53143.r2.cpolar.top
这里不额外补端口或改写格式。
随机地址适合先验证跨网络抓取。
如果 prometheus 要长期使用同一个抓取目标,地址频繁变化就不方便继续维护。
所以当前流程继续配置固定二级子域名。
进入预留页面。

选择保留二级子域名。
当前记录为:
china topmysqll
然后回到【隧道管理 → 隧道列表】,找到:
mysql_exporter
隧道。

把域名类型改为:
二级子域名
并在:
sub domain
中填写已经保留的二级子域名。
地区继续选择:
china top

更新完成以后,在线隧道列表中的随机公网地址会切换成固定二级子域名形式。

最后通过固定公网地址访问。

当前页面可以正常打开。
这里能够确认固定公网 web 入口已经生效;但当前材料没有继续展示把 prometheus 的 target 再改成固定二级子域名以后进行第二次抓取验证,所以我不会把这一步额外写成“固定域名 prometheus 抓取已再次验证”。
这套脚本真正省下来的,不是“敲一条命令”本身,而是把一组容易重复出错的部署步骤固定下来。
这次实际跑通的主线是:
centos 7 → shell 脚本 → mysqld_exporter v0.18.0 → /app/mysqld_exporter → mysql 监控用户 → localhost_db.cnf → prometheus 系统用户 → systemd → 9105 → prometheus 局域网抓取 192.168.42.146:9105 → cpolar → 随机公网 38c53143.r2.cpolar.top → prometheus 公网抓取成功 → 固定二级子域名 mysqll。
几个边界需要分清:
9105 指标入口提供到公网,不参与 mysql 指标采集;如果后面真的要部署很多节点,我更看重的不是“脚本能不能跑 100 台”,而是版本、目录、权限、凭据和抓取目标是否都能保持一致。自动化的价值就在这里:不是省掉所有判断,而是把真正需要人工判断的部分留下,把重复动作尽量交给脚本。
以上就是mysql监控总在重复配置的问题原因与解决流程的详细内容,更多关于mysql监控总在重复配置的资料请关注代码网其它相关文章!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论