이 기사는 XML 덤프를 가져오기 위한 방법을 설명합니다. XML 덤프는, 사이트-관련 데이터없이, (모든 개정판을 갖는 위키 페이지) 위키의 컨텐츠를 포함합니다. XML 덤프는 위키 데이터베이스의 전체 백업을 생성하지 않으며, 덤프는 사용자 계정, 이미지, 편집 로그, 등을 포함하지 않습니다.
위키미디어 사이트와 위키피디아를 포함하는, 모든 미디어위키 사이트의 Special:Export 페이지는 (컨텐츠 덤프) XML 파일을 생성합니다. meta:Data dumps 및 Manual:DumpBackup.php를 참조하십시오. XML 파일은 meta:Help:Export에서 보다 자세히 설명되어 있습니다.
What to import?
How to import?
이들 XML 덤프를 가져오는 여러 가지 방법이 있습니다.
Using Special:Import
Special:Import는 (기본적으로 이것은 sysop 그룹의 사용자에게 있는) import 권한을 갖는 위키 사용자에 의해 (약 100 개는 안전할 것입니다) 페이지의 작은 숫자를 가져오기 위해 사용될 수 있습니다. 이 방법으로 큰 덤프를 가져오려고 시도하면 시간 초과 또는 연결 실패가 발생할 수 있습니다. 자세한 설명에 대해 meta:Help:Import를 참조하십시오.
Changing permissions
Manual:User_rights를 참조하십싱오.
등록된 모든 편집자에게 import를 허용하기 위해 localsettings.php에 다음 줄을 추가하십시오 (추천하지 않습니다):
$wgGroupPermissions['user']['import'] = true;
$wgGroupPermissions['user']['importupload'] = true;
Possible problems
Transwiki-Import PHP safe_mode를 사용하는 것에 대해 반드시 off이고 open_basedir는 반드시 비어 있어야 합니다 (둘 다는 php.ini의 변수입니다). 그렇지 않으면 가져오기를 실패합니다.
다음과 같은 오류를 얻게 됩니다:
Warning: XMLReader::open(): Unable to open source data in /.../wiki/includes/Import.php on line 53
Warning: XMLReader::read(): Load Data before trying to read in /.../wiki/includes/Import.php on line 399
그리고 Special:Import에서 "Import failed: Expected <mediawiki> tag, got " 보이면, 이것은 이전 가져오기에서 치명적인 오류의 원인에 대한 문제일 수 있으며, 이것은 전체 서버에 걸쳐 잘못된 상태에서 libxml을 남겨지거나, 같은 서버에서 또 다른 PHP 스크립트가 엔터디 로더 (PHP 버그)를 비활성화 때문입니다. 이것은 미디어위키 1.26 이전의 미디어위키 버전에서 발생하고, 해결책은 웹서버 서비스 (아파치 등)를 재시작하거나, libxml_disable_entity_loader(false);를 호출하는 스크립트를 작성하고 실행하는 것입니다 (T86036를 참조하십시오).
Using importDump.php, if you have shell access
일반적인 사용에 대해 권장되는 방법이지만, 매우 큰 데이터 집합에 대해 느립니다. 큰 위키피디아의 덤프와 같은, 매우 큰 데이터의 총량에 대해, mw:mwdumper를 사용하고, 개별 SQL로 링크 테이블을 가져옵니다.
importDump.php는 미디어위키 설치의 유지보수 폴더에 위치한 명령-줄 스크립트입니다. 만약 쉡 접근 권한을 가지면, 다음과 같이 유지보수 폴더 안에서 importdump.php를 호출할 수 있습니다 (필요하다면 경로를 더하십시오):
php importDump.php --conf ../LocalSettings.php /path_to/dumpfile.xml.gz
또는:
php importDump.php < dumpfile.xml
여기서 dumpfile.xml은 XML 덤프 파일의 이름입니다. 만약 파일이 압축되고 .gz 또는 .bz2 파일 확장자를 가지면, 자동으로 압축해제됩니다.
그 후에 이미지를 가져오기 위해 importImages.php를 사용하십시오:
php importImages.php ../path_to/images
참고: 만약 위키에 업로드된 다른 디지털 미디어 파일 형식, 예를 들어, .zip, .nxc, .cpp, .py 또는 .pdf를 가지면, 반드시 wiki_prefix_imagelinks 테이블을 역시 백업/내보내기를 하고 새로운 미디어위키에 해당하는 새로운 SQL 데이터베이스 테이블에 그것을 "삽입"합니다. 그렇지 않으면, 이들 파일 형식을 참조하는 모든 링크가 wikipages에서 손상된 것으로 나타날 것입니다.
참고: 만약 WAMP 설치를 사용하면, innoDB 설정으로 기인하여 가져오기와 함께 문제를 가질 수 있습니다 (기본적으로 이 엔진은 my.ini에서 비활성화되어 있으므로, 만약 문제가 없으면, MyIsam 엔진을 사용하십시오)
참고: importDump.php를 실행하면 꽤 오랜 시간이 걸릴 수 있습니다. 수백만 페이지를 갖는 대용량 위키피디아 덤프에 대해, 심지어 빠른 서버에서도, 며칠이 걸릴 수 있습니다. 또한 병합 기록, 등에 대한 meta:Help:Import에서 정보가 역시 적용되는 것에 주목하십시오.
참고: 가져오기 후 데이터베이스의 최적화가 권장됩니다: 데이터베이스 크기를 2 또는 3배로 줄일 수 있습니다.
importDump.php를 실행한 후, Special:Recentchanges 페이지의 컨텐츠를 업데이트하기 위해 rebuildrecentchanges.php를 실행하기를 원할 수 있습니다.
FAQ
어떻게 디버그 모드를 설정하나요? 명령-줄 옵션 --debug을 사용하십시오. 모의 테스트(dry run)를 만드는 방법은 무엇입니까 (데이터가 데이터베이스에 추가되지 않습니다)? 명령-줄 옵션 --dry-run을 사용하십시오.
Error messages
입력
roots@hello:~# php importImages.php /maps gif bmp PNG JPG GIF BMP
오류
> PHP Deprecated: Comments starting with '#' are deprecated in /etc/php5/cli/conf.d/mcrypt.ini on line 1 in Unknown on line 0
> Could not open input file: importImages.php
원인
importImages.php를 실행하기 전에 importImages.php 유지관리 스크립트가 있는 maintenance/ 폴더로 디렉토리를 먼저 변경해야 합니다.
MAMP 실행하는 동안 오류
DB connection error: No such file or directory (localhost)
해결책
특정 데이터베이스 자격증명을 사용하여
$wgDBserver = "localhost:/Applications/MAMP/tmp/mysql/mysql.sock";
$wgDBadminuser = "XXXX";
$wgDBadminpassword = "XXXX";
Using importTextFiles.php Maintenance Script
MediaWiki versions: |
1.23 – 1.27
|
만약 또 다른 소스 (여러 워드 프로세서 파일, 다른 위키의 컨텐츠 등)에서 변환된 컨텐츠를 많이 가지면, 위키로 가져올 파일이 여러 개 있을 수 있습니다. 미디어위키 1.27 및 이후 버전에서, importTextFiles.php 유지관리 스크립트를 사용할 수 있습니다.
이 목적에 대해 edit.php 유지관리 스크립트를 역시 사용할 수 있습니다.
Using mwdumper
mw:mwdumper는 미디어위키 XML 덤프를 읽고 쓰고 변환하는 것에 사용될 수 있는 자바 응용 프로그램입니다. XML 파일 (나중에 mysql 또는 phpmyadmin과 함께 사용하기 위해)에서 SQL 덤프를 생성하고 데이터베이스로 직접 가져오는 것에 사용될 수 있습니다. importDump.php보다 훨씬 빠르지만, 어쨌든, 개정 (페이지 내용)만 가져오고, 이에 따라 내부 링크 테이블을 업데이트하지 않습니다 -- 즉 카테고리 페이지와 많은 특수 페이지가 만약 그들 테이블을 업데이트하지 않으면 불완전 또는 잘못된 정보를 보여줄 것입니다.
이용 가능하면, mysql 명령-줄 클라이언트를 직접 사용하여 이들 테이블의 개별 SQL 덤프를 가져오기 함으로써 링크 테이블을 채울 수 있습니다. 위키미디어 위키에 대해, 이 데이터는 XML 덤프와 함께 이용 가능합니다.
그렇지 않으면, rebuildall.php을 실행할 수 있는데, 이것은 긴 시간을 걸릴 것입니다. 왜냐하면 모든 페이지를 구문 분석하기 때문입니다. 이것은 대용량 데이터 집합에 대해 추천하지 않습니다.
Using pywikibot, pagefromfile.py and Nokogiri
Pywikibot은 위키피디아 또는 다른 미디어위키 사이트에서 작업을 자동화하는 Python으로 작성된 도구 모음입니다. 일단 해당 컴퓨터에 설치되면, 특정 도구 'pagefromfile.py'를 사용하여 위키피디아 또는 미디어위키 사이트에 위키 파일을 업로드할 수 있습니다. dumpBackup.php에 의해 생성된 xml 파일은 다음과 유사한 간단한 루비 프로그램을 사용하여 'pagefromfile.py'에 의해 처리될 수 있는 위키 파일로 변환될 수 있습니다 (여기서 프로그램은 현재 디렉토리에 있는 모든 xml 파일을 변환할 것입니다. 이것은 만약 미디어위키 사이트가 가족이면 요구됩니다):
# -*- coding: utf-8 -*-
# dumpxml2wiki.rb
require 'rubygems'
require 'nokogiri'
# This program dumpxml2wiki reads mediawiki xml files dumped by dumpBackup.php
# on the current directory and transforms them into wiki files which can then
# be modified and uploaded again by pywikipediabot using pagefromfile.py on a mediawiki family site.
# The text of each page is searched with xpath and its title is added on the first line as
# an html comment: this is required by 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
예를 들어, 여기서 명령 'ruby dumpxml2wiki.rb'에 의해 출력되는 위키 파일의 발췌 부분입니다 (두 페이지, 템플릿 그리고 리다이렉션인 두 번째 페이지는 pagefromfile.py에 의해 업로드될 수 있습니다):
{{-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-}}
이 프로그램은 각 xml 파일에 액세스하고, 각 페이지의 <text> </text> 마크업 안의 텍스트를 추출하고, 해당 제목을 부모로 검색하고 그것을 페이지를 생성 또는 업데이트하기 위해 'pagefromfile'에 의해 사용된 쌍으로 된 {{-start-}}<!--'''Title of the page'''--> {{-stop-}}에 넣습니다. 페이지의 이름은 html 주석에 있고 같은 첫 번째 시작 줄에 세 따옴표로 구분됩니다. 페이지의 이름은 유니코드로 쓰일 수 있는 것에 주목하십시오. 때때로 #REDIRECT에서 처럼, 페이지가 명령으로 직접 시작하는 것이 중요합니다; 따라서 페이지 이름을 제공하는 주석은 명령 뒤에 반드시 있어야 하지만 여전히 첫 번째 줄에 있어야 합니다.
dumpBackup.php에 의해 생성된 xml 덤프 파일은 이름공간을 앞에 붙이는 것에 기억해 두십시오:
Nokogiri를 사용하여 텍스트 노드에 접근하기 위해, 경로 앞에 'xmlns'를 추가해야 합니다:
input.xpath("//xmlns:text")
Nokogiri는 루비를 사용하는 XML 파서의 마지막 세대에서 XPath 또는 CSS3 선택자를 통해 문서를 검색할 수 있는 HTML, XML, SAX 및 Reader 파서입니다.
출력 위키 텍스트 파일을 업로드하기 위한 'pagefromfile'의 사용 예제:
python pagefromfile.py -file:out_filename.wiki -summary:"Reason for changes" -lang:pl -putthrottle:01
How to import logs?
표준 미디어위키 스크립트를 갖는 로그를 내보내고 가져오는 일은 종종 매우 어렵습니다; 가져오기의 대안은 Felipe Ortega에 의해 제안된 WikiDAT 도구의 pages_logging.py 스크립트입니다.
Troubleshooting
Merging histories, revision conflict, edit summaries, and other complications
Interwikis
다음 메시지를 얻으면
Page "meta:Blah blah" is not imported because its name is reserved for external linking (interwiki).
문제는 가져올 일부 페이지가 인터위키 링크에 사용되는 접두사를 가지고 있다는 것입니다. 예를 들어, 'Meta:'의 접두사를 갖는 것은 기본적으로 http://meta.wikimedia.org에 의해 연결되는 인터위키 접두사 meta와 충돌할 것입니다.
다음 중 하나를 수행할 수 있습니다.
- 인터위키 테이블에서 접두어를 제거하십시오. 이것은 페이지 제목은 유지되지만, 그 접두사를 통한 인터위키 링크는 방지할 것입니다. 예제: 페이지 제목 'Meta:Blah blah'를 보존할 것이지만 meta.wikimedia.org에 링크하기 위한 'meta:' 접두어를 사용할 수 없습니다 (비록 다른 접두사를 통해 가능할 수 있을지라도). 그것을 수행하는 방법: 덤프를 가져오기 전에, 쿼리 DELETE FROM interwiki WHERE iw_prefix='prefix'를 실행하십시오 (주의: prefix에 콜론을 포함하지 않습니다). 대안적으로, 만약 인터위키 테이블 편집을 활성화했으면, 단순히 Special:Interwiki로 이동하고 해당 접두사에 속하는 행의 오른쪽에 있는 'Delete' 링크를 누를 수 있습니다.
- 가져오기 전에 "Project:"를 갖는 XML 파일에서 원하지 않는 접두사를 바꾸십시오. 이것은 인터위키로의 접두사 기능을 유지하지만, 위키의 이름을 갖는 페이지 제목에서 접두사를 바꿀 것이며, 여기서 그들은 가져올 것이고, 큰 덤프에서 상당히 어려울 수 있습니다. 예제: XML 파일에서 'Project:'를 갖는 모든 'Meta:'를 바꾸십시오. 미디어위키는 가져오는 동안 해당 위키의 이름을 갖는 'Project:'를 바꿀 것입니다.
See also
- Manual:DumpBackup.php
- meta:Data dumps#Tools
- Manual:System administration#Getting data
- Manual:Configuring_file_uploads#Set_maximum_size_for_file_uploads – May come in handy if you are doing massive imports
- Manual:Errors_and_Symptoms#Fatal_error:_Allowed_memory_size_of_nnnnnnn_bytes_exhausted_.28tried_to_allocate_nnnnnnnn_bytes.29 – Settings that may need to be changed if you are doing massive imports
- Manual:ImportImages.php - for importing images.
- Manual:Importing external content
- Manual:Importing Wikipedia infoboxes tutorial