nettoyage de la table user dans la base de donnée

nettoyage de la table user dans la base de donnée

par alain roussel,
Nombre de réponses : 14

bonjour

je me suis appercu que les utilisateurs sont toujours présents dans la table user même apres les avoir supprimé de l'application moodle. Les utilisateurs sont juste marqués en deleted.

Est ce  normal ou est ce que j'ai loupé quelque chose pour bien supprimer ces utilisateurs ?

j'ai ma BDD qui grossie de façon importante et j'ai besoin de la nettoyer. dois je le faire avec PHP my Admin et si oui cela risque t il d'entrainer des problèmes dans le reste des autres tables ?

Y a t il d'autre tables que la table user à nettoyer manuellement (par PHP my admin ) ?

quelqu'un aurait il un petit sript qui automatise ce (ces) nettoyages ?

merci pour votre aide.

A. Roussel

Moyenne des évaluations  -
En réponse à alain roussel

Re: nettoyage de la table user dans la base de donnée

par christian theou,
Bonjour ,

La suppression d'utilisateurs dans Moodle provoque le marquage en deleted , c'est normal.
En supprimant ces lignes de la table User vous prenez quelques risques pour la cohérence de votre base: un de ces utilisateurs peut avoir participé à des forums , etc, etc ...
A ma connaissance , il n'y a pas de mécanisme d'intégrité référentielle dans la base Moodle et pas de script de nettoyage qui prendrait en compte tous les cas de figures possibles.

Cordialement
Moyenne des évaluations Utile (1)
En réponse à christian theou

Re: nettoyage de la table user dans la base de donnée

par alain roussel,

Merci pour ces précisions.

Toutefois je me posais la question des actions à mener pour les sites ou le nombre d'utilisateurs devient important.

En effet sur mon site je suis à environs 1000 étudiants par an, il tourne depuis 4 ans ce qui me fait une table user qui grossie de façon importante.

Etant en plus sur un serveur mutualisé, j'ai ma BDD qui occupe actuellement 65% de mon quota alloué. je vais avoir pas loin de 1000 nouveaux étudiants qui vont s'inscrire dans les prochains jours et je voulais faire un peu de place.

parmi vous y a t il des administrateurs qui gèrent des sites avec beaucoup d'utilisateurs ? comment procédez vous ? laissez vous la BDD gonfler sans limite?

merci

A. Roussel

En réponse à alain roussel

Re: nettoyage de la table user dans la base de donnée

par christian theou,
Bonjour,
Il n'y a pas que dans la communauté française que l'on se pose ce genre de question.Et on ne peut pas dire que la solution proposée par Colin Fraser soit d'une simplicité extrême dans sa mise en oeuvre.

http://moodle.org/mod/forum/discuss.php?d=134074#p586110

A suivre sans doute ....

Cordialement
En réponse à christian theou

Re: nettoyage de la table user dans la base de donnée

par Valery Fremaux,

Il faut savoir que le nombre d'utilisateurs dans la table mdl_user n'est pas la plus grande source de charge dans la base de données.

L'une des sources les plus importantes est la croissance des tables message, message_read, forum_posts, forum_discussions, et éventuellement chat_message si les discussions en ligne sont très utilisées.

Mais surtout ce sont les tables mdl_log et mdl_mnet_log (dans le cas de l'utilisation du réseau MNET) qui croissent énormément.

Une bonne stratégie est de récupérer ces logs (dumper la table par exemple) si vous voulez les conserver, et nettoyer cette table en ne gardant que un à deux mois de traces.

Il est aussi possible après avoir supprimé des utilisateurs, d'exécuter la requete de nettoyage suivante :

Table mdl_log :

DELETE mdl_log WHERE userid IN (SELECT id FROM mdl_user WHERE deleted = 1)

Table des messages (message et message_read) :

DELETE mdl_message WHERE useridfrom IN (SELECT id FROM mdl_user WHERE deleted = 1) OR useridto IN (SELECT id FROM mdl_user WHERE deleted = 1)

Ces deux commandes SQL nettoyent correctement les messages et les traces de ces utilisateurs mais vous perdez évidemment ces traces.

Ces commandes de nettoyage peuvent être généralement construites pour d'autres tables, dès qu'un champ (souvent, "userid", ou "studentid" ou "teacherid" apparaît).

Il faut être bien sûr de ne pas voir réapparaître cette personne dans le futur...

Ces commandes peuvent être exécutées copiées telles que sur une installation standard via la console SQL de PhpMyAdmin.

Cheers.

Moyenne des évaluations Utile (3)
En réponse à Valery Fremaux

Re: nettoyage de la table user dans la base de donnée

par Valery Fremaux,

Plus généralement, vous posez ici le problème de la destruction de données dans un modèle de données complexe, relationnel et modulaire.

L'une des seules solutions à ce problème architecturalement, serait que chaque plugin fasse son propre nettoyage, ou que le noyau puisse demander à chaque plugin quelles sont les tables disposant d'une référence à un utilisateur et fournir le champ de cette référence (des requêtes comme ci-dessus peuvent alors être construites de manière systématique).

Le GROS problème est que cette pratique demanderait que TOUS les plugins la suive, y compris les contributifs, et que cette réponse soit CORRECTEMENT implémentée par tous les contributeurs de Moode.

Vous parlez d'un chantier.... clin d’œil

Autres problèmes du même type :

- Impossible de supprimer totalement des enregistrements d'hôtes MNET contactés une fois.

- Impossible de supprimer des comptes utilisateurs importés via une communication MNET. 

A bientôt...

Moyenne des évaluations Utile (2)
En réponse à Valery Fremaux

Re: nettoyage de la table user dans la base de donnée

par christian theou,
Merci Valery d'avoir pris le temps de répondre de façon si bien détaillée.
Personnellement, j'avais très bien compris que la vraie problématique était celle que tu décris dans ce dernier post.

Cordialement
En réponse à christian theou

Re: nettoyage de la table user dans la base de donnée

par Pascal Maury,
Avatar Développeurs de plugins

Bonjour,

Il est vrai que cela n'est pas simple. Mais il serait bien d'avoir un script de nettoyage des comptes supprimés qui n'aurait plus aucun lien avec les données.

J'ai plus de 2000 comptes supprimés. Je pense que pour la majorité d'entre eux, il n'y a plus de messages qui leur sont rattachés par exemple, ni aucune autre données. Je vais essayer d'écrire un script qui vérifie dans chaque table si l'id de ces users apparait.

Voilà la liste des tables (Moodle 1.9 !) contenant un champ userid : (nb : j'ai installé quelques plugins, notamment forumNG et nanogong)

assignment_submissions
block_rss_client
chat_messages
choice_answers
course_display
data_comments
data_ratings
data_records
enrol_authorize
enrol_paypal
event
events_queue
forumng_drafts
forumng_flags
forumng_posts        (il y a aussi 2 autres champs : deleteuserid, edituserid)
forumng_ratings
forumng_read
forumng_subscriptions
forum_discussions
forum_posts
forum_queue
forum_ratings
forum_read
forum_subscriptions
forum_track_prefs
glossary_comments
glossary_entries
glossary_ratings
grade_grades
grade_grades_history
grade_import_values
groups_members
hotpot_attempts
lesson_attempts
lesson_branch
lesson_grades
lesson_high_scores
lesson_timer
log
message_contacts
mnet_enrol_assignments
mnet_log
mnet_session
nanogong_message
post
quiz_attempts
quiz_grades
quiz_question_versions
role_assignments
role_sortorder
scale
scale_history
scorm_scoes_track
stats_user_daily
stats_user_monthly
stats_user_weekly
survey_analysis
survey_answers
tag
user_info_data
user_lastaccess
user_preferences
user_private_key
webdav_locks
wiki_entries
wiki_pages
workshop_assessments
workshop_comments
workshop_submissions

En réponse à Pascal Maury

Re: nettoyage de la table user dans la base de donnée

par Pascal Maury,
Avatar Développeurs de plugins

Sur mes 2780 utilisateurs supprimés :
- 133 n'ont aucune données dans le système (attention : je n'ai cherché que dans les tables ci-dessus avec les champs userid, il n'y en a peut etre d'autres !)
- 304 n'ont des données que dans des tables de "statistiques" : "log", "stats_user_daily", "stats_user_monthly", "stats_user_weekly"
- 1079 n'ont des données que dans des tables de "statistiques" ou dans des tables de "préférences" : "user_preferences", "course_display"
- 2416 n'ont des données que dans des tables de "statistiques", de préférences ou dans des tables de quizz et de notes : "grade_grades", "grade_grades_history", "quiz_attempts", "quiz_grades"

Vu que je migre de 1.9 à 2.2, je pense supprimer définitivement les utilisateurs supprimés qui n'ont des données que dans les tables de "statistiques" et de préférences (je supprime évidemment avec les données relatives dans ces tables). Qu'en pensez-vous ?

Les données stockées dans les tables "grade_grades", "grade_grades_history", "quiz_attempts", "quiz_grades" sont-elles nécessaires à l'intégrité de la base ?
Bien sur je comprends que l'enseignant va perdre les notes de cet étudiant si je supprime ces notes mais si cela se limite à cela, ca ne me pose aucun problème car je garde en archive une copie de ma plate-forme 1.9. (par exemple supprimer le contenu de la table log ne pose aucun problème d'intégrité d'après ce que j'ai lu et d'après ce que j'ai observé)

De manière générale, pour la migration, quelles tables puis-je remettre à zéro ? (par exemple, je vais vider les tables log, stats_user_daily; stats_user_monthly, stats_user_weekly)

Je mets le script en PJ. Il ne fait que lister les utilisateurs supprimés et les tables dans lesquelles il y a des données rattachées à cet utilisateur. Je vais écrire celui qui supprime les utilisateurs supprimés et leurs données.

Pour info, dans ma base de production, il reste des données des utilisateurs supprimés dans les tables suivantes :

Table assignment_submissions : 418 lignes.
Table chat_messages : 602 lignes.
Table choice_answers : 3 lignes.
Table course_display : 6110 lignes.
Table event : 11 lignes.
Table forum_discussions : 190 lignes.
Table forum_posts : 353 lignes.
Table grade_grades : 5358 lignes.
Table grade_grades_history : 123973 lignes.
Table hotpot_attempts : 10 lignes.
Table log : 3868 lignes.
Table message_contacts : 345 lignes.
Table quiz_attempts : 10390 lignes.
Table quiz_grades : 5455 lignes.
Table stats_user_daily : 10 lignes.
Table stats_user_monthly : 21133 lignes.
Table stats_user_weekly : 42 lignes.
Table tag : 107 lignes.
Table user_lastaccess : 63 lignes.
Table user_preferences : 2292 lignes.
Table wiki_pages : 100 lignes.

Si vous avez des informations sur ces tables qui pourraient être utiles ici, n'hésitez pas !

Pascal

En réponse à Pascal Maury

Re: nettoyage de la table user dans la base de donnée

par Patrick Lemaire,
Avatar Développeurs de plugins Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

Salut Pascal,

Tu déterres les topic de 2009 maintenant ?

Sinon, plus sérieusement, cette problématique est récurrente. Elle a fait l'objet de présentations dans les Moodle-Moot auxquels j'ai pu assisté. La philosophie était jusque là de conserver ces utilisateurs fantômes car il ne représentent pas un "poids" pour le serveur.

Si tous les modules/blocks étaient bien programmés, il devrait y avoir une fonction de suppression des artéfacts liés à l'utilisateur. Or il n'en est rien. Et pire que de conserver un utilisateur disparu, c'est de gérer des objets qui n'appartiennent à personne. Je crois même qu'une solution présentée lors d'une conf était de remplacer ces usagers par un "nobody" pour ne pas plomber un fil de discussion par-ci par-là.

Bref, vaste sujet et grand chantier de nettoyage auquel tu t'attelles ici. Ton expérience m'intéresse.

Bon courage.
Patrick

En réponse à Patrick Lemaire

Re: nettoyage de la table user dans la base de donnée

par Christiane Mathy,

Bonjour,

Cette problématique me turlupine également depuis au moins un an, la solution la plus simple ne serait-elle pas d'encourager vivement les enseignants et concepteurs de cours à utiliser, en début de chaque année académique, l'outil de réinitialisation de cours?

Si je ne me trompe, cet outil nettoie correctement tous les modules cochés par l'enseignant... Il conserve les utilisateurs, mais permet de supprimer une bonne partie de leurs interventions, dans bon nombre de modules d'activité. Mais peut-être que je me berce de douces illusions! Prévenez-moi si c'est le cas...

En réponse à Christiane Mathy

Re: nettoyage de la table user dans la base de donnée

par Pascal Maury,
Avatar Développeurs de plugins

Je suis tombé sur le sujet via Google !

Avec les années qui avancent, ils commencent à représenter du monde chez moi : 8500 compte dont 4400 ne sont liés qu'à des données sans intérêt. Je vais profiter de ma migration pour les supprimer.

Certes les modules ne font pas forcément un bon nettoyage, mais s'il n'y a pas de lien entre le module et l'utilisateur, je ne pense pas risquer grand chose. Et dans tous les cas, je me cantonne à ce que j'ai dit plus haut : je ne touche pas aux utilisateurs ayant des données dans les tables que je ne "maitrise" pas.

En l'occurence, je teste ma 2e migration, mais je vais surement garder cette procédure pour la migration finale.

L'outil de réinitialisation de cours est surement perfectible. Et comme vous le dites : il nettoie ce que coche l'enseignant. Donc si un enseignant laisse une donnée utilisateur, il faut que ce dernier existe dans la table user sinon ca casse l'intégrité ...

A mon sens, dans l'idéal, il faudrait repartir sur un site fraichement installé chaque année, en ayant réimporté les cours proprement dit, sans les données utilisateurs. Mais la demande est souvent plus complexe.

J'espère que Moodle 2 offre de meilleurs solutions de maintenance de cohérence ...

Pascal

En réponse à Pascal Maury

Re: nettoyage de la table user dans la base de donnée

par Patrick Lemaire,
Avatar Développeurs de plugins Avatar Documentation writers Avatar Moodleurs particulièrement utiles Avatar Testeurs Avatar Traducteurs

Pour te donner un ordre d'idée, chez nous, il y a 68 781 comptes dans moodle_users dont 28 775 sont marqués "deleted".

Il faut dire que je fais porter à la plateforme institutionnelle la charge de nos primo-arrivants, non reconnus par le système d'information assez tôt, et que chaque année, c'est plus de 2000 comptes qui vivront 1 mois, au mieux.
Hé bein, même pas peur !

Sinon pour revenir à l'idée de la fonction réinitialisation, c'est le même problème pour les modules "fait dans mon garage" : si le module non-standard ne possède pas de fonction "reinit", ça ne marchera pas.

Patrick

En réponse à Pascal Maury

Re: nettoyage de la table user dans la base de donnée

par Christiane Mathy,

"A mon sens, dans l'idéal, il faudrait repartir sur un site fraichement installé chaque année, en ayant réimporté les cours proprement dit, sans les données utilisateurs. "

Je suis en plein dans cette démarche actuellement: nous passons de Moodle 1.9.7 à 2.2, et nous avons choisi de transférer tous les cours "un par un", afin de repartir avec une base de données "bien propre".

Cependant, l'idée de le refaire chaque année me décourage à l'avance! Existe-t-il une procédure automatisée pour transférer les cours (sans données utilisateurs)?

Merci de vos réponses...

En réponse à Christiane Mathy

Re: nettoyage de la table user dans la base de donnée

par François MOTTARD,

Bonjour Christiane. Je partage ton avis en ce qui concerne le transfert de cours, cependant n'est-il pas possible de responsabiliser les utilisateurs (professeurs) en leur demandant d'assurer eux-même la sauvegarde et la restauration de leurs cours? Cela ne devrait pas poser trop de problèmes si on actualise annuellement (pendant les grandes vacances) sa version de Moodle. C'est surtout lorsque l'on doit"sauter" de plusieurs mise à jour à la fois que cela pose habituellement problème. A nous d'assurer alors la mise en place d'une formation par rapport à ces comportements. Un backup général de l'ensemble des cours étant quand même assuré par les administrateurs au cas ou.