UniFi - 修复 UniFi Controller 数据库


概述


阅读完本文后,读者应该对如何在 UniFi 控制器软件上如何定位数据库问题有一个粗略的了解。

注意事项和要求: 本文包含需要使用 PuTTY 等 SSH 客户端或本机 Linux/macOS 终端等的说明。

目录


  1. 介绍和症状
  2. 如何在 Cloud Key 上修复数据库
  3. 如何在基于 Debian 的 Linux 上修复数据库
  4. 如何在 macOS 上的数据库
  5. 如何在 Windows 上修复数据库
  6. 如何从 MMAPv1 迁移到 WiredTiger
  7. 相关文章

介绍和症状


回到顶部

症状:

  • 统计数据未在数据保留期内报告。通常,统计数据仅记录几天,然后中断或者断断续续。
  • 无法进行包含统计信息的备份(7 天,30 天等)。
  • 如果仅配置备份无法完成,则可能是 ace 数据库中的损坏或其他不相关的内容。
  • 加载 UniFi 控制器 GUI 时收到错误 400。
  • 由于数据库错误,控制器服务无法启动。
用户提示:在 UC-CK 上,总数据无需超过 2GB,只需要足够大 Mongo 就可以扩展。在不受 MongoDB 限制影响的 64 位机器上,主机上的总体空间问题也可能导致修复数据库时出现问题。使用df -h在 SSH 会话中检查一下,看看 UniFi 存储数据的分区是否空间不足。

 

32 位 MongoDB 限制

32 位 MongoDB 集合的总大小限制为 2GB。在运行 MMAPv1 存储引擎时,如果试图缩小聚合集合大小可能会导致问题。在 MongoDB 上运行压缩命令时,将重写数据库并进行碎片整理而不进行纠错。当存储引擎是 MMAPv1 时,此过程不会将可用的磁盘空间返回给控制器主机。

要在 32 位 MongoDB 实例上获取有价值的磁盘空间需要对数据库进行修复。对于怀疑无效条目、损坏或集合缩放问题的用户,可能需要进行此修复。要运行数据库修复,云密钥必须有足够的空闲磁盘空间,等于当前数据集的大小加上 2g。如果数据集已经变得太大,无法继续使用 db.repairDatabase() 命令,下面有一些说明可以解决这个问题。

注: UniFi 的  Cloud Key(UC-CK) 有以下几点要求
  • 32 位架构
  • MMAPv1
  • MongoDB 版本 2.4.10

如何在 Cloud Key 上修复数据库


回到顶部

1.下载 mongo 修剪脚本。如上所述,该脚本仅保留过去 7 天的条目。它不会删除 UniFi 管理所需的条目。通过运行以下命令来执行此操作:

2.停止 UniFi 服务

service unifi stop

3. UniFi 服务将关闭 mongo 进程。确保 UniFi 服务已完全关闭。修复数据库以压缩数据条目并释放查询条件中包含的未使用磁盘空间的字段。

mongod --dbpath /usr/lib/unifi/data/db --smallfiles --logpath /usr/lib/unifi/logs/server.log --repair
注意:如果需要回调数据库以节省磁盘空间,步骤 4-7 是可选的。

4.使用以下命令重新启动 mongo:

mongod --dbpath /usr/lib/unifi/data/db --smallfiles --logpath /usr/lib/unifi/logs/server.log --journal --fork
注意:您的 mongo 数据库中可能没有启用日志记录。如果是,那么删除上面命令中的 --journal 选项。

5.执行脚本以修剪 stat 导致问题的集合:

mongo < /tmp/CK_repair.js

6.使用以下命令关闭 mongo 服务器:

注意: CK_repair.js 脚本中的最后一个命令是 “db.repairDatabase()”。如果在 mongo 服务器运行时 stats 集合已经变得太大而无法修复,则可能会导致错误。如果您在运行脚本时看到这样一个错误,那么您将需要通过运行步骤 3 中的命令再次通过命令行修复数据库。

7.最后,重启 UniFi 服务:

service unifi start

Cloud Key 现在应当能够运行 Controller。如果您仍有数据库问题,请 联系Ubiquiti支持 。 


如何在基于 Debian 的 Linux 上修复数据库


回到顶部

1.停止 UniFi 服务

service unifi stop

2.使用以下命令修复数据库:

mongod --dbpath /usr/lib/unifi/data/db --smallfiles --logpath /usr/lib/unifi/logs/server.log --repair

3.最后,重启 UniFi 服务:

注意:如果以 root 用户身份执行此过程,则文件所有者可能已经更改。可以通过以下命令修改:
chown -R unifi:unifi /usr/lib/unifi/data/db/
chown -R unifi:unifi /usr/lib/unifi/logs/server.log

如果您仍有疑似数据库问题,请 联系 Ubiquiti 支持


如何在 macOS 上修复数据库


回到顶部

1.工作目录:创建临时工作目录。出于修复目的,我们将调用此目录并进行修复。在终端输入:

mkdir ~/repair

2.下载 MongoDB:macOS UniFi 安装程序不包含 mongo 二进制文件。访问 MongoDB 官方下载网站 ,下载与您服务器的 CPU 架构相对应的 .tgz 版本。您也可以直接在这里下载 2.4.14: 2.4.14.tgz

 

3.提取 Mongo:将下载的包移动到您的工作目录,然后双击它或使用您选择的应用程序将其解压缩。

4.将 Mongo 移动到工作目录:找到 bin/mongo 二进制文件,并将其复制到工作目录。此时,可以删除下载的 .tgz 包和任何额外提取的文件,因为我们只需要 mongo 二进制文件。

5.终端和命令:打开终端并移动到您的工作目录

cd ~/repair

6.关闭/停止 UniFi。

7.修复 Mongo 数据库:

mongod --dbpath ~/Library/Application\ Support/UniFi/data/db --smallfiles --logpath ~/Library/Application\ Support/UniFi/logs/server.log --repair

8.从 Finder 打开 UniFi 应用程序:

open -n /Applications/UniFi.app

如果您仍有疑似数据库问题,请 联系 Ubiquiti 支持 。 


如何在 Windows 上修复数据库


回到顶部

1.下载 MongoDB:  Windows UniFi 安装程序不包含 mongo 二进制文件。访问 MongoDB 官方下载网站 ,下载与您的服务器 CPU 架构相对应的 .zip 版本。您也可以直接在这里下载 2.4.14:2.4.14.zip

2.解压缩 Mongod.exe

将 \bin\mongod.exe 解压缩到您选择的工作目录。在此示例中,我们将使用 C:\repair\ 您可以忽略 .zip 中包含的所有其他文件。

3.关闭/停止 UniFi

4.打开命令提示符:  按 WINDOWS + R 打开命令提示符。在弹出窗口中,键入 cmd,然后按 Enter。

5.输入工作目录

cd C:\repair\

6.关闭/停止 UniFi。

7.修复 Mongo 数据库 

mongod.exe --dbpath %userprofile%/"Ubiquiti UniFi"/data/db --smallfiles --logpath %userprofile%/"Ubiquiti UniFi"/logs/server.log --repair

8.打开 UniFi 应用程序

如果您仍有疑似数据库问题,请 联系 Ubiquiti 支持 。 


如何从 MMAPv1 迁移到 WiredTiger


回到顶部

注意:本节不适用于包括 UC-CK G1 在内的 32 位架构主机。

在控制器再次起作用之后,用户可能希望将 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

如何迁移到 WiredTiger

1. 使用所需的保留设置在 “设置”>“维护”>“ 备份”下创建备份  

2.从 Windows 或 macOS 卸载 UniFi。使用以下命令从基于 Debian 的 Linux 清除 UniFi:

sudo dpkg -P unifi

3.在 Windows 或 macOS 上重新安装 UniFi。使用以下命令在基于 Debian 的 Linux 上重新安装 UniFi:

cd /tmp/
wget <下载链接>
sudo dpkg -i unifi_sysvinit_all.deb

4.在 UniFi 设置向导中,从步骤 1 恢复备份。


相关文章


回到顶部

UniFi - 如何删除(修剪)旧数据和调整 Mongo 数据库大小

UniFi - 对离线 Cloud Key 和其他稳定性问题进行故障排除