google firestore数据库服务是否提供备份? 如果是这样,我如何备份数据库以及如何在出现错误时进行恢复?
答案 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
您可以通过以下方式进行操作:
Create a Cloud Storage bucket for your project-确保它是us-central1或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; }
导出
通过致电 全部导出
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)
答案 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包发布。请随意尝试并提供一些反馈。
答案 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数据的选项:
缺点:
- 难以/无法解析备份文件。
- 您必须设置gcloud cli。
- 它不在本地备份;而是将其备份到云中,然后可以将其下载。 (根据您的需要,也可以视为优势)
这是我通常推荐的。 (弊端)
缺点:
- 很久没有更新了。
我目前正在使用并推荐选项2(node-firestore-import-export),但是上面的任何选项都可以完成工作。
其他选项:(不推荐)
python-firebase-admin-firestore-backup
缺点:
- 仅备份;无法从其创建的备份中还原。
- 很久没有更新了。
缺点:
- 仅备份;无法从其创建的备份中还原。