MediaWiki

出典: Fukudat

MediaWiki はこのページを作るのに使っているソフトウェア.ここでは Fedora Core に対するインストール・設定方法を説明する.

MediaWiki を使って執筆する方法はここを参考にすると良いだろう.

目次

Install

必ず必要なわけではないが,OS その他を最新のバージョンにしておこう.

su
yum update

途中で y/N を聞かれたら,もちろん y と答える.

次に,mediawikimysql-server パッケージをインストールする.mediawiki-math は数式を使う場合だけ必要になる.

su
yum install mediawiki mediawiki-math mysql-server

途中で y/N を聞かれたら,もちろん y と答える.

以上,たったこれだけ.必要な関連ソフトウェア(Apache とか PHP など)は自動的にインストールされる.

2007/5 現在,mediawiki-1.8.4-8.fc6 が最新の模様.

Set Up

サーバーの起動とその確認

もしまだならば,httpd (apache) と mysqld を起動する.そのためには,プルダウンの「デスクトップ-->システム設定-->サーバー設定-->サービス」を選択するか,またはコマンドラインから

/usr/bin/system-config-services
を実行する.root のパスワードを聞くダイアログが出てくるので,正しく答える.
画面設定
拡大
画面設定

バックグラウンドサービスの httpd と mysqld の両方にチェックを入れて,「保存」を押す.これは次回再起動したときに自動的に立ち上がるようにするため. また,今すぐ使うために,それらをひとつずつ選んで「開始」ボタンを押して起動する.

ブラウザで http://localhost/ にアクセスして,httpd が正常に動いているかどうか確認してみよう.(ブラウザを別のマシンで動かしている場合は,当然 mediawiki をインストールしているホストのアドレスを指定する.)

もしまだならば,次のコマンドで,mysql の root ユーザのパスワードを設定しておく.

mysqladmin -u root password <your-password>

もしこれが失敗したら,mysqld の起動に失敗しているので,mysqld がちゃんと動いているかどうか確認すべき.

Mediawiki のコピーを作成

Mediawiki は /var/www/mediawiki にインストールされている.

Webクライアントから http://server-name/mediawiki としてアクセスできるようにするため,/etc/httpd/conf.d/mediawiki.conf に

Alias /mediawiki /var/www/mediawiki

のように記述されているはずだ.

ここでは,インストールされたままのオリジナルをとって置くためと,短いパスにするために,上の Alias は削除し,以下のようにコピーを作成することにする.

以下のコマンドで /var/www/html/w の下に丸ごとコピーしよう.

su
mkdir /var/www/html/w                             # コピー先のディレクトリを作り
cd /var/www/mediawiki                             # コピー元のディレクトリに移動して
tar cf - . | ( cd /var/www/html/w; tar xvf - ) # tar でまとめてコピー

ここでは <document-root>/w にコピーしたので,wiki の URL は http://localhost/w/ となる. え,こんな URL は気に入らない? そうでしょう.でも後でちゃんと直すのでもう少し我慢すべし.

以下では Mediawiki をコピーした先のディレクトリ (上の例では /var/www/html/w) を $IP (installation path) と呼ぶことにする.

初期設定

いよいよ mediawiki の設定.

初期画面
拡大
初期画面

ブラウザで http://localhost/w/ にアクセスする.すると,ひまわりのイメージの下に「You'll have to set the wiki up first!」というリンクが表示されているはずなので,そこをクリックして設定画面に入る.

設定画面
拡大
設定画面

フォームの指示に従って穴を埋めていく.

  • Site name: インストールする wiki site の名前
  • Contact e-mail 管理者の e-mail アドレス
  • Language サイトのデフォルトの言語.日本語もある.
  • Copyright/license metadata コンテンツの著作権表示をどうするか.判らなかったら no license metadata を選んでおく.
  • Sysop account name/password/again この wiki サイトを管理する管理者 (sysop) のユーザ名とパスワードを入力する.Linux のユーザ/パスワードとは無関係.
  • Shared memory caching パフォーマンス向上のためのメモリーキャッシュの指定.no caching を選ぶ.
  • E-mail (general) e-mail の機能全体を enable/disable するスイッチ.パスワードを忘れたときにメールで送ったり,ユーザ同士がメールを送りあったり,コンテンツの変更を通知することができる.
  • User-to-user email ユーザ同士のメール送信を許可するかどうかの指定.
  • E-mail notification watchしているページが変更された知らせをメールするかどうかの指定.
  • E-mail address authentication 新規ユーザ登録の際に,メールでトークンを送り,そのトークンを持ってユーザが再び戻ってきたら,ユーザを認証するという手続きを踏むかどうかの指定.
インストール結果
拡大
インストール結果
  • MySQL server MySQL サーバーが動いているホスト名を指定する.普通は localhost だろう.
  • Database name データベース名を指定する.何でもいいのだが普通は wikidb だろう.
  • DB username/password/again MySQL のユーザ名を指定する.もし MySQL のユーザがなかったら,ここで作ってくれる.普通は wikiuser で,パスワードは適切に設定すべし.
  • Database table prefix ブランクで構わないが,もし,同じサーバーの同じDBに,複数のwikiを動かす可能性があるならば,何か指定する.変わった文字は避けた方がよい.たとえば 'mw_' などが推奨されている.
  • Database charset UTF-8 を指定する.
  • Super user root だろう.
  • Password 上記の MySQL ユーザや MySQL DBを自動で作らせるために,前のセクションで mysqladmin を使って設定した mysql の root ユーザのパスワードを設定する.もし上で設定した wikiuser がすでに存在しているのであれば,ブランクのままでOk.

最後に一番下の「Install!」ボタンを押す.インストール完了のメッセージが表示されるはず.もしエラーが出たら,エラーメッセージを見て入力する値を見直す.

完了!!
拡大
完了!!

最後に,(インストール成功の後のメッセージにある通り)$IP/config/LocalSettings.php を $IP/LocalSettings.php にコピーして,$IP/config をアクセスできないようにしたら出来上がり.

su
cd /var/www/html/w                # $IP (installation path) へ cd
mv config/LocalSettings.php .     # LocalSettings.php を移動
rm -rf config                     # confing を削除

以上で完了.

短いパス

ここまで完了すると,wiki の記事の URL は

http://localhost/w/index.php/記事のタイトル

となる.index.php が余計だし,/w というのもあまりかっこよくない.これを wikipedia のように

http://localhost/wiki/記事のタイトル

とする方法は以下の通り.

まず,LocalSettings.php を開き,$wgScriptPath, $wgScriptPath, $wgArticlePath を次のように変更する.

$wgScriptPath = "/w";
$wgScript = "/wiki/";
$wgArticlePath = "/wiki/$1";

次に,$IP/includes/Title.php に次の小さいパッチを当てる.

*** Title.php-  2007-02-21 11:22:50.000000000 +0900
--- Title.php   2007-05-24 19:12:02.000000000 +0900
***************
*** 853,859 ****
                                        if ( $query == '-' ) {
                                                $query = '';
                                        }
!                                       $url = "{$wgScript}?title={$dbkey}&{$query}";
                                }
                        }
  
--- 853,861 ----
                                        if ( $query == '-' ) {
                                                $query = '';
                                        }
!                                       #$url = "{$wgScript}?title={$dbkey}&{$query}";
!                                       $url = str_replace( '$1', $dbkey, $wgArticlePath );
!                                       $url.= "?{$query}";
                                }
                        }
  

これがないと,若干のリンクに index.php が残ってしまう.このステップは省略しても害はない.

最後に,/etc/httpd/conf/httpd.conf を編集して,一番最後に以下の行を追加する.

Alias /wiki "/var/www/html/w/index.php"

httpd.conf を書き換えたら,httpd を再起動する必要があることに注意.

$ sudo /sbin/service httpd restart

http://localhost/wiki/Main_Page のようなURLで記事にアクセスできるようになったはずだ.確かめてみよう.

Customize

以下は,特に記述がなければ $IP/LocalSettings.php を書き換える.

セキュリティ

  • ログインしないと編集できないようにする.
 $wgGroupPermissions['*']['edit'] = false;
  • 新しいユーザを登録できないようにする.
 $wgGroupPermissions['*']['createaccount'] = false;

これら両方を設定すると,すでに登録されている人以外は編集できない.つまり,他人は勝手に編集できない.

このように設定しても,管理者アカウント(WikiSysopなど)でログインすれば, Special:Userlogin から新規ユーザを登録することができる.

  • 匿名ユーザのアクセスできるページを制限する.
 $wgGroupPermissions['*']['read'] = false;
 $wgWhitelistRead = array ("Main Page", "Special:Userlogin");

こうすると、匿名ユーザはこの array に書かれたページしかアクセスできなくなる. この例では、Main Page、Special:Userlogin の二つのページ以外は読むことすらできなくなる.

2007/7/27 Pochiさんにご指摘いただき,誤りを訂正しました.

日本語でインストールした場合には,以下のように日本語でのページ名前に合わせること.

 $wgWhitelistRead = array ("メインページ", "特別:ユーザログイン");

選択的に編集を許可する方法

とはいっても,部分的には匿名ユーザにも編集を許可したい場合がある. そんなときは,includes/User.php を以下のように編集する.

*** User.php-   2007-02-21 11:22:50.000000000 +0900
--- User.php    2007-05-24 20:40:41.000000000 +0900
***************
*** 1354,1360 ****
                        return true;

                $this->loadFromDatabase();
!               return in_array( $action , $this->mRights );
        }

        /**
--- 1354,1366 ----
                        return true;

                $this->loadFromDatabase();
!               #return in_array( $action , $this->mRights );
!               if ( in_array( $action , $this->mRights ) )
!                       return true;
!               global $wgTitle;
!               if ( $action == 'edit' && $wgTitle->getNamespace() == NS_TALK )
!                       return true;
!               return false;
        }

        /**

この例では,$wgTitle->getNamespace() == NS_TALK とすることでノートのページの編集を匿名ユーザに許可している.

また,以下のようにすることでカスタムで追加した名前空間のページ (100以上の id番号を持つことで区別している)には匿名ではアクセスできないようにすることが可能である.

*** Title.php.orig      2006-07-18 19:13:06.000000000 +0900
--- Title.php   2006-07-18 19:16:18.000000000 +0900
***************
*** 999,1005 ****
                global $wgUser;

                if( $wgUser->isAllowed('read') ) {
!                       return true;
                } else {
                        global $wgWhitelistRead;

--- 999,1009 ----
                global $wgUser;

                if( $wgUser->isAllowed('read') ) {
!                       if ( $this->getNamespace() >= 100 ) {
!                               return $wgUser->isAllowed('viewprivate');
!                       } else {
!                               return true;
!                       }
                } else {
                        global $wgWhitelistRead;

ファイルアップロード

  • ファイルアップロードを可能にする.
 $wgEnableUploads = true;

さらに $IP/images/ ディレクトリを httpd のユーザ (普通 apache) が書き込みできるようにしておく必要がある.

 su
 chgrp -R apache $IP/images/
 chmod -R g+rwx $IP/images/
  • アップロードのファイルタイプの制限を緩めたい.
 $wgVerifyMimeType = false;
 $wgStrictFileExtensions = false;
  • アップロードファイルのサイズ制限(デフォルトは150KB)を変更したい.例えば 16M にする場合,
 $wgUploadSizeWarning = 16 * 1024 * 1024;

これだけではダメで,/etc/php.ini の次の行編集して,

 upload_max_filesize = 16M
 post_max_size = 20M

apache を再起動する.

 sudo apachectl restart
  • アップロードしたファイルの mime type を正しく判断するようにしたい.
 $wgMimeDetectorCommand = "file -bi";

これで mime type の判断に file コマンドを使用するようになる. これを設定しないと,ファイルタイプを誤認識してしまうようで,ファイルを正しくアップロードできない.

表示

  • 画面左上のLogoの変更
 $wgLogo = "$wgStylePath/common/images/wiki.png";
  • デフォルトスキンの変更

次の行の値を,'standard', 'nostalgia', 'cologneblue', 'monobook' のいずれかに変更する

 $wgDefaultSkin = 'monobook';
  • 数式モードを使用可能にする
 $wgUseTeX = true;

ただし $IP/images ディレクトリを httpd が書き込み可能にしておく必要あり.(upload 可能になっていればすでに完了しているはず.)

 su
 chgrp -R apache $IP/images/
 chmod -R g+rwx $IP/images/

mediawiki-math パッケージをインストールしておくことを忘れずに.後からインストールした場合は,/var/www/mediawiki/math を $IP の下にコピーしておく必要もあります.

 su
 cd /var/www/mediawiki
 tar cf - math | (cd $IP; tar xvf - )
  • ヘッダーにIPアドレスを表示しない

セキュリティで説明した方法で anonymous ユーザが編集できなくした場合,ページの先頭に表示されるIPアドレスは不要でしょう.

 $wgShowIPinHeader = false;

とすると表示されなくなる.

Main Page

MediaWiki:Mainpage を編集すると,変更可能になっている.このサイトでは Top をメインページにしている.

この手の MediaWiki: 名前空間のタグはシステムメッセージで,Special:Allmessagesにリストされている.とてもたくさんある.

Sidebar

MediaWiki:Sidebar を開くと,そこに Sidebar に表示されるアイテムがリストされてる. デフォルトでは,

 *  navigation
 ** mainpage|mainpage
 ** portal-url|portal
 ** currentevents-url|currentevents
 ** recentchanges-url|recentchanges
 ** randompage-url|randompage
 ** helppage|help
 ** sitesupport-url|sitesupport 

こんな感じになっているはず.

1段目の項目ごとにボックスが分る.

2段目のレベルに

** mainpage|mainpage

書かれていると,それは

{{MediaWiki:mainpage}}|{{MediaWiki:mainpage}}

と同じ意味になる.

名前空間

  • 新規作成

新しい名前空間 (namespace) を作成するには,includes/DefaultSettings.php から $wgExtraNamespaces と $wgNamespacesWithSubpages を LocalSettings.php にコピーしてきて,以下のように書き換える.(ここでは,Private という名前空間を追加すると仮定)

 $wgExtraNamespaces = array(
     100 => "Private",
     101 => "Private_Talk"
  );
 $wgNamespacesWithSubpages = array(
     NS_TALK => true,
     ...
     100 => true,
     101 => true
  );

ここで,100 とか 101 というのは名前空間のid番号で,ユーザが自由に使ってよいのは 100 以降.偶数は実際のページ用,奇数は Talk ページに使うのが習慣となっている.

新しく作った名前空間で Sub Page を使わないのであれば,2番目の変数 ($wgNamespacesWithSubspaces) のカスタマイズは不要.

  • サーチ

新しく作られた名前空間は,サーチの対象にならない.サーチの対象にしたい場合は,やはり includes/DefaultSettings.php から $wgNamespacesToBeSearchedDefault をコピーしてきて,

 $wgNamespacesToBeSearchedDefault = array(
     ...
     100 => true,
     101 => true
  );

と書き換える.

InterWiki

Wiki間で相互にリンクを張る仕組みを Interwiki linking と言う.←このリンクも Interwiki リンクである.この例では,[[meta:Help:Interwiki linking]] と記述することで,meta のサイト(http://meta.wikimedia.org/wiki/Main_Page) で [[Help:Interwiki linking]] を開くという意味になる.

また本家 Wikipedia では [[en:MediaWiki]] と記述すると,英語 (en) のサイトで MediaWiki のページを開くことを意味する.これも同じ仕組みでできている.

では,wikibooksのサイトや英語のサイトがどこにあるのかは,どこに記述されているのだろうか.

実は MySQL のデータベースの interwiki テーブルに格納されていた.

mysql -u root
mysql> connect wikidb;
mysql> select * from interwiki;
+---------------------+-----------------------------------------------------------------------------------+----------+----------+
| iw_prefix           | iw_url                                                                            | iw_local | iw_trans |
+---------------------+-----------------------------------------------------------------------------------+----------+----------+
| abbenormal          | http://www.ourpla.net/cgi-bin/pikie.cgi?$1                                        |        0 |        0 |
| acadwiki            | http://xarch.tu-graz.ac.at/autocad/wiki/$1                                        |        0 |        0 |
| acronym             | http://www.acronymfinder.com/af-query.asp?String=exact&Acronym=$1                 |        0 |        0 |
| advogato            | http://www.advogato.org/$1                                                        |        0 |        0 |
| aiwiki              | http://www.ifi.unizh.ch/ailab/aiwiki/aiw.cgi?$1                                   |        0 |        0 |
| alife               | http://news.alife.org/wiki/index.php?$1                                           |        0 |        0 |
| annotation          | http://bayle.stanford.edu/crit/nph-med.cgi/$1                                     |        0 |        0 |
| annotationwiki      | http://www.seedwiki.com/page.cfm?wikiid=368&doc=$1                                |        0 |        0 |
| arxiv               | http://www.arxiv.org/abs/$1                                                       |        0 |        0 |
| aspienetwiki        | http://aspie.mela.de/Wiki/index.php?title=$1                                      |        0 |        0 |
| bemi                | http://bemi.free.fr/vikio/index.php?$1                                            |        0 |        0 |
| benefitswiki        | http://www.benefitslink.com/cgi-bin/wiki.cgi?$1                                   |        0 |        0 |
| brasilwiki          | http://rio.ifi.unizh.ch/brasilienwiki/index.php/$1                                |        0 |        0 |
| bridgeswiki         | http://c2.com/w2/bridges/$1                                                       |        0 |        0 |
(以下略)

このテーブルを Web から操作するスクリプトは用意されていないようだ.

このテーブルに新しいエントリを追加すると 1カラム目の iw_prefix を使った [[iw_prefix:title]] というタグが 2カラム目の iw_url へのリクエストに置き換えられる.

google: なんていうタグもあるので,[[google:Takeshi,Fukuda]] と書くと,Takeshi Fukuda を google 検索してくれる.検索語の間の区切りはスペースが使えないことに注意.スペースはすべてアンダーバー '_' に変換されてしまう.+ と書きたいところだが,これもエスケープされてしまうため,ここでは ',' を使用している.良い方法があるなら知りたい.

言語のページで,例えば <httpd-document-root>/wiki/en に英語版 MediaWiki をインストールし,<httpd-document-root>/wiki/ja に日本語版 MediaWiki をインストールしておいたとする(インストール時に別の MySQL database を指定したか,または同じ database でも別の table prefix を指定すれば複数導入可能.ここでは,en_, ja_ をtable prefix として指定したと仮定する.) すると,次のコマンドを実行すると

mysql -u root
insert into en_interwiki values('ja', '/wiki/ja/index.php/$1', 1, 0);
insert into ja_interwiki values('en', '/wiki/en/index.php/$1', 1, 0);

英語版で 'ja:', 日本語版で 'en:' が使用可能となり,そのタグが現れたページでは,サイドバーに「他の言語」ボックスが現れ,リンクが張られる.記述した場所には何も現れないので注意.他言語のページを本文中のリンクとして参照したい場合は,言語タグの前にコロン':' をつける.例えば [[:en:MediaWiki]] という感じ.

このサイトでは,

replace into ja_interwiki values
('citeseer', 'http://citeseer.csail.mit.edu/cs?q=$1', 0,  0),
('en', '/wiki/en/index.php/$1', 0,  0),
('google', 'http://www.google.com/search?q=$1', 0,  0),
('ja', '/wiki/ja/index.php/$1', 0,  0),
('wiki', 'http://en.wikipedia.org/wiki/$1', 0,  0),
('wiki-ja', 'http://ja.wikipedia.org/wiki/$1', 0,  0),
('meta', 'http://meta.wikimedia.org/wiki/$1', 0, 0);

replace into en_interwiki values
('citeseer', 'http://citeseer.csail.mit.edu/cs?q=$1', 0,  0),
('en', '/wiki/en/index.php/$1', 0,  0),
('google', 'http://www.google.com/search?q=$1', 0,  0),
('ja', '/wiki/ja/index.php/$1', 0,  0),
('wiki', 'http://en.wikipedia.org/wiki/$1', 0,  0),
('wiki-ja', 'http://ja.wikipedia.org/wiki/$1', 0,  0),
('meta', 'http://meta.wikimedia.org/wiki/$1', 0, 0);

としている.

Template Parameter

テンプレートの定義の中で,{{{変数|デフォルト値}}} と書くとテンプレートの呼び出しがパラメータとして変数を含めばその値に,含まなければデフォルト値に置き換えるという指定ができる. ところが,FC4 が採用している mediawiki 1.5.8 ではテンプレートのパラメータにデフォルト値を使用することができない.

$IP/include/Parser.php に対する以下のような簡単なパッチでこの機能が使えるようになった.

*** Parser.php.orig	2006-03-27 04:38:24.000000000 +0900
--- Parser.php	2006-08-27 22:35:36.000000000 +0900
***************
*** 1994,2000 ****
  
  		if ( $this->mOutputType == OT_HTML || $this->mOutputType == OT_WIKI ) {
  			# Argument substitution
! 			$text = preg_replace_callback( "/{{{([$titleChars]*?)}}}/", array( &$this, 'argSubstitution' ), $text );
  		}
  		# Template substitution
  		$regex = '/(\\n|{)?{{(['.$titleChars.']*)(\\|.*?|)}}/s';
--- 1994,2001 ----
  
  		if ( $this->mOutputType == OT_HTML || $this->mOutputType == OT_WIKI ) {
  			# Argument substitution
! 			# $text = preg_replace_callback( "/{{{([$titleChars]*?)}}}/", array( &$this, 'argSubstitution' ), $text );
! 			$text = preg_replace_callback( "/{{{([$titleChars]*?)(\\|[^}]*)?}}}/", array( &$this, 'argSubstitution' ), $text );
  		}
  		# Template substitution
  		$regex = '/(\\n|{)?{{(['.$titleChars.']*)(\\|.*?|)}}/s';
***************
*** 2428,2433 ****
--- 2429,2436 ----
  
  		if ( array_key_exists( $arg, $inputArgs ) ) {
  			$text = $inputArgs[$arg];
+ 		} elseif ( $this->mTitle->getNamespace() != NS_TEMPLATE && $matches[2] ) {
+ 			$text = substr( $matches[2], 1 );
  		}
  
  		return $text;

たった3行なので手でパッチをあてるか,このテキストをファイル /tmp/foo.txt にコピーして,

cd $IP/include
patch < /tmp/foo.txt

で完了.

最初の文字に小文字を許す

デフォルトでは,記事の最初の文字がアルファベットがくると大文字に変換してくれる. これが迷惑だという場合は,次のように設定する.

$wgCapitalLinks = false;

このようにすると,小文字の記事を作ることができるようになる. それと同時に,大文字・小文字を区別する様になるので, [[mediaWiki]]や[[Mediawiki]]は[[MediaWiki]]と異なるものを記事を指すこととなる.途中で変更するのはやめたほうがよいだろう.

LocalSettings.php への変更例

すべてまとめると,LocalSettings.php には以下のような行が追加されていることになる.

...途中から...
$wgDiff3 = "/usr/bin/diff3";

## BEGIN customization

# security
$wgGroupPermissions['*']['edit'] = false;
$wgGroupPermissions['*']['createaccount'] = false;

# file upload
$wgEnableUploads = true;
#$wgVerifyMimeType = false;
#$wgStrictFileExtensions = false;
$wgUploadSizeWarning = 16 * 1024 * 1024;
$wgMimeDetectorCommand = "file -bi";
$wgUseTeX = true;
$wgShowIPinHeader = false;

# namespace
$wgExtraNamespaces = array (
        100 => "Private",
        101 => "Private_Talk"
);
$wgNamespacesWithSubpages = array(
        NS_TALK           => true,
        NS_USER           => true,
        NS_USER_TALK      => true,
        NS_PROJECT_TALK   => true,
        NS_IMAGE_TALK     => true,
        NS_MEDIAWIKI_TALK => true,
        NS_TEMPLATE_TALK  => true,
        NS_HELP_TALK      => true,
        NS_CATEGORY_TALK  => true,
        NS_MAIN => true,
        100 => true,
        101 => true
);

## END customization

?>

Backup

Mediawiki のバックアップの取得・リストアに挑戦した結果をまとめる.

次の2つをそれぞれバックアップする必要がある.

  1. MySQL データベース ($wgDBname データベースの $wbDBprefix で始まるテーブル)
  2. Upload されたファイル ($IP/images のした)

DB のbackup

少なくとも2通りのバックアップ方法がある.(1) binary でバックアップを取る方法と,(2) mysqldump コマンドを使って SQL レベルでバックアップを取る方法. (1) のほうが速いし,バックアップファイルが小さくてすむと思われる.しかし手順が少し面倒.(2) はコマンドひとつで,しかも結果が目で見えて安心.

もうひとつ,Special:Export でページを XML としてエキスポートするなんてこともできるが,エキスポートするページをリストアップしなければならないので,特定の部分をバックアップしたい場合には使えるが,全体のバックアップには向かないと思う.

Binary backup

別の MySQL にリストアするなんて面倒なことを考えなければ,単純に mysqld を停止して,/var/lib/mysql の下を tar で固めて保存ればよい.mysqld を停止することを忘れずに.(まったくとめずにバックアップを取るためには,有償のコンポーネントが必要らしい.)

コマンドとしては,

mysqladmin shutdown    # または /sbin/service mysqld stop
cd /var/lib
su
tar cvfz /tmp/mysql-backup.tar.gz mysql
/sbin/service mysqld start

リストアはその逆に,

mysqladmin shutdown
cd /var/lib
su
tar xvfz /tmp/mysql-backup.tar.gz
/sbin/service mysqld start

という感じ.

SQL level backup

次のコマンドひとつで SQL文の入ったファイルができる.

mysqldump wikidb > /tmp/wikidb-backup.sql

オプションをつけることでテーブル単位のバックアップも可能.

リストアは単純に mysql にそのファイルを食わせれば良い.テキストファイルなので読める.

mysqladmin createdb wikidb   # もし db がないところから始めるならば
mysql wikidb < /tmp/wikidb-backup.sql

Uploaded file の backup

こちらは単純に $IP/images の下を tar で固めればよいでしょう.

cd /var/www/html/wiki   # $IP へ移動
tar cvfz /tmp/wiki-image-backup.tar.gz images

リストアは,

cd /var/www/html/wiki   # $IP へ移動
su
tar xvfz /tmp/wiki-image-backup.tar.gz

これらのファイルは,wikidb の image テーブルに情報が格納され,記事とのリンクが取られている.

Replication

MySQL は master-slave の一方向 replication をサポートしている. この機能を使って,MediaWiki の replication に挑戦.

replication がうまくいけば,

  • master が壊れても大丈夫.バックアップもそれほどシビアに取らなくてもよくなる.
  • 運用中でもバックアップ取得が可能になるので,バックアップのためにサイトを落とさなくて良い.
  • 負荷分散も可能(まあ個人サイトでは不要だろうけれど)

あくまで1方向 replication なので,アップデートは master でのみ可能

ただし,media ファイルはファイルなので,別の仕組みでコピーをとる必要がある. 多分 rsync で十分だろう.

Replication の Set Up

マスターにするサーバーで,レプリケーションの権限を設定する. wikiuser という mysql ユーザにレプリケーションを実行する権限を与えるには,

$ mysql
mysql> grant replication slave on *.* to wikiuser@'%' identified by '<password>';

とすればよい.

...あとは http://dev.mysql.com/doc/refman/4.1/ja/index.html あたりをみてがんばる.

Maintenance

$IP/maintenance/ にメンテナンス用のスクリプトが用意されている.コマンドラインから php コマンドを用いて実行する.

編集履歴の削除

以下のコマンドで古い版(old revision)が消去される.

cd $IP/maintenance/
php deleteOldRevisions.php --delete

さらに,最近更新したページに残る編集したことの記録を消去したい場合は,同じディレクトリで,

php rebuildrecentchanges.php

を実行しよう.

関連情報