Предоставляет ли служба баз данных google firestore резервную копию? Если да, то как мне сделать резервную копию базы данных и как мне восстановить в случае ошибки?
Новая база данных Firestore - Как сделать резервную копию
Ответ 1
Обновление: теперь можно выполнять резервное копирование и восстановление Firebase Firestore, используя службу экспорта и импорта Cloud Firestore
Вы делаете это путем:
-
Создайте хранилище Cloud Storage для вашего проекта - убедитесь, что оно является региональным в us-central1 или 2/multi региональном типе хранилища.
-
Настройте 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]'
ИМПОРТИРОВАТЬ
Импортируйте все, вызвав gcloud alpha firestore import gs://[BUCKET_NAME]/[EXPORT_PREFIX]/
где [BUCKET_NAME] и [EXPORT_PREFIX] указывают на местоположение ваших файлов экспорта. Например - gcloud alpha firestore import gs://exports-bucket/2017-05-25T23:54:39_76544/
Импортируйте конкретную коллекцию, вызвав: gcloud alpha firestore import --collection-ids='[COLLECTION_ID_1]','[COLLECTION_ID_2]' gs://[BUCKET_NAME]/[EXPORT_PREFIX]/
Полные инструкции доступны здесь: https://firebase.google.com/docs/firestore/manage-data/export-import
Ответ 2
Обновление от июля 2018 года. Облачное хранилище пожаров теперь поддерживает управляемый импорт и экспорт данных. Смотрите документацию для более подробной информации:
https://firebase.google.com/docs/firestore/manage-data/export-import
[Гуглер здесь] Нет, сейчас мы не предлагаем управляемое резервное копирование или сервис импорта/экспорта. Это то, что мы определенно предложим в будущем, мы просто не подготовили его к первому бета-релизу.
Лучший способ сделать резервную копию прямо сейчас - это написать свой собственный скрипт, используя наши серверные SDK для Java/Python/Node.js/Go, и будет достаточно просто загрузить все документы из каждой коллекции и записать их обратно, если вам нужно.
Ответ 3
https://www.npmjs.com/package/firestore-backup
Является инструментом, который был создан для этого.
(я не создал его, просто добавив его здесь, так как люди найдут этот вопрос)
Ответ 4
Я использую следующие обходные пути, чтобы ежедневно делать резервные копии в хранилище:
Я установил это глобально: 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"
Ответ 5
Я написал инструмент, который просматривает коллекции/документы базы данных и экспортирует все в один файл json. Кроме того, он также импортирует ту же структуру (полезно для клонирования/перемещения баз данных Firestore). Он опубликован в виде пакета NPM. Не стесняйтесь попробовать и дать некоторую обратную связь.
Ответ 6
Решение с использованием 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: не удалось импортировать библиотеку Cloud Firestore для 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)
Ответ 7
Где я могу найти учетные данные Сертификат @Robin Manoli Я нахожусь в настройках проекта, и я не могу найти его. Пожалуйста помоги!!
Ответ 8
У меня возникла та же проблема, и я создал небольшой пакет npm, который позволяет вам создавать резервные копии по расписанию с помощью облачных функций. Он использует новую функцию импорта/экспорта Firestore.
const firestoreBackup = require('simple-firestore-backup')
exports.firestore_backup = functions.pubsub.schedule('every 24 hours').onRun(firestoreBackup.createBackupHandler())
Извлекает полный ридми о том, как настроить его, это супер просто!
Ответ 9
Вот мой 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();
}
}
Надеюсь, это поможет
Ответ 10
Вопрос старый, проекты хорошие, но у меня есть некоторые опасения по поводу резервного копирования.
1 - Для пользователей Blaze Plan (бесплатно) официальное решение запрещено.
2-Так как пользователи Free имеют квоту чтения в 50 тыс. В день, ограничение может быть проблемой в реальных и больших базах данных.
3-Насколько я исследовал, большинство проектов не имеют ограничения по времени, загружая одни и те же данные при каждом запуске.
4-Не лучше ли сохранить коллекции в виде папок и каждый документ в виде отдельного файла, а также получать только обновленные документы и напрямую заменять файл.
Я, вероятно, реализую свое собственное решение, но просто интересно ваши мысли :)