ここのところ多忙で、まとめサイト(cbnanashi@GAE/J)への機能追加等もなかなか出来ず申し訳ありません。
App Engineのアプリケーションを開発するときの問題のひとつに、Datastoreのデータの取り扱いが面倒なことがあります。テストのために実サーバのデータを開発サーバに移したり、その逆を行ったりするのは、一苦労です。
GAE/J版のバックアップ/リストアツールは以前から近日リリース予定とされていますが、なかなかリリースされません。
そこでまとめサイトの更新を容易に行えるようにするため、まずはDatastoreのバックアップ/リストアのツールを簡単に作成してみました。当方のアプリケーションを前提としているため機能は限定的ですし、そもそも他の環境で動作するか分からないのですが、何かの役に立つかも知れませんので公開します。
正しく動作しない場合はご連絡頂ければ改善を努力しますが、各自改造して頂ければ幸いです。
■簡単な仕組み
App Engineのアプリケーションで動作するServletと、コマンドラインから実行するツールを組み合わせています。コマンドラインツールがServletと通信し、バックアップ/リストアを行います。
ServletのソースファイルとJARはこちらです。
コマンドラインツールのJARはこちらです。
ソースはこちらです。
■使い方
App Engineアプリケーション側の設定
バックアップ/リストアのServletをApp Engineのアプリケーションに設定します。
実サーバでは既存アプリケーションの新しいバージョンとして、バックアップ/リストアのみのアプリケーションをデプロイするのがよいでしょう。新しいApp Engineプロジェクトを作成してServletのソースファイルをコピーしてください。
開発環境ではアプリケーションにServletを追加します。既存のアプリケーションにServletのソースファイルをコピーし、web.xmlを修正して下さい(local_db.binをコピーしてもうまく動作しないようです)。
また、Jakarta Commonsのいくつかのコンポーネントを利用しますので、いずれの場合でも同梱されているJARをwar/WEB-INF/libに追加して下さい。
同梱のweb.xmlではBackupServletのURLは"/backup"に、RestoreServletのURLは"/restore"にマッピングしています。
コマンドラインツールの実行
次にバックアップ/リストア先のアプリケーションを起動し、コマンドラインからツールを実行します。バックアップは以下のように実行します。
java -jar JARのディレクトリ\entitybackup.jar ServletのURL [Kind名...]
Kind名は複数指定できます。省略すると統計情報から取得したすべてのKindが対象となります。
バックアップファイルはカレントディレクトリに"EntityのKind名.txt"というファイル名で作成されます。
リストアは以下のように実行します。
java -jar JARのディレクトリ\entityrestore.jar [-d] ServletのURL [Kind名...]
-dを指定するとDatastore上の同名のKindのEntityをすべて削除してからリストアします。-dを指定しないとキーが重複している場合のみ既存Entityを上書きします。
Kind名は複数指定できます。省略するとカレントディレクトリの"*.txt"ファイルのKindが対象となります。
リストアするデータはカレントディレクトリの"EntityのKind名.txt"というファイルになります。
コマンドラインから起動するのではなくEclipseでJavaプロジェクトを作成し、ソースをコピーして実行しても結構です。
■その他
- 対応しているプロパティの種類に制限があります。以下に対応しています。
- String、Long(int等もDatastore内ではLongとして保持)、Text、Blob、Date、Double、Key、Boolen、これらのList
- これ以外(User、EMail、GeoPt等)は対応していません。
- DatastoreのLow-level APIを用いています。JDOや、Slim3などの他の永続化機構を用いていると正しく動作しない可能性があります。
- バックアップは高速です(当方の環境では50MBを数分)。リストアは時間が掛かります(同じく30分程度)。リストア中はメンテナンス画面を出すなどの工夫をするとよいと思います。
- 実環境へのリストア(削除、登録)にはCPU時間をかなり消費しますのでご注意下さい。
- 認証を行っていませんのでURLさえ分かれば誰でもアクセスできます。不要な時には停止/削除する、URLを変えておく等の注意をして下さい。
- Kind情報の取得元のStatisticsは反映されるまで時間が掛かるとのことです。Kindが正しく取得できない場合は引数で与えて下さい。
- 各データファイルは以下の形式です。
- 各行はタブ区切りです。
- あるEntityの最初の行は必ず"__key__<tab>キー内容"です。
- キー内容は"KeyFactory.keyToStringの値;Kind;Name;Id"です。リストア時にはkeyToStringの値は無視されKind/Name/Idからキーが生成されます。
- その後、Entityの各プロパティがそれぞれ一行で出力されます。
- −行の形式は"プロパティ名<tab>型<tab>値"です。
- バイナリはBase64エンコードになります。文字列中の改行、タブ、"\"はそれぞれ\n、\t、\\にエスケープされます。
- 後はファイルをご覧下さい。
■ライセンス等
Apache License, Version 2.0でお願いします。
プログラムを使用したことによる一切の損害について責任を負いません。
各JARにはJakarta CommonsのJARを展開してclassファイルを同梱してあります。それぞれのライセンスはMETA-INFに格納してあります。