Comment récupérer un cours spécifique d’un backup de Chamilo ?

L’hébergement d’une plateforme Chamilo implique, et c’est dans les bonnes pratiques recommandées, de réaliser des backups afin de pouvoir restaurer son système en cas de problème. Mais parfois, on ne souhaite pas tout restaurer pour la simple raison que seulement une partie a été supprimée tandis que le reste à continué à évoluer. L’exemple typique est la suppression d’un cours par erreur et la réception, au bout de 2 jours, d’une demande de récupération au service technique. Pendant ces 2 jours de latence, les utilisateurs ont continué à utiliser la plateforme et à créer du contenu et il est devenu impossible de restaurer la plateforme comme elle l’était 2 jours auparavant ! Nous aurons dès lors besoin d’une restauration partielle limitée à un cours spécifique. Voici comment faire !

Ci-dessous vous trouverez la procédure pour restaurer le cours dont le code est “coursARestaurer”.

Restauration depuis le backup de cours interne de Chamilo

Il existe deux possibilités. La première est basé sur un backup spécifique du cours réalisé par Chamilo lors de la suppression du cours.

En effet lors de la suppression d’un cours par mesure de sécurité, Chamilo réalise un backup de ce cours en créant un fichier mysql_dump.sql et en copiant l’ensemble du contenu des fichiers du cours dans le dossier app/cache/coursARestaurer/ avec la plus part des requêtes SQL pour la restauration, mais il y a une série de modifications à faire manuellement pour que tout fonctionne correctement. Voici la liste des commandes VIM avec le numéro des lignes par table:

insert into course (id, title, code, directory, course_language, category_code, visibility, show_score, visual_code, disk_quota, subscribe, unsubscribe) values (...);
insert into access_url_rel_course(id, c_id, access_url_id) values (...);

Ensuite (nous ne mettons pas les « : » du prompt pour facilité le copier-coller)

# c_item_property
%s/to_group_id='', to_user_id='', //
%s/session_id='', //
%s/, start_visible='', end_visible=''//
%s/insert_user_id='', //
# c_forum_forum
%s/forum_threads='', //
%s/forum_posts='', //
%s/forum_last_post='', //
%s/start_time='', //
%s/end_time='', //
# c_quiz
%s/, id=''//
# c_lp
%s/publicated_on='', //
%s/expired_on='', //
# c_lp_item
%s/mastery_score='', //
%s/search_did='', // 
%s/prerequisite_min_score='', //
%s/, prerequisite_max_score=''//
# c_lp_view
%s/progress='', //

Finalement il reste à copier le dossier du cours de app/cache/ vers app/courses/, en modifiant les noms (pour retirer le timestamp) et le course sera à nouveau disponible (sans les relations avec les tables globales comme course_rel_user, session_rel_course, etc).

Restauration depuis un backup global de la plateforme

La deuxième option pour restaurer un cours est de partir d’un backup global de la plateforme.

À partir du backup on restaure une base de données (ci-dessous appelée BACKUDBNAME) et les archives de fichiers.

Sur ce backup de base de données, on commence par rechercher l’id de ce cours dans le backup :
select id from course where code = “coursARestaurer”;

On a ainsi l’identifiant du cours (prenons par exemple 10 pour la suite de notre exemple). Il faut maintenant récupérer tous les enregistrements de la base de données qui correspondent à ce cours :

mysqldump -u USER -pPASSWORD BACKUPDBNAME access_url_rel_course c_announcement c_announcement_attachment c_attendance c_attendance_calendar c_attendance_calendar_rel_group c_attendance_result c_attendance_sheet c_attendance_sheet_log c_blog c_blog_attachment c_blog_comment c_blog_post c_blog_rating c_blog_rel_user c_blog_task c_blog_task_rel_user c_calendar_event c_calendar_event_attachment c_calendar_event_repeat c_calendar_event_repeat_not c_chat_connected c_course_description c_course_setting c_document c_dropbox_category c_dropbox_feedback c_dropbox_file c_dropbox_person c_dropbox_post c_forum_attachment c_forum_category c_forum_forum c_forum_mailcue c_forum_notification c_forum_post c_forum_thread c_forum_thread_qualify c_forum_thread_qualify_log c_glossary c_group_category c_group_info c_group_rel_tutor c_group_rel_user c_notebook c_online_connected c_online_link c_permission_group c_permission_task c_permission_user c_resource c_role c_role_group c_role_permissions c_role_user c_student_publication c_student_publication_assignment c_student_publication_comment c_student_publication_rel_document c_student_publication_rel_user c_survey c_survey_answer c_survey_group c_survey_invitation c_survey_question c_survey_question_option c_thematic c_thematic_advance c_thematic_plan c_tool c_tool_intro c_userinfo_content c_userinfo_def c_wiki c_wiki_conf c_wiki_discuss c_wiki_mailcue c_item_property c_link c_link_category c_lp c_lp_category c_lp_item c_lp_item_view c_lp_iv_interaction c_lp_iv_objective c_lp_view c_quiz c_quiz_answer c_quiz_question c_quiz_question_category c_quiz_question_option c_quiz_question_rel_category c_quiz_rel_category c_quiz_rel_question plugin_bbb_meeting session_rel_course course_rel_user course_rel_user_catalogue session_rel_course_rel_user track_e_access track_e_attempt track_e_course_access track_e_downloads track_e_exercises track_e_hotpotatoes track_e_hotspot track_e_lastaccess track_e_links track_e_online track_e_uploads user_rel_course_vote --where='c_id=10' --skip-add-drop-table --no-create-info > 
Bakcupc_id10dump.sql

mysqldump -u USER -pPASSWORD BACKUPDBNAME course --where='id=10' --skip-add-drop-table --no-create-info > coursetableid10dump.sql

mysqldump -u USER -pPASSWORD BACKUPDBNAME course_rel_class gradebook_category --where='course_code = "coursARestaurer"' --skip-add-drop-table --no-create-info > coursecodedump.sql 

mysqldump -u USER -pPASSWORD BACKUPDBNAME usergroup_rel_course track_e_item_property --where='course_id=10' --skip-add-drop-table --no-create-info > course_id10dump.sql 

mysqldump -u USER -pPASSWORD BACKUPDBNAME extra_field_values --where='item_id=10' --skip-add-drop-table --no-create-info > extrafieldvalues.item_id10dump.sql

On a ainsi l’ensemble des données concernant le cours spécifique. Il suffit alors d’appliquer ces dumps sur la base de données en production.

Il faut également restaurer les fichiers correspondants à ce cours, c’est à dire le contenu du dossier app/courses/coursARestaurer/

On retrouve maintenant le cours qui avait été supprimé tel qu’il était dans le backup avant la suppression incluant toutes ses connexions aux autres éléments de Chamilo.

Vous souhaitez booster vos formations et mettre en place une stratégie d’apprentissage utilisant le potentiel qu’offre la plateforme Chamilo ?

Utilisez notre formulaire de contact ou envoyez-nous votre demande à info@beeznest.com