info_i_25x25.png See important information about Ubiquiti Devices and KRACK Vulnerability in this article. We will update this document as more information becomes available.

UniFi - dados antigos de remover (ameixa) e ajustar o tamanho do banco de dados de mongo

Visão geral


Os leitores vão aprender a ajustar o tamanho do MongoDB usado por UniFi.

UniFi usa MongoDB para armazenar informações relevantes sobre o usuário faz logon, registros do controlador, etc. O banco de dados pode atingir grande tamanhos se não for controlada, embora UniFi faz auto-poda limitada para fins de auditoria.

Fornecemos um script para ajudar a limpar o banco de dados.

Esta é a segunda versão deste script de 'prune.js' publicado aqui sobre a Base de conhecimento e baseia-se na primeira versão com melhorias para limpar todas as coleções e também melhorar a verificação de alguns dados que não devem ser excluídos (bloqueado os usuários, por exemplo, deve ficar para sempre na db).

Por favor, sinta-se livre para atualizar para esta nova invenção se você já está usando essa versão primeiro.

Roteiro


O script para ajustar o tamanho do banco de dados de UniFi é colado abaixo (juntamente com notas de fácil entendimento): 

// keep N-day worth of data
days=30;

// change to false to have the script to really exclude old records
// from the database. While true, no change at all will be made to the DB
dryrun=true;

use ace;
// db = connect("127.0.0.1:27117/ace");

collectionNames = db.getCollectionNames();
for (i=0; i<collectionNames.length; i++) {
        name = collectionNames[i];
        query = null;

        if (name.indexOf('stat')==0 || name.indexOf('event')==0 || name.indexOf('alarm')==0) {
                query = {time: {$lt:new Date().getTime()-days*86400*1000}};
        }

        if (name.indexOf('stat_life')==0 || name.indexOf('rogue')==0 || name.indexOf('cache_login')==0) {
                query = {last_seen: { $lt:(new Date().getTime()/1000)-days*86400}};
        }

        if (name.indexOf('session')==0) {
                query = {assoc_time: { $lt:(new Date().getTime()/1000)-days*86400}};
        }

        // removes vouchers expired more than '$days' ago
        // active and unused vouchers are NOT touched
        if (name.indexOf('voucher')==0) {
                query = {end_time: { $lt:(new Date().getTime()/1000)-(days*86400)}};
        }

        if (name.indexOf('guest')==0) {
                query = {end: { $lt:(new Date().getTime()/1000)-days*86400}};
        }

        if (name.indexOf('cache_stat')==0) {
                query = {timestamp: { $lt:(new Date().getTime()/1000)-days*86400}};
        }

        // if an user was only seen ONCE, $last_seen will not be defined
        // so, if $last_seen not defined, lets use $first_seen instead
        // also check if $blocked is set. If true, do NOT purge the entry
        // no matter how old it is. We want blocked users to continue blocked
        if (name.indexOf('user')==0) {
                query = { blocked: { $ne: true}, $or: [
                             {last_seen: { $lt:(new Date().getTime()/1000)-days*86400}},
                             {last_seen: { $exists: false }, first_seen: { $lt:(new Date().getTime()/1000)-days*86400}}
                               ]
                        };
        }

        if (query) {
                count1 = db.getCollection(name).count();
                count2 = db.getCollection(name).find(query).count();
                print((dryrun ? "[dryrun] " : "") + "pruning " + count2 + " entries (total " + count1 + ") from " + name + "... ");
                if (!dryrun)
                        db.getCollection(name).remove(query);
        }
}

if (!dryrun) db.repairDatabase();


Certifique-se de que o script está correto antes de executar o próximo comando.

mongo --port=27117 < prune.js


Por padrão, esse script de prune.js está no modo 'dryrun' e lhe dirá o que teria feito sem realmente fazendo alguma coisa. É completamente seguro para executá-lo enquanto dryrun = true (o valor padrão para isso).

Uma amostra com dryrun desabilitado (mesmo limpeza de banco de dados):

[root@correio api]# mongo --port 27117 < prune.js
MongoDB shell version: 2.6.3
connecting to: 127.0.0.1:27117/test
30
false
switched to db ace
[
        "admin",
        "alarm",
        "alarmdef",
        "cache_device",
        "cache_login",
        "cache_scan",
        "cache_sta",
        "cache_stat",
        "device",
        "event",
        "guest",
        "map",
        "map.chunks",
        "map.files",
        "payment",
        "privilege",
        "rogue",
        "session",
        "setting",
        "site",
        "stat_current",
        "stat_daily",
        "stat_hourly",
        "stat_life",
        "stat_minute",
        "stat_monthly",
        "system.indexes",
        "task",
        "user",
        "usergroup",
        "verification",
        "voucher",
        "wlanconf",
        "wlangroup"
]
pruning 0 entries (total 222) from alarm...
pruning 0 entries (total 6) from alarmdef...
pruning 2 entries (total 144) from cache_login...
pruning 0 entries (total 51) from cache_stat...
pruning 67 entries (total 19779) from event...
pruning 30 entries (total 2519) from guest...
pruning 80 entries (total 4090) from rogue...
pruning 310 entries (total 16084) from session...
pruning 0 entries (total 29) from stat_current...
pruning 0 entries (total 639) from stat_daily...
pruning 252 entries (total 14969) from stat_hourly...
pruning 21 entries (total 2780) from stat_life...
pruning 0 entries (total 0) from stat_minute...
pruning 0 entries (total 0) from stat_monthly...
pruning 23 entries (total 2633) from user...
pruning 0 entries (total 5) from usergroup...
pruning 48 entries (total 8664) from voucher...
null
{ "ok" : 1 }
bye
[root@correio api]#

Graças a leonardogyn!