本文介绍如何修复出现数据库故障的 UniFi 网络应用。请注意,本指南仅适用于在 Windows/macOS/Linux 设备上自行托管最新版本 UniFi Network Server 的用户(Legacy/Gen1 方式除外)。

如果你通过传统方式运行 UniFi 网络应用(如使用 Vintage CloudKey Gen 1 或基于 32 位的 UniFi 网络服务器),请参考本文最后的章节。由于这些设备已不再受支持,我们强烈建议升级到最新版本的 UniFi 网络应用,或新增 UniFi 控制台,以便获得更轻松、高效的体验和可扩展性。

常见症状

  • 统计数据仅记录数日后中断,或只间歇性可用。
  • 无法生成包含统计数据的备份。
  • 仅设置备份无法完成,或虽创建但因损坏无法还原。
  • 打开 UniFi 网络应用时出现 400 错误。
  • UniFi 网络应用服务因数据库错误无法启动。

Debian 系 Linux 数据库修复方法

  1. 停止 UniFi 服务
    service unifi stop
  2. 若 journal 文件损坏,可先执行如下命令将其移动备份:
    mv -vi /usr/lib/unifi/data/db/journal /usr/lib/unifi/data/db/journal-$(date -I)
  3. 执行数据库修复:
    mongod --dbpath /usr/lib/unifi/data/db --logpath /usr/lib/unifi/logs/mongod.log --repair
  4. 重启 UniFi 服务:

    service unifi start
    • 注意: 若以 root 身份执行上述操作,可能导致文件归属发生更改。可使用如下命令恢复权限:
      chown -R unifi:unifi /usr/lib/unifi/data/db/
      chown -R unifi:unifi /usr/lib/unifi/logs/

如果仍有数据库问题,建议迁移到 CloudKey Gen2 PlusDream Machine Pro,这些 UniFi 控制台不会出现类似数据库损坏问题。

macOS 数据库修复方法

  1. 创建临时工作目录,本例命名为 /repair:
      mkdir ~/repair
    
  2. 访问 MongoDB 官网,下载与你服务器 CPU 架构相符的 .tgz 包。
    • (也可直接下载 2.4.14 版本:2.4.14.tgz
  3. 将下载的软件包移入工作目录,并解压缩。
  4. 定位至 bin/mongo 可执行文件,复制到工作目录,其余文件可删除,仅此文件需要。
  5. 打开终端,切换到工作目录:
    cd ~/repair
    
  6. 关闭或停止 UniFi。
  7. 执行数据库修复:
    mongod --dbpath ~/Library/Application\ Support/UniFi/data/db --logpath ~/Library/Application\ Support/UniFi/logs/mongod.log --repair
    
  8. 通过 Finder 打开 UniFi 应用:
    open -n /Applications/UniFi.app
    

如修复后仍有数据库问题,建议升级至 CloudKey Gen2 PlusDream Machine Pro,杜绝数据库损坏。

Windows 数据库修复方法

  1. 访问 MongoDB 官网,下载与你 CPU 架构相符的 .zip 包。
    • 注意:最低需 3.6 版 MongoDB,最高支持至 4.4。
  2. 将 \bin\mongod.exe 解压到你选择的任意工作目录(本例中为 C:\repair\)。你可以忽略 .zip 压缩包中的其他所有文件。
  3. 关闭或停止 UniFi。
  4. 按 WINDOWS + R 打开运行窗口,输入 cmd 并回车,打开命令提示符。
  5. 切换至工作目录:
    cd C:\repair\
    
  6. 执行数据库修复命令:
    mongod.exe --dbpath "%userprofile%\Ubiquiti UniFi\data\db" --logpath "%programfiles%\Ubiquiti UniFi\logs\mongod.log" –repair
    
  7. 启动 UniFi 应用。

如修复后仍有数据库问题,建议升级至 CloudKey Gen2 PlusDream Machine Pro,这些产品不会出现数据库损坏。

传统说明

  1. 32位 MongoDB 限制

    32位 MongoDB 的集合总大小限制为 2GB。在使用 MMAPv1 存储引擎时,这会导致在尝试缩小所有集合大小时出现问题。当在 MongoDB 上执行 compact 命令时,数据库会被重写和整理碎片,但不会进行错误修复。对于采用 MMAPv1 存储引擎的环境,此过程并不会为 UniFi 控制台释放可用磁盘空间。

    若想在 32 位 MongoDB 实例上回收有价值的磁盘空间,必须执行数据库修复操作。若怀疑数据库存在无效条目、损坏或集合扩展异常等问题,也同样需要执行此修复。需要注意的是,要执行数据库修复,CloudKey 必须有“现有数据集大小+2GB”数量的可用磁盘空间。如果数据集已大到无法继续使用 db.repairDatabase() 命令进行修复,可参考下文的绕过方法。

    注意:Legacy CloudKey (UC CK) 硬件规格如下:

    • 32位架构
    • MMAPv1
    • MongoDB 2.4.10

  1. Vintage CloudKey (Gen 1) 数据库修复方法
    1. SSH 登录到 CloudKey。
    2. 下载 mongo 剪枝脚本。该脚本仅保留最近 7 天的数据条目,并不会移除 UniFi 管理所需的内容。请按照以下命令下载:
      cd /tmp/
      wget https://help.ui.com/hc/en-us/article_attachments/360008640574/CK_repair.js
    3. 停止 UniFi 服务:
      service unifi stop
    4. UniFi 服务会关闭 mongo 进程。请确保 UniFi 服务已完全停止。然后,执行数据库修复以整理数据条目并释放未使用的磁盘空间。
      mongod --dbpath /usr/lib/unifi/data/db --logpath /usr/lib/unifi/logs/server.log --repair
      • 注意:若需大量清理数据库空间,可继续以下步骤(5-8,非必需)。
    5. 重启 mongo 服务:
      mongod --dbpath /usr/lib/unifi/data/db --logpath /usr/lib/unifi/logs/server.log --journal --bind_ip 127.0.0.1 --fork
      • 注意:您的 mongo 数据库可能并未启用 Journaling。如未启用,请在上述命令中移除 --journal 参数。
    6. 执行脚本以清理导致问题的统计数据集合:
      mongo < /tmp/CK_repair.js
    7. 关闭 mongo 服务:
      mongod --dbpath /usr/lib/unifi/data/db --logpath /usr/lib/unifi/logs/server.log --shutdown
      • 注意:CK_repair.js 脚本中的最后一条命令是 "db.repairDatabase()";如果统计数据集合过大且 mongo 服务仍在运行,该命令可能会出错,遇到此类报错请回到第 3 步用命令行再次修复数据库。
    8. 重启 UniFi 服务:
      service unifi start

    至此 CloudKey 应可继续运行网络应用。如仍有数据库问题,建议升级到 CloudKey Gen2 Plus,以消除此类问题。

  1. MMAPv1 迁移到 WiredTiger

    注意:本节不适用于 32 位架构主机(如 UC-CK G1)。

    当 UniFi 网络恢复运行后,建议迁移到 WiredTiger 存储引擎。

    • 查看空间占用执行:
      du -shc /usr/lib/unifi/data/db/ace* /usr/lib/unifi/data/db/journal/* /usr/lib/unifi/data/db/local* | grep total
    • 查看 MongoDB 版本:
      mongod --version | grep "db version"
    • 查看当前存储引擎类型:
      mongo localhost:27117
      db.serverStatus().storageEngine.name

    迁移步骤

    1. 设置 > 维护 > 备份 中创建本地备份。
    2. 在 Windows 或 macOS 上卸载 UniFi;Debian 系 Linux 下用以下命令彻底删除:
      sudo dpkg -P unifi
    3. 重新安装 UniFi(Windows/macOS);或在 Debian 系 Linux 下用命令:
      cd /tmp/
      wget <下载链接>
      sudo dpkg -i unifi_sysvinit_all.deb
    4. 在 UniFi 向导中,导入步骤 1 的备份完成恢复。