Новая база данных Firestore - Как сделать резервную копию

Предоставляет ли служба баз данных google firestore резервную копию? Если да, то как мне сделать резервную копию базы данных и как мне восстановить в случае ошибки?

Ответ 1

Обновление: теперь можно выполнять резервное копирование и восстановление Firebase Firestore, используя службу экспорта и импорта Cloud Firestore

Вы делаете это путем:

  1. Создайте хранилище Cloud Storage для вашего проекта - убедитесь, что оно является региональным в us-central1 или 2/multi региональном типе хранилища.

  2. Настройте 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. Не стесняйтесь попробовать и дать некоторую обратную связь.

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

Ответ 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-Не лучше ли сохранить коллекции в виде папок и каждый документ в виде отдельного файла, а также получать только обновленные документы и напрямую заменять файл.

Я, вероятно, реализую свое собственное решение, но просто интересно ваши мысли :)