
强迫症福音:如何完美重置x-ui面板节点ID,实现从1开始连续排列
前言
相信很多使用 x-ui 面板的朋友都遇到过这样的情况:为了测试或管理,我们添加了许多入站节点,后来又删除了一部分。这时,节点列表的 ID 就会出现断层,比如 1, 2, 5, 8, 11...
,对于追求整洁和完美的用户来说,这简直是“逼死强迫症”。
本文将提供一个终极解决方案,通过直接操作数据库,将你的 x-ui 节点 ID 重新整理为从 1
开始的完美连续序列,并且,我们还会分享一个“意外之喜”——在重置ID的同时,保留所有节点的历史流量统计数据!
核心原理
x-ui 的所有配置和数据都存储在一个名为 x-ui.db
的 SQLite 数据库文件中。我们的方法就是通过 SQL 命令,将存储节点的 inbounds
表进行重建:
- 读取旧表中的所有节点数据。
- 创建一个新的临时表。
- 将数据有序地插入到新表中,利用数据库的自增主键(
AUTOINCREMENT
)特性,自动生成从 1 开始的连续 ID。 - 删除旧表,并将新表重命名,完成替换。
⚠️ 重要警告:操作前必读!
这是一个高风险的数据库操作。请务必严格按照步骤执行!
- 数据无价,备份先行! 本文最重要的步骤就是备份数据库。如果操作失误,没有备份将导致所有节点数据丢失!
- 停止面板! 操作期间必须停止 x-ui 服务,防止数据读写冲突导致数据库损坏。
- 仔细复制命令! 请确保完整复制本文提供的命令,不要手动输入,以免出错。
操作步骤
第一步:连接服务器并停止 x-ui
使用 SSH 工具登录到你的服务器,然后执行以下命令停止 x-ui 面板,确保数据库文件没有被占用。
x-ui stop
第二步:备份数据库(最重要的一步!)
执行以下命令,将当前的数据库文件备份到 /root
目录下,并以当前时间命名,以防万一。
cp /etc/x-ui/x-ui.db /root/x-ui.db.backup-$(date +"%Y%m%d%H%M%S")
备份后,可以执行 ls /root
查看,确保备份文件(如 x-ui.db.backup-20231027103000
)已成功创建。请务必确认备份成功后再进行下一步!
第三步:执行ID重置脚本
这是最核心的一步。请完整复制下面的所有代码,并粘贴到你的 SSH 终端中执行。
这段脚本会自动连接到数据库,执行一系列安全的 SQL 操作来重建节点表。
sqlite3 /etc/x-ui/x-ui.db <<'EOF'-- 创建一个与 inbounds 结构相同的新表,但不包含自增ID的主键特性CREATE TABLE inbounds_new ( id INTEGER, user_id INTEGER NOT NULL, up INTEGER NOT NULL, down INTEGER NOT NULL, total INTEGER NOT NULL, remark TEXT NOT NULL, enable INTEGER NOT NULL, expiry_time INTEGER NOT NULL, listen TEXT NOT NULL, port INTEGER NOT NULL, protocol TEXT NOT NULL, settings TEXT NOT NULL, stream_settings TEXT NOT NULL, tag TEXT NOT NULL, sniffing TEXT NOT NULL);
-- 将旧表的数据(除了ID)插入到新表中,ID会自动从1开始生成INSERT INTO inbounds_new (user_id, up, down, total, remark, enable, expiry_time, listen, port, protocol, settings, stream_settings, tag, sniffing)SELECT user_id, up, down, total, remark, enable, expiry_time, listen, port, protocol, settings, stream_settings, tag, sniffing FROM inbounds ORDER BY id;
-- 删除旧的 inbounds 表DROP TABLE inbounds;
-- 将新表重命名为 inbounds,并重建主键CREATE TABLE inbounds ( id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, user_id INTEGER NOT NULL, up INTEGER NOT NULL, down INTEGER NOT NULL, total INTEGER NOT NULL, remark TEXT NOT NULL, enable INTEGER NOT NULL, expiry_time INTEGER NOT NULL, listen TEXT NOT NULL, port INTEGER NOT NULL, protocol TEXT NOT NULL, settings TEXT NOT NULL, stream_settings TEXT NOT NULL, tag TEXT NOT NULL, sniffing TEXT NOT NULL);INSERT INTO inbounds (id, user_id, up, down, total, remark, enable, expiry_time, listen, port, protocol, settings, stream_settings, tag, sniffing)SELECT id, user_id, up, down, total, remark, enable, expiry_time, listen, port, protocol, settings, stream_settings, tag, sniffing FROM inbounds_new ORDER BY id;DROP TABLE inbounds_new;
-- 清空与旧ID关联的流量统计数据,因为ID已经改变,旧的统计数据已无意义DELETE FROM inbound_client_traffics;VACUUM;.quitEOF
脚本执行完成后,不会有任何输出,这代表操作成功。
第四步:重启 x-ui 并验证
现在,重新启动 x-ui 面板。
x-ui start
登录你的 x-ui Web 界面,刷新“入站列表”页面。见证奇迹的时刻到了!你会发现所有的节点 ID 都已经从 1 开始,完美地连续排列。现在,你的节点列表应该像阅兵一样整齐了!
意外之喜:为什么流量统计数据还在?
细心的你可能会发现,操作完成后,每个节点的历史总流量(上行/下行)竟然还在!
这是因为节点的总流量数据(up
和 down
字段)是直接记录在 inbounds
这张主表里的。我们上面的脚本在迁移数据时,是把这些流量数据原封不动地一起复制到了新表中。因此,这个方法在重置 ID 的同时,完美保留了节点的总流量统计,一举两得!
如果出现问题怎么办?(恢复大法)
如果在操作后,你的面板无法启动或节点列表为空,不要慌张,我们有备份。
- 停止 x-ui
Terminal window x-ui stop - 找到你的备份文件
Terminal window ls /root/x-ui.db.backup-* - 用备份文件覆盖当前数据库 (注意替换成你自己的备份文件名)
Terminal window # 示例命令,请务必替换成你自己的文件名cp /root/x-ui.db.backup-20251027103000 /etc/x-ui/x-ui.db - 重新启动 x-ui
这样,你的面板就会恢复到操作之前的状态。
Terminal window x-ui start
结语
通过这个简单而强大的方法,我们轻松解决了 x-ui 节点 ID 不连续的问题,让面板管理更加清爽和有序。