Firestore新数据库 - 如何备份

时间:2017-10-14 16:10:51

标签: backup google-cloud-firestore

google firestore数据库服务是否提供备份? 如果是这样,我如何备份数据库以及如何在出现错误时进行恢复?

10 个答案:

答案 0 :(得分:26)

2018年7月更新:Cloud Firestore现在支持托管数据导入和导出。有关详细信息,请参阅文档:

https://firebase.google.com/docs/firestore/manage-data/export-import

[Googler here] 不,现在我们不提供托管备份或导入/导出服务。这是我们将来肯定会提供的,我们只是没有为最初的Beta版本做好准备。

现在备份的最佳方法是使用我们的Java / Python / Node.js / Go服务器SDK编写自己的脚本,从每个集合下载所有文档并在需要时将其写回应该相当简单到。

答案 1 :(得分:23)

更新:现在可以使用Cloud Firestore托管的导出和导入服务备份和还原Firebase Firestore

您可以通过以下方式进行操作:

  1. Create a Cloud Storage bucket for your project-确保它是us-central1或2 /桶的多区域类型中的区域

  2. 使用public static int getNum (String fileName, String word) { Scanner sc = new Scanner(System.in); int lineNum = 0; FileInputStream fileStrm = null; InputStreamReader rdr; BufferedReader bufRdr; String line; try { fileStrm = new FileInputStream (fileName); rdr = new InputStreamReader (fileStrm); bufRdr = new BufferedReader (rdr); line = bufRdr.readLine(); while (line != null) { String firstWord = processString(line); if(firstWord.equalsIgnoreCase(word)) //this submodule i going to get the number to create each array like e.g. how many states so that it can create it in country object { lineNum++; line = bufRdr.readLine() ; } } fileStrm.close(); } catch (IOException e) { if (fileStrm != null) { try { fileStrm.close(); } catch(IOException ex2) { System.out.println("This is Error"); } } System.out.println("error reading file !!" +e.getMessage()); } return lineNum; }

  3. 为您的项目设置 gcloud

导出

通过致电

全部导出 gcloud config set project [PROJECT_ID]导出特定收藏集使用 gcloud alpha firestore export gs://[BUCKET_NAME]

导入

通过致电

全部导入 gcloud alpha firestore export gs://[BUCKET_NAME] --collection-ids='[COLLECTION_ID_1]','[COLLECTION_ID_2]' [BUCKET_NAME]和[EXPORT_PREFIX]指向导出文件的位置。例如-gcloud alpha firestore import gs://[BUCKET_NAME]/[EXPORT_PREFIX]/

导入特定集合,方法是: gcloud alpha firestore import gs://exports-bucket/2017-05-25T23:54:39_76544/

此处提供完整说明: https://firebase.google.com/docs/firestore/manage-data/export-import

答案 2 :(得分:15)

https://www.npmjs.com/package/firestore-backup

是一个为此而创建的工具。

(我没有创建它,只是在这里添加它,因为人们会发现这个问题)

答案 3 :(得分:6)

我正在使用以下解决方法来进行每日firestore备份:

我在全球范围内安装了这个:https://www.npmjs.com/package/firestore-backup-restore

我有一个看起来像这样的cron作业:

0 12 * * *  cd ~/my/backup/script/folder && ./backup-script.sh

我的backup-script.sh看起来像这样:

#!/bin/sh

. ~/.bash_profile

export PATH=/usr/local/bin/

dt=$(/bin/date '+%d-%m-%Y %H:%M:%S');
echo "starting backup for $dt"
firestore-backup-restore -a ~/path/to/account/credentials/file.json -B ./backups/"$dt"

答案 4 :(得分:4)

我编写了一个遍历数据库集合/文档的工具,并将所有内容导出到一个json文件中。此外,它还将导入相同的结构(有助于克隆/移动Firestore数据库)。它作为NPM包发布。请随意尝试并提供一些反馈。

https://www.npmjs.com/package/node-firestore-import-export

答案 5 :(得分:1)

使用 Python 2 的解决方案。

https://github.com/RobinManoli/python-firebase-admin-firestore-backup上分叉

首先安装和设置Firebase Admin Python SDK:https://firebase.google.com/docs/admin/setup

然后将其安装在您的python环境中:

pip install firebase-admin

安装Firestore模块:

pip install google-cloud-core
pip install google-cloud-firestore

(来自ImportError: Failed to import the Cloud Firestore library for Python

Python代码

# -*- coding: UTF-8 -*-

import firebase_admin
from firebase_admin import credentials, firestore
import json

cred = credentials.Certificate('xxxxx-adminsdk-xxxxx-xxxxxxx.json') # from firebase project settings
default_app = firebase_admin.initialize_app(cred, {
    'databaseURL' : 'https://xxxxx.firebaseio.com'
})

db = firebase_admin.firestore.client()

# add your collections manually
collection_names = ['myFirstCollection', 'mySecondCollection']
collections = dict()
dict4json = dict()
n_documents = 0

for collection in collection_names:
    collections[collection] = db.collection(collection).get()
    dict4json[collection] = {}
    for document in collections[collection]:
        docdict = document.to_dict()
        dict4json[collection][document.id] = docdict
        n_documents += 1

jsonfromdict = json.dumps(dict4json)

path_filename = "/mypath/databases/firestore.json"
print "Downloaded %d collections, %d documents and now writing %d json characters to %s" % ( len(collection_names), n_documents, len(jsonfromdict), path_filename )
with open(path_filename, 'w') as the_file:
    the_file.write(jsonfromdict)

答案 6 :(得分:0)

我遇到了同样的问题,并创建了一个小的npm软件包,该软件包可让您使用Cloud Functions创建计划的备份。它使用Firestore的新导入/导出功能。

const firestoreBackup = require('simple-firestore-backup')
exports.firestore_backup = functions.pubsub.schedule('every 24 hours').onRun(firestoreBackup.createBackupHandler())

查看完整的readme设置方法,非常简单!

答案 7 :(得分:0)

这是我的Android Java代码,可轻松地为任何火警数据收集获取备份

首先使用此方法读取收集数据并将其存储到移动设备存储中的序列化文件中

private void readCollection(){
        ServerSide.db.collection("Collection_name")
                .get()
                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        if (task.isSuccessful()) {
                            HashMap alldata = new HashMap();
                            for (QueryDocumentSnapshot document : task.getResult()) {
                                alldata.put(document.getId(),document.getData());
//                                ServerSide.db.collection("A_Sentences_test").document(document.getId())
//                                        .set(document.getData());
                            }
                            try {
                                FileOutputStream fos = openFileOutput("filename.txt", Context.MODE_PRIVATE);
                                ObjectOutputStream os = new ObjectOutputStream(fos);
                                os.writeObject(alldata);
                                os.close();
                                fos.close();
                                Toast.makeText(MainActivity.this, "Stored", Toast.LENGTH_SHORT).show();

                                FileInputStream fis = openFileInput("filename.txt");
                                ObjectInputStream is = new ObjectInputStream(fis);
                                HashMap ad = (HashMap) is.readObject();
                                is.close();
                                fis.close();
                                Log.w("All data",ad+" ");

                            }catch (Exception e){
                                Log.w("errrrrrrrr",e+"");
                            }
                        } else {
                            Log.d("Colllllllllll", "Error getting documents: ", task.getException());
                        }
                    }
                });
    }

之后,您可以检查logcat数据是否正确序列化。这是还原代码

private void writeData(){
        try {
            FileInputStream fis = openFileInput("filename.txt");
            ObjectInputStream is = new ObjectInputStream(fis);
            HashMap ad = (HashMap) is.readObject();
            is.close();
            fis.close();
            for (Object s : ad.keySet()){
                ServerSide.db.collection("Collection_name").document(s.toString())
                        .set(ad.get(s));
            }
            Log.w("ddddddddd",ad+" ");
        }catch (Exception e){
            e.printStackTrace();
        }
    }

希望这会有所帮助

答案 8 :(得分:0)

问题很老,项目很好,但是我对备份有些担心。

1-对于免费计划用户(免费),官方解决方案是禁止的。

2-由于免费用户每天有50k的读取配额,所以对于实时数据库和大型数据库而言,限制可能是个问题。

3-据我检查,大多数项目都没有时间限制,因此每次运行时都下载相同的数据。

4-将集合另存为文件夹并将每个文档另存为单独的文件,然后仅获取更新的文档并直接替换文件会更好。

我可能会实现自己的解决方案,但只是想知道您的想法:)

答案 9 :(得分:0)

有几种备份Firestore数据的选项:

  1. gcloud backup commands官方。

      

    缺点:

         
        
    1. 难以/无法解析备份文件。
    2.   
    3. 您必须设置gcloud cli。
    4.   
    5. 它不在本地备份;而是将其备份到云中,然后可以将其下载。 (根据您的需要,也可以视为优势)
    6.   
  2. firestore-import-export

      

    这是我通常推荐的。 (弊端)

  3. firestore-backup-restore

      

    缺点:

         
        
    1. 很久没有更新了。
    2.   

我目前正在使用并推荐选项2(node-firestore-import-export),但是上面的任何选项都可以完成工作。


其他选项:(不推荐)

  1. python-firebase-admin-firestore-backup

      

    缺点:

         
        
    1. 仅备份;无法从其创建的备份中还原。
    2.   
    3. 很久没有更新了。
    4.   
  2. firestore-backup

      

    缺点:

         
        
    1. 仅备份;无法从其创建的备份中还原。
    2.