В настоящее время я экспортирую данные своего Firestore в подкаталог с метками времени в сегменте, используя код ниже. Он запускается в запланированной (пожарной) облачной функции.
import { client } from "../firebase-admin-client";
import { getExportCollectionList } from "./helpers";
export async function createFirestoreExport() {
const bucket = `gs://${process.env.GCLOUD_PROJECT}_backups/firestore`;
const timestamp = new Date().toISOString();
try {
const databaseName = client.databasePath(
process.env.GCLOUD_PROJECT,
"(default)"
);
const collectionsToBackup = await getExportCollectionList();
const responses = await client.exportDocuments({
name: databaseName,
outputUriPrefix: `${bucket}/${timestamp}`,
collectionIds: collectionsToBackup
});
const response = responses[0];
console.log(`Successfully scheduled export operation: ${response.name}`);
return response;
} catch (err) {
console.error(err);
throw new Error(`Export operation failed: ${err.message}`);
}
}
Это имеет то преимущество, что вы получите список экспорта, каждый из которых имеет свою собственную временную метку. Например, мой скрипт, который импортирует данные в BigQuery, определит последнюю временную метку и загрузит данные оттуда.
У этого подхода есть некоторые недостатки, я думаю. Нет возможности перечислять каталоги в облачном хранилище. Чтобы выяснить последнюю отметку времени, мне нужно получить список всех объектов (то есть всех файлов всех экспортов), а затем split
и reduce
этих путей, чтобы извлечь список уникальных отметок времени.
При сохранении экспорта данных за месяцы я могу себе представить, что эта операция становится совершенно неэффективной.
Поэтому я думаю о сохранении резервных копий в виде версионных файлов, но у меня нет опыта в этом. Если я правильно понимаю, с версионными файлами я могу экспортировать данные каждый раз в одно и то же место, и (настраиваемые) x версий файлов будут сохраняться в корзине. Затем у вас есть возможность прочитать любую из доступных версий, если это необходимо.
Сценарий импорта bigquery может загружать данные из одного и того же места каждый раз, автоматически получая последние данные экспорта.
Так что, на мой взгляд, это упростит вещи. Есть ли недостатки в использовании версионных файлов для резервного копирования данных? Это рекомендуемый подход?