Methode et script pour la purge des tables de monitoring de evtlog et varsetmonitor

Edit me

Suppression du monitoring lié aux varsets evtlog et varsetmonitor

Explication et contexte

Suite à l’acceptation de la Pull Request de Benoit C., les tables si dessous ne seront plus alimentées :

  • varsetmonitor_data_group_mode
  • varsetmonitor_data_group
  • evtlog_data_group
  • evtlog_data_group_mode

Les données existant dans ces tables doivent être vidées. La procédure ci-dessous présente les tests à effectuer avant la suppression, ainsi que les requêtes à lancer pour la purge.

Vérifications

Afin de tester si un truncate est nécessaire, la préconisation de RHE est de ne pas effectuer un count, en raison de la taille potentielle de ces tables. À la place, il vaut mieux effectuer un select null avec une limite d’un résultat :

SELECT null from {pj}_varsetmonitor_data_group_mode limit 1;
SELECT null from {pj}_varsetmonitor_data_group limit 1;
SELECT null from {pj}_evtlog_data_group limit 1;
SELECT null from {pj}_evtlog_data_group_mode limit 1;

Requêtes de purge

truncate {pj}_varsetmonitor_data_group_mode;
truncate {pj}_varsetmonitor_data_group;
truncate {pj}_evtlog_data_group;
truncate {pj}_evtlog_data_group_mode;

Exemple de script de purge

#!/bin/bash

sDoc='\nMZZ - 2018-10-09 :\nSupprime les données du monitoring des tables varsetmonitor et evtlog dans tous les projets d'"'"'une base\n';

usage()
{
        echo $sDoc
        echo "Example : ./purgeMonitor.sh --user=root --host=localhost --password=root --base=sandbox  2>&1 | grep -v '[Warning]'"
        echo ""
        echo -e "--user\tDatabase user"
        echo -e "--password\tDatabase password"
        echo -e "--host\tDatabase host"
        echo -e "--base\tDatabase name"
        echo -e "-i\tInteractive mode"
}

if [ "$1" == "" ]; then
	usage
	exit 1
fi

_INTERACTIVE=0
sUser="root"
sPass=""
sHost="localhost"
sBase=""

# Analyse each parameter. "shift", just before the "done" statement, remove the parameter :
# $2 become $1, $3 become $2, etc. 
while [ "$1" != "" ]; do
        PARAM=`echo $1 | awk -F= '{print $1}'` # Stop reaching the first "="
        VALUE=`echo $1 | sed 's/^[^=]*=//g'` # Keep only after the first "="
        case $PARAM in
                -h | --help | --usage)
                        usage # explain how to use the script
                        exit 1 # Shown as error, to prevent accidental argument "-h" to end the script "correctly" on travis
                        ;;
                -i)
                        _INTERACTIVE=1
                        ;;
                --user)
                        sUser=$VALUE
                        ;;
                --password)
                        sPass=$VALUE
                        ;;
                --host)
                        sHost=$VALUE
                        ;;
                --base)
                        sBase=$VALUE
                        ;;
                *)
                        echo "ERROR: unknown parameter \"$PARAM\""
                        usage # explain how to use the script
                        exit 1
                        ;;
        esac
        shift
done

if [[ $_INTERACTIVE -eq 1 ]]; then
	echo -n 'Host ("localhost" par défaut) : ';
	read -r sHost;
	if [ "$sHost" = '' ]; then
		sHost='localhost';
	fi;

	echo -n 'User ("root" par défaut) : ';
	read -r sUser;
	if [ "$sUser" = '' ]; then
		# sUser='';
		sUser='root';
	fi;

	stty -echo
	read -p "Password (vide par défaut) : " sPass; echo
	stty echo
	if [ "$sPass" = '' ]; then
		# sPass='';
		sPass='';
	fi;
	#export MYSQL_PWD=$sPass;


	while [ "$sBase" = "" ]; do
		echo -n 'Base(s) (Séparées avec des espaces. Pour TOUTES les bases, utilisez le caractère "*") : ';
		read -r sBase;
	done;

fi

if [ "$sBase" = "" ]; then
	echo -e "Use -b option, database name cannot be empty"
	exit 1
fi

if [ "$sPass" != "" ]; then
	sPass="--password="$sPass
fi

echo "test : "$sBase
if [[ "$sBase" == "*" ]]; then
	sQuery='SHOW DATABASES;';
	sBases=$(mysql --host=$sHost --user=$sUser $sPass -se "$sQuery");
	echo "sQuery => mysql --host=$sHost --user=$sUser --password=**** -se \"$sQuery\""
	aBasesTmp=($(echo $sBases))
	aBases=()
	for sValue in "${aBasesTmp[@]}"; do
		if [[ ! "$sValue" =~ ^(information_schema|sys|performance_schema|mysql)$  ]]; then
			aBases+=($sValue)
		fi
	done
else
	aBases=($(echo $sBase))
fi

echo "aBases => $aBases"

for sBase in $aBases; do
	sQuery='show tables;';
	aTables=$(mysql --host=$sHost --user=$sUser $sPass $sBase -se "$sQuery");
	sTtlDbDesc=$sTtlDbDesc""$aTables;
	for sTable in $aTables; do
		if [[ $sTable =~ ^.*(_varsetmonitor_data_group_mode|_varsetmonitor_data_group|_evtlog_data_group|_evtlog_data_group_mode)$ ]]; then
			sQuery='SELECT null from '$sTable' limit 1;';
			sResult=$(mysql --host=$sHost --user=$sUser $sPass $sBase -se "$sQuery");
			if [ "$sResult" = 'NULL' ]; then
				echo "Table $sTable contains data, deleting data..."
				sQuery='truncate '$sTable';';
				sQueryLog='truncate \033[32m'$sTable'\033[0m;';
				echo -e "$sQueryLog"
				sResult=$(mysql --host=$sHost --user=$sUser $sPass $sBase -se "$sQuery");
			fi
			sleep 0.1
		fi
	done;
done;

echo "Fin du script"