MediaWikiの設定 - 移行

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

MochiuWikiの移行

MochiuWiki(MediaWiki)のデータ移行をここに記載する。


前準備

MediaWikiディレクトリにあるimagesディレクトリのパーミッションと所有者および所有グループを以下のように変更する。

sudo chmod 777 images images/temp images/thumb images/archive
sudo chown -R <ユーザ名>:<ユーザグループ名> images/

または

sudo chmod 777 images images/temp images/thumb images/archive
sudo usermod -aG www-data "$USER"
sudo chown -R <ユーザ名>:www-data images/


次に、imagesディレクトリに存在する.htaccessファイルを以下のように編集する。

 # 修正前
 <IfModule rewrite_module>
        RewriteEngine On
        RewriteOptions inherit
        RewriteCond %{QUERY_STRING} \.[^\\/:*?\x22<>|%]+(#|\?|$) [nocase]
        RewriteRule . - [forbidden]
        # Fix for bug T64289
        Options +FollowSymLinks
 </IfModule>
 
 # 修正後
 <IfModule rewrite_module>
        RewriteEngine On
        RewriteOptions inherit
        RewriteCond %{QUERY_STRING} \.[^\\/:*?\x22<>|%]+(#|\?|$) [nocase]
        RewriteRule . - [forbidden]
        # Fix for bug T64289
        # Options +FollowSymLinks
 </IfModule>



MySQLのmysqldumpコマンドでバックアップする方法

バックアップの取得

MySQLが同じバージョンかつ文字コード等が同じ設定のMySQLのみ復元できる可能性がある。
また、違うバージョンのMediaWikiでは復元できない可能性がある。

コマンドラインからmysqldumpコマンドを使い手動でバックアップする。
特殊な文字が存在する場合の欠落を防ぐため、--hex-blobオプションでバイナリデータを16進数表記文字列に変換して出力する。

mysqldump -Q --host=$MYSQL_SERVER --user=$MYSQL_USER --password=$MYSQL_PASSWD --default-character-set=binary --hex-blob $MYSQL_DB_NAME > MochiuWiki_DB_backup_20200101.sql
または
mysqldump --host=$MYSQL_SERVER --user=$MYSQL_USER -p --default-character-set=utf8mb4 $MYSQL_DB_NAME > MochiuWiki_DB_backup_20200101.sql


もし、cronを使用して定期的にバックアップを取る場合、以下のように設定する。

crontab -e   # sudoは不要

# 毎月1日0時にバックアップを取得する
0 0 1 * * mysqldump -Q --host=$MYSQL_SERVER --user=$MYSQL_USER --password=$MYSQL_PASSWD --default-character-set=binary --hex-blob $MYSQL_DB_NAME > MochiuWiki_DB_backup_20200101.sql


バックアップのインポート

上記でバックアップしたデータベースを、既存のMySQLに復元する。

mysql --host=$MYSQL_SERVER --user=$MYSQL_USER --password=$MYSQL_PASSWD $MYSQL_DB_NAME < MochiuWiki_DB_backup_20200101.sql
または
mysql --host=$MYSQL_SERVER --user=$MYSQL_USER -p $MYSQL_DB_NAME < MochiuWiki_DB_backup_20200101.sql


インポートにおいて、以下に示すようなエラーが発生する場合がある。

ERROR at line 1: Unknown command '\-'.


まず、SQLファイルの先頭部分を確認する。

head -n 5 <SQLファイル名>.sql

# 出力例:

/*!999999\- enable the sandbox mode */
-- MariaDB dump 10.19  Distrib 10.6.18-MariaDB, for Linux (x86_64)
--
-- Host: <Webサーバのホスト名>    Database: <データベース名>
-- ------------------------------------------------------


\-の部分は、バックスラッシュとハイフンの組み合わせであり、これがUnknown commandエラーの原因である。

そのため、先頭行に不要なコメントをスキップ、または、削除することにより、SQLファイルのインポートが可能となる。

  • sedコマンドを使用して、問題の先頭行をスキップしてインポートする方法
    sed '1d' <SQLファイル名>.sql | mysql --host=<Webサーバのホスト名> --user=<データベースユーザ名> -p <データベース名>

  • 問題の先頭行を削除してインポートする方法
    sed '1d' <SQLファイル名>.sql > <先頭行を削除したSQLファイル名>.sql
    mysql --host=<Webサーバのホスト名> --user=<データベースユーザ名> -p <データベース名> < <先頭行を削除したSQLファイル名>.sql



dumpBackup.phpツールでバックアップする方法

バックアップの取得

maintenanceディレクトリで以下のコマンドを実行する。
履歴も含めてすべてのページをxmlで取得できる。

php maintenance/dumpBackup.php --full --uploads > MochiuWiki_backup_20200101.xml  // ページのエクスポート
または
php dumpBackup.php --current > MochiuWiki_backup_20200101.xml  // ページのエクスポート


バックアップのインポート

新しいサーバ側で作業する。
maintenanceディレクトリで以下のコマンドを実行する。
すべてのページをインポートできる。

php maintenance/importDump.php < MochiuWiki_backup_20200101.xml



画像をバックアップする方法

バックアップの取得

imagesディレクトリを圧縮するだけでよい。

tar -zcf /<出力するディレクトリ名>/MochiuWiki_images_backup_20200101.tar.gz /<MediaWikiのディレクトリ名>/images   // 添付ファイルのアーカイブ


バックアップのインポート

画像やその他のアップロードされたファイルを復元する。
なお、PHPがセーフモードの場合、importImages.phpが実行できないので注意する。

cd /var/www/html/mediawiki
mkdir tmp
mv MochiuWiki_images_backup_20200101.tar.gz tmp
cd tmp
tar -zxf MochiuWiki_images_backup_20200101.tar.gz


imagesディレクトリ下にあるファイルを単一のディレクトリにコピーする。

cd ../
mkdir tmpimages
cp tmp/images/*/*/* tmpimages


画像やその他のアップロードされたファイルをインポートする。

php maintenance/importImages.php --overwrite tmpimages/


レンタルサーバであるバリューサーバでは、以下のコマンドを実行する。

phpcli maintenance/importImages.php --overwrite tmpimages/

# MediaWikiのユーザ名を指定する場合
phpcli maintenance/importImages.php --overwrite tmpimages/ --user="<MediaWikiのユーザ名>"

# カスタムコメントを付加する場合
phpcli maintenance/importImages.php --overwrite tmpimages/ --comment="<コメント文>"

# サブディレクトリにあるファイルもアップロードする場合
# (importImages.phpスクリプトは、サブディレクトリ内のファイルを検索してアップロードしないため)
phpcli maintenance/importImages.php --overwrite tmpimages/ --search-recursively


サーバの移行ではなく、ディレクトリを移行するだけの場合は、以下に示すコマンドを実行してインポートすることができる。

php importImages.php --overwrite /<旧MediaWikiのディレクトリ>/images/1 --user="<MediaWikiのユーザ名>" --search-recursively
php importImages.php --overwrite /<旧MediaWikiのディレクトリ>/images/2 --user="<MediaWikiのユーザ名>" --search-recursively
php importImages.php --overwrite /<旧MediaWikiのディレクトリ>/images/3 --user="<MediaWikiのユーザ名>" --search-recursively
php importImages.php --overwrite /<旧MediaWikiのディレクトリ>/images/4 --user="<MediaWikiのユーザ名>" --search-recursively
php importImages.php --overwrite /<旧MediaWikiのディレクトリ>/images/5 --user="<MediaWikiのユーザ名>" --search-recursively
php importImages.php --overwrite /<旧MediaWikiのディレクトリ>/images/6 --user="<MediaWikiのユーザ名>" --search-recursively
php importImages.php --overwrite /<旧MediaWikiのディレクトリ>/images/7 --user="<MediaWikiのユーザ名>" --search-recursively
php importImages.php --overwrite /<旧MediaWikiのディレクトリ>/images/8 --user="<MediaWikiのユーザ名>" --search-recursively
php importImages.php --overwrite /<旧MediaWikiのディレクトリ>/images/9 --user="<MediaWikiのユーザ名>" --search-recursively
php importImages.php --overwrite /<旧MediaWikiのディレクトリ>/images/a --user="<MediaWikiのユーザ名>" --search-recursively
php importImages.php --overwrite /<旧MediaWikiのディレクトリ>/images/b --user="<MediaWikiのユーザ名>" --search-recursively
php importImages.php --overwrite /<旧MediaWikiのディレクトリ>/images/c --user="<MediaWikiのユーザ名>" --search-recursively
php importImages.php --overwrite /<旧MediaWikiのディレクトリ>/images/d --user="<MediaWikiのユーザ名>" --search-recursively
php importImages.php --overwrite /<旧MediaWikiのディレクトリ>/images/e --user="<MediaWikiのユーザ名>" --search-recursively
php importImages.php --overwrite /<旧MediaWikiのディレクトリ>/images/f --user="<MediaWikiのユーザ名>" --search-recursively


また、上記の処理において、シェルスクリプトを使用して簡略することもできる。

 #!/usr/bin/env sh
 
 # MediaWikiのユーザー名を指定
 MEDIAWIKI_USER="<MediaWikiのユーザ名>"
 
 # 旧MediaWikiのディレクトリを指定
 OLD_MEDIAWIKI_DIR="/<旧MediaWikiのディレクトリ>"
 
 # インポートするディレクトリの配列
 DIRECTORIES=("1" "2" "3" "4" "5" "6" "7" "8" "9" "a" "b" "c" "d" "e" "f")
 
 # 各ディレクトリに対してimportImages.phpを実行
 for dir in "${DIRECTORIES[@]}"; do
    php importImages.php --overwrite "$OLD_MEDIAWIKI_DIR/images/$dir" --user="$MEDIAWIKI_USER" --search-recursively
 done



文字列の置換

方法 1 (推奨)

まず、ReplaceTextの拡張ディレクトリに移動する。

cd /<Mediawikiのディレクトリ>/extensions/ReplaceText/maintenance


次に、replaceAll.phpファイルを実行する。

phpcli replaceAll.php "置換前の文字列" "置換後の文字列" --user <Wikiユーザ名>

# 試験実行することも可能
phpcli replaceAll.php "置換前の文字列" "置換後の文字列" --dry-run --user <Wikiユーザ名>

# --debugオプションを付加して、実行時の詳細を表示することも可能
phpcli replaceAll.php "置換前の文字列" "置換後の文字列" --user <Wikiユーザ名> --debug


EmbedVideoの拡張が存在する場合、以下に示すような警告 / エラーが出力される場合がある。

PHP Deprecated:  Premature access to service container


この時、以下に示すように修正する。

# ファイルのバックアップ
mv /<Mediawikiのディレクトリ>/extensions/EmbedVideo/EmbedVideo.hooks.php \
   /<Mediawikiのディレクトリ>/extensions/EmbedVideo/EmbedVideo.hooks_org.php


EmbedVideoのGitLabにアクセスして、修正済みのファイルをダウンロードする。
ダウンロードしたファイルをEmbedVideoの拡張ディレクトリにアップロードする。

mv EmbedVideo.hooks.php /<Mediawikiのディレクトリ>/extensions/EmbedVideo/


Replace Textの詳細を知りたい場合は、公式Webサイトを参照すること。

方法 2 (非推奨)

Mediawikiのトップページから、[特別ページ] - [文字列の置換]にアクセスして、文字列を置換する。

Replace Textは、MediaWikiのジョブとして構成されており、ユーザが同時に多くのアクションを実行する場合があるため、システムに負荷が掛からないようになっている。
これは、大規模な置換はすぐには行われず、完了までに数分、数時間、あるいはそれ以上掛かることを意味する。

ジョブはMediaWikiでページが閲覧されるたびに起動されるが、処理を速める(あるいは遅らせる)ために、ページが閲覧されたときに実行されるジョブの数を変更することができる。
したがって、優先順位の高い新しいジョブが無い場合、Replace Textは開始後すぐに停止する可能性がある。
全てのジョブをすぐに実行するには、maintenance/runJobs.phpファイルを実行する。

chmod u+x maintenance/runJobs.php
php74cli maintenance/runJobs.php



削除ページの履歴の完全な削除

全ての削除ページの履歴を完全に削除する場合は、まず、通常のページ削除機能を使用してページを削除する。

次に、deleteArchivedRevisions.phpメンテナンススクリプトを実行する。

phpcli maintenance/deleteArchivedRevisions.php --delete


これにより、削除されたリビジョンが保存されているアーカイブテーブルが消去されて、削除されたページのテキストも削除される。
アーカイブテーブルからエントリを直接削除する場合 (TRUNCATE TABLE archive;)、リンクされたテキストレコードを削除するために、purgeOldText.phpメンテナンススクリプトを使用する必要がある。

古いリビジョンを削除するだけでは、アクティブなWikiのデータの多くがテキストテーブルで占められているため、通常はあまり役に立たない。

データベースの設定によっては、リビジョンを削除した後、SQLコマンドOPTIMIZE TABLE text, archiveを実行してアーカイブすることもできる。