Ir al contenido
Otras versiones

Cargando…

Limpieza de los datos antiguos del registro de actividad

Existe una tabla llamada OKM_ACTIVITY donde OpenKM guarda un registro con las acciones realizadas por los usuarios sobre todos los nodos. Esta tabla puede contener fácilmente varios millones de filas, lo que puede afectar al rendimiento de la base de datos. En la práctica, solo debería interesarle el registro de actividad más reciente (por ejemplo, el del último año) y conservar el resto de los datos fuera de la base de datos. Por lo tanto, es una buena práctica realizar algunos procesos de limpieza: exportar los datos más antiguos del registro de actividad y, a continuación, eliminarlos de la base de datos.

Cree un fichero llamado clean_okm_activity.sh en la carpeta /root/:

#!/bin/sh
## BEGIN CONFIG ##
DATABASE_PASS="*secret*"
BACKUP_DIR="/mnt/backup/okm_activity"
## END CONFIG ##
mysqldump -h localhost -u root -p$DATABASE_PASS -w"ACT_DATE < (NOW() - INTERVAL 365 DAY)" --no-create-info okmdb OKM_ACTIVITY > $BACKUP_DIR/okm_activity_$(date +\%Y.\%m.\%d_\%H.\%M.\%S).sql
mysql -h localhost -u root -p$DATABASE_PASS okmdb < /root/delete.sql

Convierta clean_okm_activity.sh en un fichero ejecutable:

Ventana de terminal
$chmod +x clean_okm_activity.sh

Cree un fichero llamado delete.sql en la carpeta /root/:

DELETE FROM OKM_ACTIVITY WHERE ACT_DATE < (NOW() - INTERVAL 365 DAY);
ANALYZE TABLE OKM_ACTIVITY;

Para instalar la tarea de cron, ejecute:

Ventana de terminal
$ sudo mkdir /root/logs
$ sudo crontab -e

Añada las siguientes líneas según su configuración personal:

MAILTO=nomail@openkm.com
@daily /root/clean_okm_activity.sh | tee /root/logs/okm_activity.$(date +\%Y.\%m.\%d_\%H.\%M.\%S).log

Cree un fichero llamado clean_okm_activity.bat en la carpeta c:\backup:

set SQLFILE_DATE=%DATE:~6,4%.%DATE:~3,2%.%DATE:~0,2%
set SQLFILE_TIME=%TIME:~0,2%.%TIME:~3,2%
set SQLFILE=c:\backup\okm_activity-%SQLFILE_DATE%-%SQLFILE_TIME%.sql
set DATABASE_PASS=*secret*
mysqldump -h localhost -u root -p%DATABASE_PASS% -w"ACT_DATE < (NOW() - INTERVAL 365 DAY)" --no-create-info okmdb OKM_ACTIVITY > %SQLFILE%
mysql -h localhost -u root -p%DATABASE_PASS% okmdb < delete.sql

Cree un fichero llamado delete.sql en la carpeta c:\backup:

DELETE FROM OKM_ACTIVITY WHERE ACT_DATE < (NOW() - INTERVAL 365 DAY);
ANALYZE TABLE OKM_ACTIVITY;

Replicación de la base de datos con tablas federadas

Sección titulada «Replicación de la base de datos con tablas federadas»

El procedimiento para utilizar tablas FEDERATED es muy sencillo. Normalmente, tiene dos servidores en funcionamiento, ya sea en el mismo host o en hosts distintos. (Es posible que una tabla FEDERATED utilice otra tabla gestionada por el mismo servidor, aunque tiene poco sentido hacerlo.)

En primer lugar, debe habilitar las tablas federadas en el servidor de producción. Detenga el servicio MySQL de producción y edite el fichero de configuración de MySQL (my.cnf o my.ini, según su sistema operativo). Vaya a la sección [mysqld] y establezca lo siguiente:

Ventana de terminal
[mysqld]
# To enable the federated feature
federated

Inicie su servicio MySQL de producción y, desde su herramienta cliente de MySQL preferida, ejecute el comando:

Ventana de terminal
SHOW CREATE TABLE okm_activity:

Obtendrá algo como:

CREATE TABLE `okm_activity` (
`ACT_ID` bigint(20) NOT NULL AUTO_INCREMENT,
`ACT_ACTION` varchar(127) COLLATE utf8_bin DEFAULT NULL,
`ACT_DATE` datetime DEFAULT NULL, `ACT_IP` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`ACT_ITEM` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`ACT_PARAMS` varchar(4000) COLLATE utf8_bin DEFAULT NULL,
`ACT_PATH` longtext COLLATE utf8_bin,
`ACT_TENANT` bigint(20) DEFAULT NULL,
`ACT_USER` varchar(64) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`ACT_ID`),
KEY `IDX_ACTIVITY_TENANT` (`ACT_TENANT`),
KEY `IDX_ACTIVITY_DATE` (`ACT_DATE`),
KEY `IDX_ACTIVITY_TNTUSRACT` (`ACT_TENANT`,`ACT_USER`,`ACT_ACTION`),
KEY `IDX_ACTIVITY_TNTDATACT` (`ACT_TENANT`,`ACT_DATE`,`ACT_ACTION`)
) ENGINE=innodb DEFAULT CHARSET=utf8 COLLATE=utf8_bin

Cree la tabla “okm_activity” en su servidor MySQL de copia de seguridad.

Cree la tabla federada en su servidor MySQL de producción (tenga en cuenta que hemos cambiado el nombre de la tabla, hemos cambiado ENGINE=innodb por ENGINE=federated y hemos añadido el enlace de conexión):

CREATE TABLE `okm_activity_remote` (
`ACT_ID` bigint(20) NOT NULL AUTO_INCREMENT,
`ACT_ACTION` varchar(127) COLLATE utf8_bin DEFAULT NULL,
`ACT_DATE` datetime DEFAULT NULL, `ACT_IP` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`ACT_ITEM` varchar(64) COLLATE utf8_bin DEFAULT NULL,
`ACT_PARAMS` varchar(4000) COLLATE utf8_bin DEFAULT NULL,
`ACT_PATH` longtext COLLATE utf8_bin,
`ACT_TENANT` bigint(20) DEFAULT NULL,
`ACT_USER` varchar(64) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`ACT_ID`),
KEY `IDX_ACTIVITY_TENANT` (`ACT_TENANT`),
KEY `IDX_ACTIVITY_DATE` (`ACT_DATE`),
KEY `IDX_ACTIVITY_TNTUSRACT` (`ACT_TENANT`,`ACT_USER`,`ACT_ACTION`),
KEY `IDX_ACTIVITY_TNTDATACT` (`ACT_TENANT`,`ACT_DATE`,`ACT_ACTION`)
) ENGINE=FEDERATED DEFAULT CHARSET=utf8 COLLATE=utf8_bin
CONNECTION='mysql://user:poassword@server_b:3306/okmdb/okm_activity';

Por último, puede ejecutar periódicamente un script como este desde su servidor MySQL de producción:

select (NOW() - INTERVAL 1 DAY) into @dump_date;
insert into okm_activity_remote select * from okm_activity where act_date < @dump_date;
delete from okm_activity where act_date < @dump_date;
analyze table okm_activity;