Manual:MWDumper/ja

From MediaWiki.org
Jump to navigation Jump to search

MWDumper is a tool written in Java for extracting sets of pages from a MediaWiki dump file. For example, it can load Wikipedia's content into MediaWiki.

MWDumper can read MediaWiki XML export dumps (version 0.3, minus uploads), perform optional filtering, and output back to XML or to SQL statements to add things directly to a database in 1.4 or 1.5 schema.

Beware that MWDumper has not been actively maintained since the mid-2000s, and may or may not work with current deployments. Some new maintenance is going on as of December 2015.

注 注: While this can be used to import XML dumps into a MediaWiki database, it might not be the best choice for small imports (say, 100 pages or less). See Manual:Importing XML dumps for an overview.

Where to find it[edit]

To import current XML export dumps, you'll need an up-to-date build of MWDumper...

The version at dumps.wikimedia.org is from February 2013.

You can build an up to date MWDumper from source. (See #How to build MWDumper from source, below).

If you have Docker and do not want to build it yourself, you can use the following Docker image which does it for you: https://hub.docker.com/r/ueland/mwdumper/

Potentially out of date builds:

Third-party builds (that start in GUI mode by default so you won't need most of the parameters below, but they may not contain the latest bug fixes) – just run it with java -jar mwdumper.jar)

There are also third party builds without the gui default (from September 2, 2008).

Usage[edit]

Prerequisites for imports via MWDumper[edit]

Before using mwdumper, your page, text, revision and redirect tables must be empty. To empty them, do this (note that this will wipe out an existing wiki):

  • In SQL: TRUNCATE TABLE page; TRUNCATE TABLE text; TRUNCATE TABLE revision; TRUNCATE TABLE redirect;
  • In maintenance directory: php rebuildall.php

Import dump files with MWDumper[edit]

直接データベースのインポートをするためのサンプルのコマンドラインです:

  java -jar mwdumper.jar --format=sql:1.25 pages_full.xml.bz2 |
    mysql -u <username> -p <databasename>

または

  cd mwdumper/src
  javac org/mediawiki/dumper/Dumper.java
  cd ..
  java -classpath ./src org.mediawiki.dumper.Dumper --format=sql:1.25 pages_full.xml.bz2 |
    mysql -u <username> -p <databasename>

注 注: A third party developer has added features to output in a tab delimited format for processing large dumps. The compiled version is here and the code for the project is here. To use the update you have to specify a seperate output file for pages since you don't want to have the two tab delimited output files dumped together. This was done specifically for processing the large Wikipedia Dumps using Hadoop. Usage is shown below:

cat train.xml | java -jar mwdumper.jar --format=flatfile:pages_output_file.txt - --quiet > train.txt

ヒント:インポートが成功するために テーブル 'page'、'revision'、'text' は空でなければなりません。

注記: this command will keep going even if MySQL reports an error. This is probably not what you want - if you use the direct connection to MySQL, the import will stop when errors occur.

注記: If you nohup a mwdumper command, be sure to use the --quiet option.

文字エンコーディング上の注意[edit]

データベースがutf8でエンコードされたテキストを要求することを確認して下さい。データベースがlatin1(MySQLのデフォルト)を要求する場合、mwdumper の出力を直接使用する場合テーブルで不正な文字を取得します。これをする一つの方法は上記のサンプルで --default-character-set=utf8 を MySQL に渡すことです。

If you want to use the output of mwdumper in a JDBC URL, you should use set characterEncoding=utf8 in the query string.

Also make sure that your MediaWiki tables use CHARACTER SET=binary. Otherwise, you may get error messages like Duplicate entry in UNIQUE Key 'name_title' because MySQL fails to distinguish certain characters.

複雑なフィルタリング[edit]

複数の出力ファイルを生み出すために複雑なフィルタリングをすることも出来ます:

  java -jar mwdumper.jar \
    --output=bzip2:pages_public.xml.bz2 \
      --format=xml \
      --filter=notalk \
      --filter=namespace:\!NS_USER \
      --filter=latest \
    --output=bzip2:pages_current.xml.bz2 \
      --format=xml \
      --filter=latest \
    --output=gzip:pages_full_1.25.sql.gz \
      --format=sql:1.25 \
    --output=gzip:pages_full_1.5.sql.gz \
      --format=sql:1.5 \
    --output=gzip:pages_full_1.4.sql.gz \
      --format=sql:1.4 \
    pages_full.xml.gz

裸のパラメータはXML入力を読み込むためにファイルとして解釈されます: "-"もしくは空の値が与えられた場合、入力はstdinから読み込まれます。".gz"もしくは".bz2"拡張子を持つ入力ファイルはそれぞれgzipもしくはbzip2ストリームとして解凍されます。

7-zip、.7zファイルの内部解凍はまだサポートされていません; p7zipの7zaを通してファイルをそれらのファイルをパイプすることが出来ます:

  7za e -so pages_full.xml.7z |
    java -jar mwdumper.jar --format=sql:1.25 |
    mysql -u <username> -p <databasename>

パラメータが与えられない場合のデフォルトです:

  • stdinから未解凍のXMLを読み込む
  • stoutから未解凍のXMLを書き込む
  • フィルタリング無し

出力シンク[edit]

  --output=stdout
      パイプのために圧縮されていないXMLもしくはSQL出力をstdoutに送る。
      (キャラクタセットの問題を持っているかもしれません。) 出力が指定されていない場合これはデフォルトです。
  --output=file:<filename.xml>
      圧縮されていない出力をファイルに書き込む。
  --output=gzip:<filename.xml.gz>
      圧縮されていない出力をファイルに書き込む。
  --output=bzip2:<filename.xml.bz2>
      圧縮されていない出力をファイルに書き込む。
  --output=mysql:<jdbc url>
      SQLフォーマットの出力のみ有効になります; MySQLサーバへの接続を開き、コマンドを直接送ります。
      これは次のようになります:
      mysql://localhost/databasename?user=<username>&password=<password>

出力フォーマット[edit]

  --format=xml
      MediaWikiのXMLエクスポートファイルフォーマットに戻して出力します;
      制限されたインポートのためのフィルタリングダンプに対して使用します。出力は冪等(idempotent)です。
  --format=sql:1.4
      MediaWiki 1.4のスキーマへのバルクインポートのためのフォーマットされたSQL文。
  --format=sql:1.5
      MediaWiki1.5のスキーマへのバルクインポートのためにフォーマットされたSQL文。
      両方のSQLスキーマバージョンは現在テーブル構造が既に空のデータベースにセットアップされていることが必要です;
      MediaWikiディストリビューションからmaintenance/tables.sqlを使用します。
  --format=sql:1.25
     SQL statements formatted for bulk import in MediaWiki 1.25's schema.

フィルタアクション[edit]

  --filter=latest
      それぞれのページのために並べられた最後のリビジョン以外すべてをスキップします。
      FIXME:現在タイムスタンプもしくはリビジョン数には注意を払いませんが、
      シンプルなダンプでの項目の順番です。
      これは厳密には正しいもしく正しくないかもしれません。
  --filter=list:<list-filename>
      与えられたファイルに現れないタイトルを持つすべてのページを排除します:
      一行ごとに一つのタイトルを使用します; 空白と#で始まる行は無視されます。
      与えられたタイトルの会話と題目の両方がマッチします。
  --filter=exactlist:<list-filename>
      上記に関してですが、関連した会話/題目ページにマッチしないように試みます。
  --filter=namespace:[!]<NS_KEY,NS_OTHERKEY,100,...>
      与えられた名前空間にある(もしくは"!"で名前空間にない)ページのみ含みます。
      NS_*定数名もしくは生の数字キーを使用することが出来ます。
  --filter=notalk
      出力からすべての会話ページを排除します(カスタムの名前空間を含みます)
  --filter=titlematch:<regex>
      タイトルが正規表現とマッチしないすべてのページを排除します。

その他のオプション[edit]

  --progress=<n>
      デフォルトの1000リビジョンからインターバルをレポートする変更の進展。
  --quiet
      stderrへの進行出力を送らない。

Direct connection to MySQL[edit]

MySQLへの直接的な接続をしてmwdumperを使用する例[edit]

java -server -classpath mysql-connector-java-3.1.11/mysql-connector-java-3.1.11-bin.jar:mwdumper.jar \
   org.mediawiki.dumper.Dumper --output=mysql://127.0.0.1/testwiki?user=wiki\&password=wiki \
   --format=sql:1.25 20051020_pages_articles.xml.bz2

ノート:

  • mysql-connector JDBCドライバが必要です。
  • JREは-jarと-classpath引数を混合することを認めません(異なるコマンド構造だからです)。
  • --output引数は--format引数の前でなければなりません。
  • MySQL URIでアンパサンド(&)はUnixシステム上ではエスケープしなければなりません。

Windows XP上でMySQLに直接接続してmwdumperを使用する例[edit]

上記の例で問題を抱えました...次の例はXPでベターに動作します....

1.次のようなバッチファイルを作成する。


set class=mwdumper.jar;mysql-connector-java-3.1.12/mysql-connector-java-3.1.12-bin.jar
set data="C:\Documents and Settings\All Users.WINDOWS\Documents\en.wiki\enwiki-20060207-pages-articles.xml.bz2"
java -client -classpath %class% org.mediawiki.dumper.Dumper "--output=mysql://127.0.0.1/wikidb?user=<username>&password=<password>&characterEncoding=UTF8" "--format=sql:1.25" %data%
pause

2.mysql-connector-java-3.1.12-bin.jarとmwdumper.jarをダウンロードします

3.バッチを動作させます。

注意

  1. "duplicate key"...というインポートファイルに関する問題がまだ報告されます
  2. クラスパスセパレータは例では ; (セミコロン)です; 上記の例とは異なります。


-- ページからの重複キーの結果、空ではないデータベースにあるリビジョンとテキストテーブル、ここで記述されたようなこれらを空にするためにphpMyadminを使用して下さい

Performance Tips[edit]

Please elaborate on these tips if you can.

データベースへのインポートを速くするためには、次のことを試して下さい:

Remove indexes and auto-increment fields[edit]

Temporarily remove all indexes and auto_increment fields from the following tables: page, revision and text. This gives a tremendous speed bump, because MySQL will otherwise be updating these indexes after each insert.

Don't forget to recreate the indexes afterwards.

  1. Remove indexes:
  2. Remove primary keys: In MySQL execute:
    • alter table revision drop primary key;
    • alter table text drop primary key;
    • alter table page drop primary key;
  3. Remove auto increment fields: In MySQL execute:
    • alter table revision change rev_id rev_id int(10) unsigned not null;
    • alter table text change old_id old_id int(10) unsigned not null;
    • alter table page change page_id page_id int(10) unsigned not null;

Note that it will take a long time to recreate all the removed data.

Set -server option[edit]

Java's -server option may significantly increase performance on some versions of Sun's JVM for large files. (Not all installations will have this available.)

Increase MySQL's innodb_log_file_size[edit]

Increase MySQL's innodb_log_file_size. The default is as little as 5mb, but you can improve performance dramatically by increasing this to reduce the number of disk writes. (See the my-huge.cnf sample config.)

Disable the binary log[edit]

If you don't need it, disable the binary log (log-bin option) during the import. On a standalone machine this is just wasteful, writing a second copy of every query that you'll never use.

To test if binary log is enabled via SQL command, issue the following statement:

SHOW VARIABLES LIKE 'log_bin';

More tips in the MySQL reference manual[edit]

Various other wacky tips can be found in the MySQL reference manual. If you find any useful ones, please write about them here.

Troubleshooting[edit]

If strange XML errors are encountered under Java 1.4, try 1.5:

If mwdumper gives java.lang.IllegalArgumentException: Invalid contributor exception, see タスク T20328.

If it gives java.lang.OutOfMemoryError: Java heap space exception, run it with larger heap size, for example java -Xms128m -Xmx1000m -jar mwdumper.jar ... (first is starting, second maximum size) (タスク T23937)

If an error is thrown with a reference to page_counter being missing, use the --format=sql:1.25 parameter. Alternatively, you can create a page_counter column on the page table.

Importing XML dumps from old MediaWiki versions may give errors of "Column 'rev_sha1' cannot be null". You'll need to change the column to accept null values, and run populateRevisionSha1.php afterwards.

How to build MWDumper from source[edit]

You can build MWDumper from source and let Maven sort out the dependencies. Just:

git clone https://phabricator.wikimedia.org/diffusion/MWDU/mwdumper.git
cd mwdumper
mvn compile
mvn package

It should generate the mwdumper<version number>.jar file (for example mwdumper-1.25.jar) on the folder named target.

Note that usage examples on this page use class=mwdumper.jar, so you should either rename the file to mwdumper.jar, or use class=mwdumper-1.25.jar instead.

Programming[edit]

Reporting bugs[edit]

Bugs can be reported in the Wikimedia bug tracker.

Change history (abbreviated)[edit]

  • 2016-04-23: Updated Xerces library to fix intermittent UTF-8 breakage
  • ... various bug fixes ...
  • ... build system changed to Maven ...
  • ... various bug fixes ...
  • 2005-10-25: Switched SqlWriter.sqlEscape back to less memory-hungry StringBuffer
  • 2005-10-24: Fixed SQL output in non-UTF-8 locales
  • 2005-10-21: Applied more speedup patches from Folke
  • 2005-10-11: SQL direct connection, GUI work begins
  • 2005-10-10: Applied speedup patches from Folke Behrens
  • 2005-10-05: Use bulk inserts in SQL mode
  • 2005-09-29: Converted from C# to Java
  • 2005-08-27: Initial extraction code

Todo[edit]

  • Add some more junit tests
  • Include table initialization in SQL output
  • Allow use of table prefixes in SQL output
  • Ensure that titles and other bits are validated correctly.
  • Test XML input for robustness
  • Provide filter to strip ID numbers
  • <siteinfo> is technically optional; live without it and use default namespaces
  • GUI frontend(s)
  • Port to Python? ;)

Alternate method of loading a huge wiki[edit]

Warning: This method takes days to run.

If you have to load a huge wiki this might help...

Below is a set of instructions that makes loading a large wiki less error prone and maybe a bit faster. It is not a script but rather a set of commands you can copy into bash (running in a screen session.) You'll have to babysit and customize the process for your needs.

# Dump SQL to disk in even sized chunks.  This takes about 80 Gb of hard drive space and 3 hours for enwiki.
# Setup the db to receive the chunks.  This takes a few seconds.
# Import the chunks.  This takes a few days for enwiki.
# Rebuild the DB.  This takes another day for enwiki.
# Run standard post import cleanup.  I haven't finished this step successfully yet but some of it can be skipped I think.

export DUMP_PREFIX=/public/datasets/public/enwiki/20130604/enwiki-20130604
export DIR_ROOT=/data/project/dump
export DIR=${DIR_ROOT}/enwiki
export EXPORT_PROCESSES=4
export IMPORT_PROCESSES=4
export DB=enwiki2
export EXPORT_FILE_SIZE=5
export EXPORT_FILE_SUFFIX_LENGTH=8
export LOG=~/log

bash -c 'sleep 1 && echo y' | mysqladmin drop ${DB} -u root
sudo rm -rf ${DIR}
rm -rf ${LOG}

sudo mkdir -p ${DIR}
sudo chown -R ${USER} ${DIR_ROOT}
mkdir -p ${LOG}

# Dump SQL to disk in even sized chunks.
# Sort by size descending to keep as many threads as possible hopping.
# uconv cleans up UTF-8 errors in the source files.
# grep removes BEGIN and COMMIT statements that mwdumper thinks are good, but I do better below
sudo apt-get install openjdk-7-jdk libicu-dev -y #jdk for mwdumper and libicu-dev for uconv
ls -1S ${DUMP_PREFIX}-pages-meta-current*.xml-p* |
  xargs -I{} -P${EXPORT_PROCESSES} -t bash -c '
  mkdir -p ${DIR}/$(basename {})
  cd ${DIR}/$(basename {})
  bunzip2 -c {} |
    uconv -f UTF-8 -t ascii --callback escape-xml-dec -v 2> ${LOG}/$(basename {}).uconv |
    java -jar ~/mwdumper-1.16.jar --format=sql:1.25 2> ${LOG}/$(basename {}).mwdumper |
    grep INSERT |
    split -l ${EXPORT_FILE_SIZE} -a ${EXPORT_FILE_SUFFIX_LENGTH} 2> ${LOG}/$(basename {}).split
  '

# Setup the db to receive the chunks.
mysqladmin create ${DB} --default-character-set=utf8 -u root
mysql -u root ${DB} < /srv/mediawiki/maintenance/tables.sql
mysql -u root ${DB} <<HERE
ALTER TABLE page
  CHANGE page_id page_id INTEGER UNSIGNED,
  DROP INDEX name_title,
  DROP INDEX page_random,
  DROP INDEX page_len,
  DROP INDEX page_redirect_namespace_len;
ALTER TABLE revision 
  CHANGE rev_id rev_id INTEGER UNSIGNED,
  DROP INDEX rev_page_id,
  DROP INDEX rev_timestamp,
  DROP INDEX page_timestamp,
  DROP INDEX user_timestamp,
  DROP INDEX usertext_timestamp,
  DROP INDEX page_user_timestamp;
ALTER TABLE text
  CHANGE old_id old_id INTEGER UNSIGNED;
HERE

# Import the chunks
# Each chunk is wrapped in a transaction and if the import succeeds the chunk is removed from disk.
# This means you should be able to safely ctrl-c the process at any time and rerun this block and
# it'll pick up where it left off.  The worst case scenario is you'll get some chunk that was added
# but not deleted and you'll see mysql duplicate key errors.  Or something like that.  Anyway, if you
# are reading this you are a big boy and can figure out how clean up the database or remove the file.
echo 'BEGIN;' > ${DIR_ROOT}/BEGIN
echo 'COMMIT;' > ${DIR_ROOT}/COMMIT
find ${DIR} -type f |
  sort -R |
  xargs -I{} -P${IMPORT_PROCESSES} -t bash -c '
    cat ${DIR_ROOT}/BEGIN {} ${DIR_ROOT}/COMMIT | mysql -u root ${DB} &&
    rm {}'

# Rebuild the DB
mysql -u root ${DB} <<HERE
CREATE TABLE bad_page AS 
  SELECT page_namespace, page_title, COUNT(*) AS count
  FROM page GROUP BY page_namespace, page_title
  HAVING count > 1;
UPDATE page, bad_page
  SET page.page_title = CONCAT(page.page_title, page.page_id)
  WHERE page.page_namespace = bad_page.page_namespace AND page.page_title = bad_page.page_title;
DROP TABLE bad_page;
ALTER TABLE page
  CHANGE page_id page_id INTEGER UNSIGNED AUTO_INCREMENT,
  ADD UNIQUE INDEX name_title (page_namespace,page_title),
  ADD INDEX page_random (page_random),
  ADD INDEX page_len (page_len),
  ADD INDEX page_redirect_namespace_len (page_is_redirect, page_namespace, page_len);
ALTER TABLE revision 
  CHANGE rev_id rev_id INTEGER UNSIGNED AUTO_INCREMENT,
  ADD UNIQUE INDEX rev_page_id (rev_page, rev_id),
  ADD INDEX rev_timestamp (rev_timestamp),
  ADD INDEX page_timestamp (rev_page,rev_timestamp),
  ADD INDEX user_timestamp (rev_user,rev_timestamp),
  ADD INDEX usertext_timestamp (rev_user_text,rev_timestamp),
  ADD INDEX page_user_timestamp (rev_page,rev_user,rev_timestamp);
ALTER TABLE text
  CHANGE old_id old_id INTEGER UNSIGNED AUTO_INCREMENT;
HERE

# Run standard post import cleanup
cd /srv/mediawiki
php maintenance/update.php

Notes[edit]


See also[edit]

言語: English  • 日本語