PEA - eliminar (podar) los datos anteriores y ajustar el tamaño de la base de datos de mongo

Resumen


Los lectores aprenderán cómo ajustar el tamaño de MongoDB utilizado UniFi.

UniFi utiliza MongoDB para almacenar información relevante sobre los registros de los usuarios, registros de control, etc.. La base de datos puede llegar a grande tamaños si deja sin marcar, aunque PEA hace auto-poda limitada para propósitos de auditoría.

Hemos proporcionado un script para ayudar a limpiar la base de datos.

Esta es la segunda versión de este script 'prune.js' publicado aquí sobre la Base de conocimiento y se basa en la primera versión con mejoras realmente limpiar todas las colecciones y también mejorar la comprobación de algunos datos que no se deben eliminar (bloqueados los usuarios, por ejemplo, deben permanecer para siempre en la db).

No dude en actualizar a esta nueva si ya está usando esa primera versión.

Secuencia de comandos


La secuencia de comandos para ajustar el tamaño de la base de datos de PEA se pega a continuación (junto con notas de fácil comprensión): 

// 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();


Asegúrese de que el guión es correcto antes de ejecutar el siguiente comando.

mongo --port=27117 < prune.js


De forma predeterminada, esta secuencia de comandos prune.js está en modo de 'dryrun' y le dirá que lo que habría hecho sin realmente hacer nada. Es totalmente seguro ejecutarlo mientras dryrun = true (el valor predeterminado para él).

Una muestra con dryrun desactivado (realmente limpiar la base de datos):

[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]#

Gracias a leonardogyn!