Firestoreのexportを使ってデータのバックアップができるようになりましたが、実際にできるか確認した際に気づいたことを書きます。
※ export/import方法についてはこちらになります。
import実行後のドキュメントの状況
Firestore中のドキュメントに関して、export後の操作とimport後の状態は次の通りです。
ドキュメントの種類 | import後の状態 |
---|---|
export後に修正したドキュメント | export時の状態に戻る |
export後に削除したドキュメント | export時のものが復元される |
export後に追加したドキュメント | そのまま残る |
「import」になるのでexport後に追加されたドキュメントはそのまま残ります。
Cloud FunctionsのonUpdateが発火する
importの際に、FirestoreをイベントトリガーにするCloud Functionsがいる場合は注意が必要です。
export後に修正されたドキュメントが、importによってexport前に戻る際にonUpdateが発火します。
しかし一方、export後に削除されたドキュメントが、importによって復元される際にはonCreateは発火しません。
この理由は理解できていないのですが、自分の環境で確認した際はそのような振る舞いをしていました。
collection-idsを指定した場合サブコレクションはexportされない(※追記あり)
collection-idsオプションを指定すると、特定のコレクションだけexportできるのですが、サブコレクションはexportされないようです。
例えば次のようにコマンドを打った場合、exportの対象はusersコレクション中のドキュメントが直接もつフィールドのみになります。もしusersのドキュメントにfollowersというサブコレクションがあった場合、followersは復元されません。
$ gcloud alpha firestore export gs://firestore-export --collection-ids='users'
$ gcloud alpha firestore import --collection-ids='users' gs://firestore-export/2018-11-01T00:00:00_00000/
ちなみにimportの際にcollection-idsを指定しないとMissing input file
というエラーになってしまいました。
また、自分が試した限りではcollection-idsはトップにあるコレクションでないとimportできませんでした。
2020/4/25追記
collection-idsはcollection groupに対して行われるようです。なので、usersとは別にfollowersをexportすれば、サブコレクションも対応できそうです。
exportでFirestore全体のバックアップを行うには
Firestoreの状態を完全に副作用なくexport時の状態にするには次のような手順になると思います。
- export/importはcollection-idsを指定せずに実行
- importは全データを削除してから実行
状況によってはcollection-ids指定してもいいですし、全データ削除せずにimportして大丈夫ですが、もし上の手順で行う場合は別環境でシミュレーションしてみた方がよさそうです。
最後に
まだFirestoreはベータですし、この辺りは振る舞いが変わる可能性が十分あると思いますので、Firestoreを導入する際にはバックアップ・リストアできるかテストしてみることをオススメします。