Moodle1.9系からMoodle2.1系へのユーザ移行手順

Moodle1.9系からMoodle2.1系へのユーザ移行手順

- Hiroyuki H の投稿
返信数: 7

Moodle1.9系からMoodle2.1系への切替において、ユーザプロファイルなどのユーザ情報を2.1系に移行したいと手順を模索してみました。

ご承知の通り2.1系のマイグレーションについては、純正のモジュールのみを利用している場合はともかく、1.9系しか現状サポートされていないモジュールを利用している場合はサイト全体のアップグレード、またはコースのアップグレードがスムーズに行えない場合が多いです。

本学もこのような状況ですので、まずはユーザプロファイルなどのユーザ情報のみを移行可能であるかどうか検証してみました。(コースは移行しない

1) データ移行作業元のサイトを作成
既存のDBをダンプし、新たに別のDBにダンプファイルをインポートして複製します。
このDBを参照する1.9系の最新版のMoodleを、運用中のMoodleとは別のURLで別途構築します。
データディレクトリも別途作成し、運用中のMoodleデータディレクト配下のuser のみをコピーして参照するように設定しておきます。

標準モジュール以外は一切インストールしないでおきます。
元々運用していた1.9系のバージョンによっては、一度ここで1.9系最新版へのバージョンアップが実行されます。
以後、運用中のDBおよび運用中のMoodleのURLには一切アクセスしません。

2)  上記で作成した作業元DBより、mdl_user、およびmdl_userで始まる名前のテーブルをエクスポートします。

3) 一旦作業元DBを削除し、新たに空の同名のDBを作成します。

4)  ブラウザで作業元サイトにアクセスし、新規のインストールプロセスを実行します。

5)  作業元DBの、mdl_userおよびmdl_userで始まる名前のテーブルを空にします。

6) 2)でエクスポートしたSQLを作業元DBにインポートします。

7)  作業元DB全体をダンプファイルにエクスポートします。

8) Moodle2.1の最新版を構築(ブラウザでのインストールプロセスは実行しないでおく)した別サーバ(PHPなどの関係で、別サーバを立てることが多いのではないかと思います)に、7)の作業元DBのダンプファイル、および作業元サイトのデータディレクトリ配下のuserディレクトリをコピーします。

9) 作業元DBのダンプファイルのデータベース照合順序にutf8_general_ciが含まれる場合、この後のアップグレードプロセスに失敗することがあるため、全てのテーブルのデータベース照合順序をutf_unicode_ciに変換しておきます。参考
(データベース照合順序の変換にてエラーが発生したユーザが数名(5000名中10名弱)いましたので、該当するレコードはここで削除しました)
config.phpは最低限のものを用意しておきます。
$CFG->passwordsaltmainは、作業元サイトと同一にしておきます。

10) Moodle2.1を構築したURLにブラウザでアクセスし、アップグレートプロセスを実行します。標準モジュール以外は含まれていない状態なので、短時間で完了します。

11) 新しいMoodle2.1サイトにアクセスし、ユーザプロファイルが移行されていることを確認します。

なお、この手順では当然ながらユーザのロール、コースへの登録情報、コース等、ユーザ以外のデータは移行されません。
多々不具合がある手順かもしれませんが、ここまでたどり着くのに3日ほどかかりました。何かのご参考になれば幸いです。

評点平均: お役立ち度: ★★★★★★★ (2)
Hiroyuki H への返信

Re: Moodle1.9系からMoodle2.1系へのユーザ移行手順

- Tatsuya Shirai の投稿

 当方でも,そろそろMoodle1.9とMoodle2の併用に移行しようと思うのですが,やはりユーザ情報の複製の段階でとん挫しています.

 ここに書かれた方法以外はやはり存在しないのでしょうか.何か便利なブロックのようなものでパスワードやユーザのアイコン画像などと共に移行するためのツールなどあればとても助かるのですが.

 

Tatsuya Shirai への返信

Re: Moodle1.9系からMoodle2.1系へのユーザ移行手順

- Hiroyuki H の投稿

今ちょうど、2012年度に使っていたMoodle2.3のサイトから、Moodle2.4のさらのサイトにユーザープロファイルだけ移行できないかいろいろやっていたところです。

mdl_user_enrollment 以外の mdl_user_* テーブルを旧DBからエクスポートして、新DBにインポートすると、ほとんどのプロファイルは移行できるのですが、ユーザのアイコン画像はmdl_filesテーブルにいろいろ紐づけされていて一筋縄ではいかなさそうです。
バルクユーザ処理でユーザ一覧をダウンロードしても、アイコン画像は含まれないんですよね・・・。

参考になったのはこちらです
https://moodle.org/mod/forum/discuss.php?d=201445
ユーザアイコン画像のURLには各ユーザのcontextidが含まれるようになった、とのことなのでmdl_contextごと旧DBからエクスポートして新DBにインポートしたらプロファイルを移行することができました。

ただ不要なレコードもごっそりインポートしてしまっているので、いろいろゴミが残ってしまうのが悩みどころです。
ツール欲しいですね。

Hiroyuki H への返信

Re: Moodle1.9系からMoodle2.1系へのユーザ移行手順

- Tatsuya Shirai の投稿

いま考えている戦略は,

  1. Moodle1.9の旧サイトをコピー
  2. コースをすべて削除
  3. Moodle1.9 → Moodle2.2 → Moodle2.4とアップグレード
  4. 全ユーザを登録した空のコースを作成してバックアップ(ユーザデータ含む)
  5. 新規作成したまっさらなMoodle2.4にユーザーデータごとインポート.

です.SQLでデータを移行するのがちょっと(私の技能では)怖いので….

Tatsuya Shirai への返信

Re: Moodle1.9系からMoodle2.1系へのユーザ移行手順

- Tatsuya Shirai の投稿

一日がかりになってしまいましたが,一応,実験は完了しました.

 アイコン画像や基本項目すべてはコースをインポートした先のサイトに移行できました.

 ただし,

  • ユーザプロファイルに追加したフィールドのデータはコピーされない.
  • パスワードはすべて無効になる(「このアカウントは別のサーバからインポートされたため、パスワードが喪失しました。新しいパスワードをメールで設定するには、「続ける」をクリックしてください。」)
  • 認証の設定が手動登録に初期化される.
  • ユーザID(ユーザ名ではなく,内部で用いるユニークな整数)は変わってしまう.

という状態です.あまりメリットが無いですね.

 ここまで来て気付いたのですが,Moodle1.9のコピーの全コースを削除し,サードパーティのブロックやモジュールやフィルタをすべて削除,そしてMoodle2.2, Moodle2.4とアップデートしたサイトは,コンテンツ付きでアップグレードしたサイトよりは”少しはマシ”なのではないだろうか?

 Moodle1.7時代からのデータベースのゴミをMoodle2にアップグレードする際に一掃したかったのですが,ユーザデータの安全な引継ぎのためには,この折衷案も致し方ないかと思う次第.

 なお,この作業中に重大な失敗を犯してしまいました.Moodle1.9のコピーサイトを作成し,config.phpでmoodledataの場所をコピー側に設定したのですが,なぜかうっかりとMySQLのデータベースを変更し忘れていました.コースを片っ端から削除している途中で,本番サイトからコースが消えていることに気付きました.なに,バックアップがあるから大丈夫だ,と思っていたのですが,バックアップだと思っていたのは,Moodle1.9からMoodle2.*にアップグレードする練習用に構築したサイトのもの(しかも不完全にMoodle2へアップグレードした後のもの)でした….不定期にmysqldumpでダンプしていたのがコレでしたので,偶然残っていた1年前の正しいMoodle1.9サイトのデータまで戻ることになってしまいました.いやはや本当に怖いですね.私の場合は全学利用ではないので比較的ダメージは小さいのですが,それでも失ったモノは多いです.みなさん,お気を付け下さい...見事に人柱になりました^^;;;

Tatsuya Shirai への返信

Re: Moodle1.9系からMoodle2.1系へのユーザ移行手順

- Hiroyuki H の投稿

ご報告ありがとうございます。大変参考になりました。長く使ってきたMoodleを掃除するために、まっさらなMoodleにユーザプロフィールだけ移行したい、という要望って少なからずあるような気がするんですよね。
簡単な手順を確立しておきたいところです。

ただ、私自身もヘロヘロになってしまったので、思いついたことだけメモ代わりに書かせていただきます。

ユーザプロファイルに追加したフィールドは、予めまっさらなMoodle2.4のサイトにフィールドを定義しておいてもだめ、ということでしょうか。(バックアップファイルに含まれない?)

パスワードが無効になり更に「手動登録」に初期化される件ですが、Moodle2.4までアップグレードしたサイトと、まっさらなMoodle2.4のサイトのURLを同じにして(apacheのエイリアスを付け替えるなどして)、さらにconfig.phpのpasswordsaltmainを同一にすればクリアできそうな気がします(勘です)

ユーザIDが変わってしまうのがどの時点なのかによりますが、例えば

  • Moodle2.4までアップデートした状態で、一度「バルクユーザ処理」で全ユーザを選択してCSVでダウンロードしておく
  • 上記CSVをidフィールドでソートした後、欠けているid(削除済みユーザの番号など)をダミーユーザで埋める
  • 上記CSVを元にアップロード用のCSVを作成(これにはidは記載できない)
  • まっさらなMoodle2.4の「ユーザをアップロードする」でCSVアップロード

すると、結果的にidを一致させることができるような気がします。(順番に追加されるので)
ダミーユーザは後でまた「ユーザーをアップロードする」で別のダミーユーザだけのCSVをdeletedで流し込んで消せるはずです。
その上で、全ユーザのユーザデータを含むバックアップをリストアしてみるとか。
(リストア時に既存のユーザデータの上書きをしてくれるのであれば。ユーザデータを含むバックアップってあまり使ったことがないのでイマイチ把握していません)

Hiroyuki H への返信

Re: Moodle1.9系からMoodle2.1系へのユーザ移行手順

- Hiroyuki H の投稿

mdl_contextテーブルのエクスポート、インポートは無茶でした。
アイコン画像は確かに読み込めるのですが、他にいろいろ不具合が出る(あちこちでDBにcontextが無いと怒られる)ので止めたほうがいいです。

旧サイトから、ユーザアイコン画像を一括でダウンロードできる方法があれば(画像のファイル名がユーザIDになっていると素敵)新サイト側で一括で読み込めるのですが。

Hiroyuki H への返信

Re: Moodle1.9系からMoodle2.1系へのユーザ移行手順

- Hiroyuki H の投稿

ユーザ画像アイコンの移行方法について、別の方法でやっつけでやってみました。

Moodleの管理者権限で移行前のMoodleの下記URLにアクセスすると
http://MYMOODLE/userpix/
アイコン画像を持つユーザ一覧が表示されます。

Moodle2.3.2では、これは
http://MYMOODLE/user/profile.php?id=mdl_userテーブルのid
がプロファイルのページで
http://MYMOODLE/pluginfile.php/contextid/user/icon/standard/f2?rev=1
が小さいサムネイル画像に
http://MYMOODLE/pluginfile.php/contextid/user/icon/standard/f2?rev=1
がアイコン画像になっています。
contextidは、mdl_contextテーブルで、contextlevel=30, instanceid = mdl_userテーブルのidのフィールドに記録されているidです。
Moodle1.9では形式が異なりますが、userpixページは同じように存在しています。

http://MYMOODLE/userpix/  のソースを表示してHTMLとしてローカルコンピュータに保存し、imgリンクのf2をf1に置換して、管理者ユーザでログイン済みのfirefoxで開きます。
firefoxには、DownThemAll! ( https://addons.mozilla.jp/firefox/details/201 ) というプラグインがあり、HTML中に含まれる画像を一括でダウンロードすることができます。
DownThemAll!のフィルタに standard という文字列を定義して、一致した画像をすべてダウンロードする(※ ダウンロード上限値を1にする。同じ名前のファイルが存在する場合は名前の変更を設定。あらかじめダウンロード先フォルダにダミーのf1.pngを作っておく。)ことで、登録されているすべてのユーザアイコン画像をf1_001.pngからの連番で入手することができました。

先に作成したHTMLを加工して、f1_xxx.pngをユーザID.pngにリネームするバッチ( rename f1_xxx.png ユーザID.png の形式で)を作って一括でリネーム後、zipに圧縮して、新しいMoodleの「サイト管理/ユーザ/アカウント/ユーザ画像をアップロードする」から一括でアップロードします。

という手順でユーザアイコン画像の移行はできました。
もっとスマートな方法募集中です(こんなの毎年?やりたくない)