Manuel:Importer les dumps XML

This page is a translated version of the page Manual:Importing XML dumps and the translation is 100% complete.

Cette page décrit les méthodes permettant d'importer les dumps XML. Les vidages (dumps) XML contiennent le contenu d'un wiki (les pages du wiki avec toutes leurs révisions), sans les données liées au site. Un vidage XML ne crée pas une sauvegarde complète de la base de données du wiki, il ne contient pas les comptes des utilisateurs, ni les images, ni les journaux des modifications, etc.

La page Special:Export de tout site MediaWiki, y compris l'ensemble des sites Wikimedia et Wikipedia, crée un fichier XML (le vidage du contenu). Voir meta:Data dumps et Manuel:DumpBackup.php . Les fichiers XML sont davantage expliqués sur Aide:Export.

Comment importer ?

Il existe plusieurs méthodes pour importer les dumps XML.

Importer des dumps XML très longs (tels que la Wikipedia anglophone)

Guide pour importer le fichier XML de la Wikipedia anglophone

L'importation des fichiers Wikipedia en anglais peut être une tâche complexe, mais avec la bonne approche, elle peut être réalisée de manière fiable. Ce guide présente le processus d'utilisation du script importDump.php qui se trouve dans le répertoire maintenance de votre installation MediaWiki.

Préparer votre environnement

Avant de commencer le processus d'importation assurez-vous que votre serveur satisfait les conditions requises, y compris l'espace disque suffisant ainsi que les ressources système.

Obtenir le vidage XML de la Wikipedia

Le dépôt XML Wikipédia en anglais peut être téléchargé depuis le site web de la Fondation Wikimedia. Au moment d'écrire ces lignes, la taille du fichier est d'environ 91 Go.

Importer un vidage XML

Il existe plusieurs méthodes pour importer un vidage XML dans votre installation MediaWiki :

  • L'importation directe : vous pouvez utiliser le script importDump.php fourni dans le dossier de maintenance. Cette méthode est fiable mais peut être très exigeante en ressources.
  • L'import de fichiers individuels : Alternativement, vous pouvez télécharger et importer chaque fichier XML multipartie individuellement. Cette approche permet plus de souplesse dans les importations, mais elle nécessite des efforts supplémentaires.

Gérer les erreurs d'import

L'importation d'un fichier aussi grand peut entraîner des erreurs et aller jusqu'à l'interruption du processus. Pour atténuer cela, envisagez de configurer des tâches de cron pour importer le dump XML en plusieurs petits lots au fil du temps. Cette approche assure un traitement plus fluide et réduit le risque de défaillance.

Exemple simple de Cron au calendrier

Notes :

  1. Les fichiers wiki sont supposés être situés dans le dossier principal du serveur Web, généralement /var/www/html/.
  2. Le fichier de vidage XML est également supposé être situé dans le même répertoire.
  3. Cette tâche cron est exécutée par l'utilisateur root, et les fichiers journaux sont créés dans le dossier /root/wikilogs.
  4. Remplacer {your-server} par l'URL de votre serveur dans l'argument --server.
  5. Ce calendrier est activé toutes les 10 minutes, ce qui permet d'exécuter différentes sections d'importation à des heures différentes.

Veuillez apporter des modifications pour spécifier vos propres dossiers ou créer tout dossier que vous souhaiteriez utiliser.

*/15 4 * * * /root/wikilogs/10-cronjob.sh > ~/wikilogs/import-$(date +\%Y\%m\%d_\%H\%M\%S)-cron.log 2>&1
*/15 5 * * * /root/wikilogs/10-cronjob.sh > ~/wikilogs/import-$(date +\%Y\%m\%d_\%H\%M\%S)-cron.log 2>&1
*/15 6 * * * /root/wikilogs/10-cronjob.sh > ~/wikilogs/import-$(date +\%Y\%m\%d_\%H\%M\%S)-cron.log 2>&1
*/15 7 * * * /root/wikilogs/10-cronjob.sh > ~/wikilogs/import-$(date +\%Y\%m\%d_\%H\%M\%S)-cron.log 2>&1
*/15 8 * * * /root/wikilogs/10-cronjob.sh > ~/wikilogs/import-$(date +\%Y\%m\%d_\%H\%M\%S)-cron.log 2>&1
*/15 9 * * * /root/wikilogs/10-cronjob.sh > ~/wikilogs/import-$(date +\%Y\%m\%d_\%H\%M\%S)-cron.log 2>&1
*/15 10 * * * /root/wikilogs/10-cronjob.sh > ~/wikilogs/import-$(date +\%Y\%m\%d_\%H\%M\%S)-cron.log 2>&1
*/15 11 * * * /root/wikilogs/10-cronjob.sh > ~/wikilogs/import-$(date +\%Y\%m\%d_\%H\%M\%S)-cron.log 2>&1
*/15 12 * * * /root/wikilogs/10-cronjob.sh > ~/wikilogs/import-$(date +\%Y\%m\%d_\%H\%M\%S)-cron.log 2>&1
*/15 13 * * * /root/wikilogs/10-cronjob.sh > ~/wikilogs/import-$(date +\%Y\%m\%d_\%H\%M\%S)-cron.log 2>&1
*/15 14 * * * /root/wikilogs/10-cronjob.sh > ~/wikilogs/import-$(date +\%Y\%m\%d_\%H\%M\%S)-cron.log 2>&1
*/15 15 * * * /root/wikilogs/10-cronjob.sh > ~/wikilogs/import-$(date +\%Y\%m\%d_\%H\%M\%S)-cron.log 2>&1
*/15 16 * * * /root/wikilogs/10-cronjob.sh > ~/wikilogs/import-$(date +\%Y\%m\%d_\%H\%M\%S)-cron.log 2>&1
*/15 17 * * * /root/wikilogs/10-cronjob.sh > ~/wikilogs/import-$(date +\%Y\%m\%d_\%H\%M\%S)-cron.log 2>&1
*/15 18 * * * /root/wikilogs/10-cronjob.sh > ~/wikilogs/import-$(date +\%Y\%m\%d_\%H\%M\%S)-cron.log 2>&1
*/15 19 * * * /root/wikilogs/10-cronjob.sh > ~/wikilogs/import-$(date +\%Y\%m\%d_\%H\%M\%S)-cron.log 2>&1
*/15 20 * * * /root/wikilogs/10-cronjob.sh > ~/wikilogs/import-$(date +\%Y\%m\%d_\%H\%M\%S)-cron.log 2>&1
*/15 21 * * * /root/wikilogs/10-cronjob.sh > ~/wikilogs/import-$(date +\%Y\%m\%d_\%H\%M\%S)-cron.log 2>&1
*/15 22 * * * /root/wikilogs/10-cronjob.sh > ~/wikilogs/import-$(date +\%Y\%m\%d_\%H\%M\%S)-cron.log 2>&1
0 0 * * * /var/www/html/maintenance/run updateArticleCount.php --use-master --globals --memory-limit default --profiler json --update > ~/wikilogs/articleCount-`date +\%Y\%m\%d\%H\%M\%S`-cron.log 2>&1
30 1 * * * /var/www/html/maintenance/run update --quick > ~/wikilogs/update-`date +\%Y\%m\%d\%H\%M\%S`-cron.log 2>&1
30 2 * * * /var/www/html/maintenance/run rebuildrecentchanges.php --globals --memory-limit default --profiler json > ~/wikilogs/recentChanges-`date +\%Y\%m\%d\%H\%M\%S`-cron.log 2>&1
30 3 * * * /var/www/html/maintenance/run cleanupInvalidDbKeys.php --globals --memory-limit default --profiler json > ~/wikilogs/cleanupInvalidDbKeys-`date +\%Y\%m\%d\%H\%M\%S`-cron.log 2>&1
0 4 * * * /var/www/html/maintenance/run rebuildall.php --use-master --globals --memory-limit default --profiler json --update > ~/wikilogs/rebuildAll-`date +\%Y\%m\%d\%H\%M\%S`-cron.log 2>&1
0 5 * * * /var/www/html/maintenance/run cleanupUsersWithNoId.php --use-master --globals --memory-limit default --profiler json --update > ~/wikilogs/cleanupUsersWithNoId-`date +\%Y\%m\%d\%H\%M\%S`-cron.log 2>&1

Dans le dossier /root/wikilogs, vous trouverez un script shell simple pour aider à importer le vidage.

#!/bin/bash

# obtenir la version du wiki pour tester la compatibilité
# obtenir la version du Bash pour tester la compatibilité
# obtenir le nombre actuel de pages, arrondir au millier inférieur ou 0 si moins de 1000
# obtenir l'URL du serveur
# commencer l'importation du nombre d'articles
# afficher le nombre total de pages importées

# fonction de conversion de HH:MM:SS en secondes
function time_to_seconds() {
    local time=$1
    local seconds=0
    IFS=":" read -r hours minutes seconds <<< "$time"
    seconds=$((hours*3600 + minutes*60 + seconds))
    echo "$seconds"
}

# fonction de comparaison des numéros de version
function version_compare() {
    local version1="$1"
    local version2="$2"
    if [[ "$(printf '%s\n' "$version1" "$version2" | sort -V | head -n1)" == "$version1" ]]; then
        return 0
    else
        return 1
    fi
}

wikilocation="/var/www/html"

# obtenir la version Wiki actuellement installée
rawWikiVersion=$(${wikilocation}/maintenance/run version)
wikiVersion=$(echo "$rawWikiVersion" | awk -F': ' '{split($2,a," "); print a[1]}')

# comparez la version avec 1.4.0
# if ! version_compare "$wikiVersion" "1.40.0"; then
#     echo "MediaWiki version is not greater than 1.40.0. Aborting import process."
#     exit 1
# fi

# otenir le dernier nombre de pages dans les statistiques
totalStartPages=$(${wikilocation}/maintenance/run showSiteStats | awk '/Total pages/ {print $NF}')

# arrondi inférieur
articleCount=$(echo "scale=0; (${totalStartPages} / 1000) * 1000" | bc)

# URL du wiki
server="<YOUR HTTPS://WEBSITE HERE>"

# emplacement du fichier xml
inputFile="/var/www/html/enwiki-20240120-pages-articles-multistream.xml"

start_time=$(date +%s)
echo "Starting on page ${articleCount} at $(date '+%m-%d-%y %I:%M %p') - Wiki Version ${wikiVersion} with ${server} for the URL"
${wikilocation}/maintenance/run importDump --quiet --memory-limit default --skip-to "${articleCount}" --server "${server}" < ${inputFile} > /dev/null
end_time=$(date +%s)

# calculer le nombre total de pages importées
totalEndPages=$(${wikilocation}/maintenance/run showSiteStats | awk '/Total pages/ {print $NF}')
pages_imported=$((totalEndPages - totalStartPages))

# calculer la durée du processus d'importation en secondes
duration=$((end_time - start_time))

# convertir la durée en minutes
duration_minutes=$((duration / 60))

# calculer le nombre de pages par minute
pages_per_minute=$(awk "BEGIN {printf \"%.2f\", ${pages_imported} / ${duration_minutes}}")

echo "Completed ${pages_imported} pages in ${duration_minutes} minutes (${pages_per_minute} pages/minute) on $(date '+%m-%d-%y %I:%M %p')"

Supervision et résolution des problèmes

Pendant le processus d'import, surveillez les journaux du serveur pour suivre les erreurs ou les alertes. Les problèmes courants peuvent inclure des erreurs de connexion à la base de données, un manque de mémoire ou des problèmes de droits sur les fichiers. Résolvez rapidement les problèmes rencontrés pour que l'import réussisse.

Tâches après l'import

Une fois l'import terminé, exécutez les tâches post-import nécessaires, comme la reconstruction de l'index de recherche ou la mise à jour des paramètres du site. Vérifiez l'intégrité du contenu importé pour assurer la cohérence avec les articles originaux de Wikipédia.

Conclusion

En utilisant un serveur équipé de 16 cœurs, 16 Go de RAM et un SSD de 2 To, le taux moyen d'importation sur une période de deux semaines est de 96 pages par minute. Cette mesure de performance fournit un aperçu précieux de l'efficacité attendue du processus d'importation, ce qui permet une planification efficaces et un ordonnancement des tâches d'importation. En exploitant les capacités d'une telle configuration de serveur, vous pouvez importer avec succès le dépôt XML de la Wikipedia en anglais dans votre installation MediaWiki, enrichissant ainsi votre plateforme d'une multitude de connaissances et de ressources pour les utilisateurs.

Pour calculer le temps approximatif nécessaire pour importer 59 795 345 pages à un taux moyen de 96 pages par minute, nous pouvons utiliser la formule suivante :

Nombre total de pages ÷ Pages par minute ÷ Minutes par heure ÷ Heures par jour ÷ Jours par semaine

Application numérique : 59 795 345÷96÷(60×24)÷7 ≈11,87

En arrondissant, il faudra environ 12 semaines pour importer 59 795 345 pages.

Utiliser Special:Import

Special:Import peut être employé par les utilisateurs de wiki avec les droits import (par défaut, ce sont les utilisateurs du groupe sysop) pour importer un petit nombre de pages (une centaine devrait être possible).

Une tentative pour importer de longs vidages de cette manière pourrait conduire à un échec suite au temps d'exécution trop long ou à des problèmes de connexion.

  • Voir Aide:Importer pour une description basique sur la manière dont fonctionne le processus d'importation.[1]

On vous demande de fournir un préfixe. Si vous avez exporté à partir de la Wikipedia en anglais par exemple, ce sera 'en'. Pour importer le XML vous devez avoir les droits import et importupload. Voir Manuel:Droits utilisateurs .

Téléverser de longs fichiers XML

Il est possible que les longs téléversements soient rejetés car ils dépassent la limite fixée pour PHP dans le fichier php.ini.

 ; Taille maximale autorisée pour le téléversement des fichiers.
 upload_max_filesize = 20M

Essayez de modifier ces quatres paramètres dans php.ini :

 ; Taille maximale des données POST acceptées par PHP.
 post_max_size = 20M

 max_execution_time = 1000  ; Temps maximum d'exécution de chaque script, en secondes
 max_input_time = 2000	    ; Temps maximum que chaque script peut consacrer à l'analyse des données demandées

 ; Temps maximum par défaut autorisé pour les flux basés sur des ''sockets'' (en secondes)
 default_socket_timeout = 2000

Utiliser importDump.php, si vous avez accès au shell

La méthode est recommandée pour un usage général mais reste lente avec des ensembles de données de grande taille.
Voir : Manuel:ImportDump.php , contient des indications sur l'utilisation avec de grands wiki.

Utiliser le script de maintenance importTextFiles.php

Version de MediaWiki :
1.23
Version de MediaWiki :
1.27

Si vous disposez de beaucoup de contenu converti à partir d'une autre source (comme plusieurs fichiers textuels formatés, du contenu d'un autre wiki, etc), il est possible que vous ayez plusieurs fichiers à importer dans votre wiki. Dans MediaWiki 1.27 et ultérieur, vous pouvez utiliser le script de maintenance importTextFiles.php .

Vous pouvez également utiliser le script de maintenance edit.php à cet effet.

rebuildall.php

Pour de longs vidages XML, vous pouvez exécuter rebuildall.php, mais il prendra beaucoup de temps car il doit analyser chacune des pages. Ceci n'est pas recommandé pour les grands ensembles de données.

Utiliser pywikibot, pagefromfile.py et Nokogiri

pywikibot est une collection d'outils écrits en Python qui automatisent le travail sur Wikipedia ou les autres sites MediaWiki. Une fois installé sur votre ordinateur, vous pouvez utiliser l'outil spécifique pagefromfile.py qui vous permet de téléverser un fichier wiki sur les sites Wikipedia ou MediaWiki. Le fichier XML créé par dumpBackup.php peut être transformé en un fichier wiki adapté au traitement par pagefromfile.py en utilisant un simple programme Ruby similaire à ce qui suit (ici, le programme transformera tous les fichiers XML qui sont dans le répertoire actuel - ce qui est nécessaire si votre site MediaWiki est une famille) :

# -*- coding: utf-8 -*-
# dumpxml2wiki.rb

require 'rubygems'
require 'nokogiri'

# Ce programme dumpxml2wiki lit les fichiers xml MediaWiki fournis par dumpBackup.php
# dans le répertoire actuel et les transforme en fichiers wiki qui peuvent ensuite 
# être modifiés et téléchargés à nouveau par pywikipediabot en utilisant pagefromfile.py sur un site de famille MediaWiki.
# Le texte de chaque page est recherché avec xpath et son titre est ajouté sur la première ligne ainsi
# commentaire html : nécessaire pour  pagefromfile.py
# 
Dir.glob("*.xml").each do |filename|
  input = Nokogiri::XML(File.new(filename), nil, 'UTF-8')

  puts filename.to_s  # prints the name of each .xml file

  File.open("out_" + filename + ".wiki", 'w') {|f| 
    input.xpath("//xmlns:text").each {|n|
      pptitle = n.parent.parent.at_css "title" # searching for the title
      title = pptitle.content
      f.puts "\n{{-start-}}<!--'''" << title.to_s << "'''-->" << n.content  << "\n{{-stop-}}"
    }
  }
end

Par exemple voici un extrait du fichier de sortie d'un wiki suite à la commande 'ruby dumpxml2wiki.rb' (pagefromfile.py peut alors téléverser deux pages, un modèle et une une seconde page qui est une redirection) :

{{-start-}}<!--'''Template:Lang_translation_-pl'''--><includeonly>Tłumaczenie</includeonly>
{{-stop-}}

{{-start-}}#REDIRECT[[badania demograficzne]]<!--'''ilościowa demografia'''-->
<noinclude>
[[Category:Termin wielojęzycznego słownika demograficznego (pierwsze wydanie)|ilościowa demografia]]
[[Category:Termin wielojęzycznego słownika demograficznego (pierwsze wydanie) (redirect)]]
[[Category:10]]</noinclude>
{{-stop-}}

Le programme passe en revue chaque fichier XML, extrait chaque texte à l'intérieur des balises <text> </text> de chaque page, cherche le titre correspondant au parent et l'encadre d'une paire de commandes {{-start-}}<!--'''Title of the page'''--> {{-stop-}} utilisées par 'pagefromfile' pour créer ou mettr à jour une page. Le nom de la page se trouve dans un commentaire html et séparé par trois apostrophes sur la même première ligne du début. Veuillez noter que le nom de la page peut être écrit en Unicode. Il est quelques fois important que la page commence directement par la commande, comme pour un #REDIRECT; ainsi le commentaire qui donne le nom de la page doit être après la commande mais toujours sur la première ligne.

Notez que les fichiers de vidage xml produits par dumpBackup.php sont préfixés par un espace de noms :

<mediawiki xmlns="http://www.mediawiki.org/xml/export-0.4/">

Pour accéder au nœud de texte à l'aide de Nokogiri, vous devez préfixer votre chemin avec 'xmlns' :

input.xpath("//xmlns:text")

Nokogirist un analyseur HTML, XML, SAX, et Reader permettant de rechercher des documents via des sélecteurs XPath ou CSS3 et issu de la dernière génération des analyseurs XML utilisant Ruby.

Exemple d'utilisation de 'pagefromfile' pour téléverser le fichier textuel de sortie du wiki :

python pagefromfile.py -file:out_filename.wiki -summary:"Reason for changes" -lang:pl -putthrottle:01

Comment importer les journaux ?

L'export et l'import des journaux avec les scripts MediaWiki standard se révèle assez difficile; une alternative pour importer est le script pages_logging.py de l'outil WikiDAT comme suggéré par Felipe Ortega.

Résolution des problèmes

Fusionner les historiques, conflits de versions, modifier les résumés et autres difficultés

Lors de l'importation d'une page avec des informations d'historique, si le nom d'utilisateur existe déjà dans le projet cible, modifiez le nom d'utilisateur dans le fichier XML pour éviter toute confusion. Si le nom d'utilisateur est nouveau pour le projet cible, les contributions seront toujours disponibles, mais aucun compte ne sera créé automatiquement.

Lorsqu'une page est référencée via un lien ou une URL, les noms génériques de l'espace de noms sont convertis automatiquement. Si le préfixe n'est pas un nom d'espace de noms reconnu, la page sera par défaut dans l'espace de noms principal. Cependant, des préfixes comme mw: pourraient être ignorés sur les projets qui les utilisent pour les liens interwiki. Dans de tels cas, il peut être bénéfique de modifier le préfixe en Project: dans le fichier XML avant l'importation.

Si une page portant le même nom existe déjà, les modifications importées combineront les historiques. L'ajout d'une révision entre deux versions existantes peut faire apparaître les changements de l'utilisateur suivant comme différents. Pour voir le changement réel, comparez les deux versions originales, et non celle insérée. Donc, insérez seulement des modifications pour reconstruire correctement l'historique de la page.

Une révision ne sera pas importée s'il existe déjà une révision à la même date et heure. Cela se produit généralement si elle a déjà été importée avant, soit dans le même wiki, un wiki précédent, ou les deux, ou éventuellement d'un troisième site.

Un résumé de modification peut faire référence ou pointer vers une autre page, ce qui peut être déroutant si la page à laquelle il est lié n'a pas été importée, même si la page de référence l'a été.

Le résumé de modification n'indique pas automatiquement si la page a été importée, mais dans le cas d'un import de téléversement, vous pouvez ajouter ces informations aux résumés de modification dans le fichier XML avant l'importation. Cela peut aider à éviter une confusion. Lors de la modification du fichier XML avec trouver / remplacer, gardez à l'esprit que l'ajout de texte aux résumés de modification nécessite la différenciation entre les modifications avec et sans résumé de modification. Si le fichier XML contient plusieurs balises de commentaires, seule la dernière série sera appliquée.

Liens interwikis

Si vous recevez le message Interwiki le problème est que certaines pages à importer ont un préfixe qui est utilisé pour les liens Interwiki . Par exemple, celles avec un préfixe 'Meta:' vont entrer en conflit avec le préfixe interwiki meta: qui par défaut se pointe vers https://meta.wikimedia.org.

Choisissez les actions à faire parmi celles décrites ci-après.

  • Supprimez le préfixe de la table de interwiki . Cela préservera le titre des pages, mais empêchera les liens interwiki en utilsant ce préfixe.
    Exemple : vous conserverez les titres de page « Meta:Blah blah » mais ne pourrez pas utiliser le préfixe meta: pour aller sur meta.wikimedia.org (bien que cela soit possible grâce à un préfixe différent).
    Comment le faire : avant d'importer le vidage, exécutez la requête DELETE FROM interwiki WHERE iw_prefix='prefix' (note : ne pas inclure les deux-points dans le prefixe). Alternativement, si vous avez activé la modification de la table interwiki, vous pouvez simplement aller sur Special:Interwiki et cliquer sur le lien de suppression (Delete) à la droite de la ligne où se trouve le préfixe.
  • Remplacer le préfixe non souhaité dans le fichier XML par Project: avant l'import. Ceci va conserver la fonctionnalité du préfixe pour les interliens, mais remplacera le préfixe dans le titre des pages par le nom du wiki dans lequel elles sont importées, ce qui peut être douloureux à faire avec de longs vidages.
    Exemple : remplacer tous les 'Meta:' par 'Project:' dans le fichier XML. MediaWiki remplacera donc 'Project:' par le nom de votre wiki durant l'importation.

Voir aussi

Références

  1. Voir Manuel:Manipuler le fichier d'import XML en CSharp à propos d'un exemple de code C# qui manipule un fichier d'import XML.