哪吒监控(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 该路径

总结

操作核心命令
修改服务器 IDUPDATE 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 日。