哪吒监控(Nezha Monitoring)删除服务器后,新建的服务器 ID 不会延续之前的编号——这对强迫症来说真的很折磨。好消息是,哪吒用的是 SQLite,直接改数据库就行。
前提说明
哪吒监控面板的所有核心数据(服务器列表、报警记录、网络延迟历史等)都存储在一个 SQLite 文件中:
/opt/nezha/dashboard/data/sqlite.db操作前务必先备份:
cp /opt/nezha/dashboard/data/sqlite.db /opt/nezha/dashboard/data/sqlite.db.bak.$(date +%Y%m%d)⚠️ 修改数据库前必须先停止哪吒 Dashboard 服务,否则写入会被覆盖或锁冲突。
一、安装 SQLite3
大多数 Linux 发行版自带或可通过包管理器安装:
# Debian / Ubuntu
apt install sqlite3
# CentOS / RHEL
yum install sqlite
# Alpine
apk add sqlite验证安装:
sqlite3 --version二、停止哪吒 Dashboard
# systemd 方式
systemctl stop nezha-dashboard
# Docker 方式
docker stop nezha-dashboard这一步不能跳过。 Dashboard 运行时会持续读写 SQLite,直接修改可能导致数据损坏。
三、进入数据库
sqlite3 /opt/nezha/dashboard/data/sqlite.db进入后会看到 sqlite> 提示符。
常用命令速查
| 命令 | 说明 |
|---|---|
.tables | 列出所有表 |
.schema 表名 | 查看表结构 |
SELECT * FROM 表名; | 查看全部数据 |
.mode column | 列对齐显示(更好看) |
.headers on | 显示列名 |
.exit | 退出 |
建议进入后先执行这两条,让输出更易读:
.mode column
.headers on四、修改服务器 ID(调整排序)
查看当前服务器列表
SELECT id, name, host, created_at FROM servers ORDER BY id;输出示例:
id name host created_at
--- ----------- ----------- -------------------
1 HK-01 1.2.3.4 2026-01-15 10:00:00
3 JP-02 5.6.7.8 2026-02-20 14:30:00
7 US-03 9.10.11.12 2026-03-01 09:00:00可以看到 ID 不连续(1、3、7),删除过的服务器 ID 不会被复用。
修改 ID
-- 把 ID 7 改成 2
UPDATE servers SET id = 2 WHERE id = 7;
-- 把 ID 3 改成 3(不变,确认一下)
-- 如果需要多台调整,按目标顺序逐个改⚠️ 重要:避免 ID 冲突。 如果要把 ID 7 改成 2,但当前已经有 ID 2 的服务器,需要先做一个中间过渡:
-- 假设当前有 id=2 和 id=7,要把 7 调到 2 的位置
-- 第一步:先把 2 临时改成一个大数(避免冲突)
UPDATE servers SET id = 999 WHERE id = 2;
-- 第二步:把 7 改成 2
UPDATE servers SET id = 2 WHERE id = 7;
-- 第三步:把 999 改成 3(或者你想放的位置)
UPDATE servers SET id = 3 WHERE id = 999;重置自增序列
修改 ID 后,SQLite 的自增计数器可能还停留在之前的最大值。如果不重置,新建服务器时 ID 会从大数字继续递增。
-- 查看当前自增序列
SELECT * FROM sqlite_sequence WHERE name = 'servers';
-- 重置为当前最大 ID
DELETE FROM sqlite_sequence WHERE name = 'servers';重置后,新建服务器的 ID 会从当前最大 ID + 1 开始。
五、修改报警通知顺序
哪吒的报警规则(monitors / notification groups)也存储在 SQLite 中。如果需要调整报警通知的触发顺序:
-- 查看报警规则
SELECT * FROM monitors;
-- 查看通知组
SELECT * FROM notifications;报警规则的执行顺序通常由 id 决定。修改方式与服务器相同:
-- 查看当前顺序
SELECT id, name, type FROM monitors ORDER BY id;
-- 调整 ID 来改变顺序(注意避免冲突,方法同上)
UPDATE monitors SET id = 目标id WHERE id = 原id;修改后同样需要重置序列:
DELETE FROM sqlite_sequence WHERE name = 'monitors';六、清空网络延迟历史
如果面板积累了大量网络延迟数据(service_histories 表),导致面板加载变慢或数据库文件过大:
-- 查看当前记录数
SELECT COUNT(*) FROM service_histories;
-- 查看数据库文件大小(退出 sqlite 后执行)
-- .quit 然后 ls -lh /opt/nezha/dashboard/data/sqlite.db
-- 清空所有延迟记录
DELETE FROM service_histories;
-- 如果只想清理特定服务器的延迟
DELETE FROM service_histories WHERE server_id = 目标id;
-- 清空后重置序列
DELETE FROM sqlite_sequence WHERE name = 'service_histories';定期清理建议
如果不想每次都手动操作,可以写个 cron 定时清理超过 30 天的数据:
#!/bin/bash
# /opt/nezha/cleanup_history.sh
DB="/opt/nezha/dashboard/data/sqlite.db"
sqlite3 "$DB" "DELETE FROM service_histories WHERE created_at < datetime('now', '-30 days');"
sqlite3 "$DB" "VACUUM;"crontab 每天凌晨 3 点执行:
0 3 * * * /opt/nezha/cleanup_history.sh >> /var/log/nezha_cleanup.log 2>&1七、其他有用的数据库操作
重命名服务器
UPDATE servers SET name = '新名称' WHERE id = 目标id;修改服务器备注 / 分组
-- 查看 servers 表所有字段
.schema servers
-- 根据字段名修改
UPDATE servers SET note = '备注信息' WHERE id = 目标id;导出数据备份
# 导出为 SQL 文件
sqlite3 /opt/nezha/dashboard/data/sqlite.db .dump > nezha_backup_$(date +%Y%m%d).sql
# 导出为 CSV
sqlite3 -header -csv /opt/nezha/dashboard/data/sqlite.db "SELECT * FROM servers;" > servers.csv数据库瘦身
大量删除后,SQLite 文件不会自动缩小,需要执行 VACUUM:
VACUUM;或者命令行方式:
sqlite3 /opt/nezha/dashboard/data/sqlite.db "VACUUM;"八、重启 Dashboard
所有修改完成后:
# systemd 方式
systemctl start nezha-dashboard
# Docker 方式
docker start nezha-dashboard打开面板确认修改生效。
九、常见问题
Q: 改完 ID 面板显示不对?
刷新浏览器缓存(Ctrl+Shift+R)。哪吒面板可能有前端缓存,ID 改了但显示没更新。
Q: 修改时提示 "database is locked"?
说明 Dashboard 还在运行,必须先停止服务再修改。
Q: 想把某台服务器排到第一位,怎么改最简单?
假设当前服务器 ID 是 1、3、7,你想让 7 排第一:
-- 三台的 ID 都临时改成大数
UPDATE servers SET id = 1000 WHERE id = 1;
UPDATE servers SET id = 1001 WHERE id = 3;
UPDATE servers SET id = 1002 WHERE id = 7;
-- 按目标顺序重新编号
UPDATE servers SET id = 1 WHERE id = 1002; -- 原 7 → 新 1
UPDATE servers SET id = 2 WHERE id = 1000; -- 原 1 → 新 2
UPDATE servers SET id = 3 WHERE id = 1001; -- 原 3 → 新 3
-- 重置序列
DELETE FROM sqlite_sequence WHERE name = 'servers';Q: Docker 部署的哪吒,怎么操作数据库?
# 进入容器
docker exec -it nezha-dashboard bash
# 容器内已经内置 sqlite3,直接用
sqlite3 /opt/zhaoqing/data/sqlite.db或者直接在宿主机操作(数据卷映射的情况下):
docker inspect nezha-dashboard | grep -A5 Mounts
# 找到数据目录映射路径,直接 sqlite3 该路径总结
| 操作 | 核心命令 |
|---|---|
| 修改服务器 ID | UPDATE servers SET id = 新id WHERE id = 旧id; |
| 重置自增序列 | DELETE FROM sqlite_sequence WHERE name = 'servers'; |
| 清空延迟数据 | DELETE FROM service_histories; |
| 数据库瘦身 | VACUUM; |
| 导出备份 | sqlite3 xxx.db .dump > backup.sql |
记住三件事:先备份、先停服务、注意 ID 冲突。其他都是常规 SQL 操作。
写于 2026 年 6 月 15 日。