בדף הזה מוסבר איך להשתמש בשחזור מערכת מנקודה מסוימת בזמן (PITR) כדי לשמור ולשחזר נתונים ב-Cloud Firestore.
כדי להבין את המושגים של PITR, קראו את המאמר שחזור מערכת מנקודה מסוימת בזמן (PITR).
הרשאות
כדי לקבל את ההרשאות שדרושות לניהול הגדרות ה-PITR, בקשו מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בפרויקט שבו אתם רוצים להפעיל את ה-PITR:
- בעלים של Cloud Datastore (
roles/datastore.owner)
בתפקידים בהתאמה אישית, צריך לוודא שההרשאות הבאות ניתנו:
- כדי להפעיל את PITR כשיוצרים מסד נתונים:
datastore.databases.create - כדי לעדכן את הגדרות ה-PITR במסד נתונים קיים:
datastore.databases.update,datastore.databases.list - כדי לקרוא נתונים מ-PITR:
datastore.databases.get,datastore.entities.get,datastore.entities.list - כדי לייצא נתוני PITR:
datastore.databases.export - כדי לייבא נתוני PITR:
datastore.databases.import - כדי לשכפל מסד נתונים:
datastore.databases.clone
לפני שמתחילים
לפני שמתחילים להשתמש ב-PITR, חשוב לשים לב לנקודות הבאות:
- אי אפשר להתחיל לקרוא מ-7 ימים בעבר מיד אחרי שמפעילים את PITR.
- כדי להפעיל את PITR כשיוצרים מסד נתונים, צריך להשתמש בפקודה
gcloud firestore databases create. אי אפשר להפעיל את PITR כשיוצרים מסד נתונים באמצעות מסוף Google Cloud. - Cloud Firestore מתחיל לשמור גרסאות מהרגע שבו מפעילים את PITR.
- אחרי שמשביתים את ה-PITR, אי אפשר לקרוא נתוני PITR בחלון ה-PITR.
- אם תפעילו מחדש את PITR מיד אחרי שהשבתתם אותו, נתוני ה-PITR הקודמים לא יהיו זמינים יותר. כל נתוני ה-PITR שנוצרו לפני השבתת ה-PITR יימחקו אחרי תאריך התפוגה של ה-PITR.
- אם מחקתם בטעות נתונים בשעה האחרונה והתכונה PITR מושבתת, אתם יכולים לשחזר את הנתונים על ידי הפעלת PITR תוך שעה מהמחיקה.
- כל פעולת קריאה שמתבצעת על נתוני PITR שפג תוקפם נכשלת.
הפעלת PITR
לפני שמשתמשים ב-PITR, צריך להפעיל את החיוב בפרויקט ב-Google Cloud. רק פרויקטים בענן של Google שהחיוב מופעל בהם יכולים להשתמש בפונקציונליות של PITR.
כדי להפעיל את PITR במסד הנתונים:
המסוף
נכנסים לדף Databases במסוף Google Cloud.
בוחרים את מסד הנתונים הרצוי מרשימת מסדי הנתונים.
בתפריט הניווט, לוחצים על תוכנית התאוששות מאסון (DR).
לוחצים על עריכה כדי לערוך את ההגדרות.
מסמנים את התיבה Enable point-in-time recovery ולוחצים על Save.
הפעלת PITR כרוכה בעלויות אחסון. מידע נוסף זמין במאמר תמחור.
כדי להשבית את ה-PITR, מבטלים את הסימון בתיבה Enable point-in-time recovery בדף תוכנית התאוששות מאסון (DR) במסוף Google Cloud.
gcloud
מפעילים את PITR במהלך יצירת מסד הנתונים באמצעות הפקודה gcloud firestore databases create והפקודה --enable-ptir, באופן הבא:
gcloud firestore databases create\
--location=LOCATION\
--database=DATABASE_ID\
--type=firestore-native\
--enable-pitr
מחליפים את הערכים באופן הבא:
-
LOCATION– המיקום שבו רוצים ליצור את מסד הנתונים. -
DATABASE_ID– מוגדר למזהה מסד נתונים.
כדי להשבית את ה-PITR, משתמשים בפקודה gcloud firestore databases update באופן הבא:
gcloud firestore databases update\
--database=DATABASE_ID\
--no-enable-pitr
מחליפים את הערכים באופן הבא:
-
DATABASE_ID– מזהה מסד הנתונים או (default).
איך בודקים את תקופת השמירה ואת הזמן של הגרסה המוקדמת ביותר
המסוף
נכנסים לדף Databases במסוף Google Cloud.
בוחרים את מסד הנתונים הרצוי מרשימת מסדי הנתונים.
בתפריט הניווט, לוחצים על תוכנית התאוששות מאסון (DR).
בקטע הגדרות, שימו לב לתקופת השמירה ולזמן הגרסה המוקדמת ביותר.
- תקופת השמירה: התקופה שבה Cloud Firestore שומר את כל גרסאות הנתונים של מסד הנתונים. הערך הוא שעה אחת כש-PITR מושבת, ושבעה ימים כש-PITR מופעל.
- זמן הגרסה המוקדמת ביותר: חותמת הזמן המוקדמת ביותר שבה אפשר לקרוא גרסאות ישנות יותר של הנתונים בחלון ה-PITR. הערך הזה מתעדכן כל הזמן על ידי Cloud Firestore והופך ללא עדכני ברגע ששולחים שאילתה לגביו. אם אתם משתמשים בערך הזה כדי לשחזר נתונים, חשוב להביא בחשבון את הזמן שעובר מהרגע שבו נשלחת השאילתה על הערך ועד לרגע שבו אתם מתחילים את השחזור.
- שחזור מערכת מנקודה מסוימת בזמן (PITR): אם PITR מופעל, מוצג הערך
Enabled. אם PITR מושבת, יופיע הערךDisabled.
gcloud
מריצים את הפקודה gcloud firestore databases describe באופן הבא:
gcloud firestore databases describe --database=DATABASE_ID
מחליפים את DATABASE_ID במזהה מסד הנתונים או ב-'(default)'.
הנה הפלט:
appEngineIntegrationMode: ENABLED
concurrencyMode: PESSIMISTIC
createTime: '2021-03-24T17:02:35.234Z'
deleteProtectionState: DELETE_PROTECTION_DISABLED
earliestVersionTime: '2023-06-12T16:17:25.222474Z'
etag: IIDayqOevv8CMNTvyNK4uv8C
keyPrefix: s
locationId: nam5
name: projects/PROJECT_ID/databases/DATABASE_ID
pointInTimeRecoveryEnablement: POINT_IN_TIME_RECOVERY_DISABLED
type: FIRESTORE_NATIVE
uid: 5230c382-dcd2-468f-8cb3-2a1acfde2b32
updateTime: '2021-11-17T17:48:22.171180Z'
versionRetentionPeriod: 3600s
כאשר:
-
earliestVersionTime: חותמת הזמן של נתוני ה-PITR המוקדמים ביותר שנשמרו. -
pointInTimeRecoveryEnablement: מוצג הערךPOINT_IN_TIME_RECOVERY_ENABLEDאם PITR מופעל. אם PITR מושבת, יוצג הערךPOINT_IN_TIME_RECOVERY_DISABLEDאו שהשדהpointInTimeRecoveryEnablementלא יוצג. -
versionRetentionPeriod: משך הזמן שבו נתוני ה-PITR נשמרים, באלפיות השנייה. הערך יכול להיות שעה אחת כש-PITR מושבת, או שבעה ימים כש-PITR מופעל.
קריאת נתוני PITR
אפשר לקרוא נתוני PITR באמצעות ספריות הלקוח, שיטות API בארכיטקטורת REST או מחבר FirestoreIO Apache Beam.ספריות לקוח
Java
כדי לקרוא נתוני PITR, צריך להשתמש בטרנזקציה ReadOnly. אי אפשר לציין את readTime ישירות בקריאות.
מידע נוסף זמין במאמר עסקאות וכתיבות באצווה.
Firestore firestore = …
TransactionOptions options =
TransactionOptions.createReadOnlyOptionsBuilder()
.setReadTime(
com.google.protobuf.Timestamp.newBuilder()
.setSeconds(1684098540L)
.setNanos(0))
.build();
ApiFuture<Void> futureTransaction = firestore.runTransaction(
transaction -> {
// Does a snapshot read document lookup
final DocumentSnapshot documentResult =
transaction.get(documentReference).get();
// Executes a snapshot read query
final QuerySnapshot queryResult =
transaction.get(query).get();
},
options);
// Blocks on transaction to complete
futureTransaction.get();
צומת
כדי לקרוא נתוני PITR, צריך להשתמש בטרנזקציה של ReadOnly. אי אפשר לציין את readTime ישירות בקריאות.
מידע נוסף זמין במאמר עסקאות וכתיבות באצווה.
const documentSnapshot = await firestore.runTransaction(
updateFunction => updateFunction.get(documentRef),
{readOnly: true, readTime: new Firestore.Timestamp(1684098540, 0)}
);
const querySnapshot = await firestore.runTransaction(
updateFunction => updateFunction.get(query),
{readOnly: true, readTime: new Firestore.Timestamp(1684098540, 0)}
);
API בארכיטקטורת REST
קריאות PITR נתמכות בכל שיטות הקריאה של Cloud Firestore, שהן get, list, batchGet, listCollectionIds, listDocuments, runQuery, runAggregationQuery ו-partitionQuery.
כדי לבצע קריאה באמצעות שיטות REST, נסו אחת מהאפשרויות הבאות:
בבקשה של ה-method לקריאה, מעבירים את הערך של
readTimeכחותמת זמן נתמכת של PITR ב-methodreadOptions. חותמת הזמן של ה-PITR יכולה להיות חותמת זמן מדויקת במיקרו-שניות בשעה האחרונה, או חותמת זמן של דקה שלמה לפני השעה האחרונה, אבל לא לפניearliestVersionTime.משתמשים בפרמטר
readTimeיחד עם השיטהBeginTransactionכחלק מטרנזקצייתReadOnlyלכמה קריאות של PITR.
Apache Beam
אפשר להשתמש במחבר Cloud FirestoreIO Apache Beam כדי לקרוא או לכתוב מסמכים במסד נתונים של Cloud Firestore בקנה מידה גדול באמצעות Dataflow.
אפשר לקרוא נתונים באמצעות PITR בשיטת הקריאה הבאה של מחבר ה-Cloud FirestoreIO. ה-methods האלה לקריאה תומכות ב-method withReadTime(@Nullable Instant readTime), שבה אפשר להשתמש לקריאות PITR:
- FirestoreV1.BatchGetDocuments
- FirestoreV1.ListCollectionIds
- FirestoreV1.ListDocuments
- FirestoreV1.PartitionQuery
Java
אפשר להשתמש בקוד הבא עם קוד לדוגמה של צינור עיבוד נתונים ב-Dataflow לפעולות קריאה או כתיבה בכמות גדולה. בדוגמה הזו משתמשים ב-withReadTime(@Nullable Instant readTime) לקריאות PITR.
Instant readTime = Instant.ofEpochSecond(1684098540L);
PCollection<Document> documents =
pipeline
.apply(Create.of(collectionId))
.apply(
new FilterDocumentsQuery(
firestoreOptions.getProjectId(), firestoreOptions.getDatabaseId()))
.apply(FirestoreIO.v1().read().runQuery().withReadTime(readTime).withRpcQosOptions(rpcQosOptions).build())
...
לרשימה המלאה של דוגמאות ל-readTime בצינור עיבוד הנתונים של Dataflow, עיינו במאגר GitHub.
שכפול ממסד נתונים
אתם יכולים לשכפל מסד נתונים קיים עם חותמת זמן נבחרת למסד נתונים חדש:
מסד הנתונים המשוכפל הוא מסד נתונים חדש שייווצר באותו מיקום של מסד הנתונים המקורי.
כדי ליצור שכפול, Cloud Firestore משתמש בנתוני שחזור מערכת מנקודה מסוימת בזמן (PITR) של מסד הנתונים המקורי. מסד הנתונים המשוכפל כולל את כל הנתונים והאינדקסים.
כברירת מחדל, מסד הנתונים המשוכפל יוצפן באותו אופן כמו מסד הנתונים המקורי, באמצעות הצפנת ברירת המחדל של Google או הצפנת CMEK. אתם יכולים לציין סוג הצפנה אחר או להשתמש במפתח אחר להצפנת CMEK.
חותמת הזמן היא ברמת פירוט של דקה אחת ומציינת נקודת זמן בעבר, בתקופה שמוגדרת על ידי חלון ה-PITR:
- אם התכונה PITR מופעלת במסד הנתונים, אתם יכולים לבחור כל דקה ב-7 הימים האחרונים (או פחות, אם התכונה PITR הופעלה לפני פחות מ-7 ימים).
- אם PITR לא מופעל, אתם יכולים לבחור כל דקה בשעה האחרונה.
- בתיאור של מסד הנתונים אפשר לבדוק מהי חותמת הזמן המוקדמת ביותר שאפשר לבחור.
המסוף
מסוף Firebase לא תומך בשכפול מסדי נתונים. אתם יכולים להשתמש בהוראות של Google Cloud CLI כדי לשכפל מסדי נתונים.
gcloud
משתמשים בפקודה gcloud firestore databases clone כדי לשכפל מסד נתונים:
gcloud firestore databases clone \
--source-database='SOURCE_DATABASE' \
--snapshot-time='PITR_TIMESTAMP' \
--destination-database='DESTINATION_DATABASE_ID'
מחליפים את מה שכתוב בשדות הבאים:
SOURCE_DATABASE: שם מסד הנתונים הקיים שרוצים לשכפל. השם משתמש בפורמט
projects/PROJECT_ID/databases/SOURCE_DATABASE_ID.PITR_TIMESTAMP: חותמת זמן של PITR בפורמט RFC 3339, ברמת פירוט של דקות. לדוגמה:
2025-06-01T10:20:00.00Zאו2025-06-01T10:30:00.00-07:00.DESTINATION_DATABASE_ID: מזהה מסד נתונים למסד נתונים משוכפל חדש. מזהה מסד הנתונים הזה לא יכול להיות משויך למסד נתונים קיים.
דוגמה:
gcloud firestore databases clone \
--source-database='projects/example-project/databases/(default)' \
--snapshot-time='2025-06-01T10:20:00.00Z' \
--destination-database='example-dest-db'
אם רוצים לקשר לתגים מסוימים בזמן שכפול מסד נתונים, משתמשים בפקודה הקודמת עם הדגל --tags, שהוא רשימה אופציונלית של צמדי KEY=VALUE של תגים לקישור.
דוגמה:
gcloud firestore databases clone \
--source-database='projects/example-project/databases/(default)' \
--snapshot-time='2025-06-01T10:20:00.00Z' \
--destination-database='example-dest-db' \
--tags=key1=value1,key2=value2
כברירת מחדל, למסד הנתונים המשוכפל תהיה אותה הגדרת הצפנה כמו למסד הנתונים המקורי. כדי לשנות את הגדרות ההצפנה, משתמשים בארגומנט --encryption-type:
- (ברירת מחדל)
use-source-encryption: שימוש באותן הגדרות הצפנה כמו במסד הנתונים של המקור. -
google-default-encryption: שימוש בהצפנה שמוגדרת כברירת מחדל ב-Google. -
customer-managed-encryption: שימוש בהצפנת CMEK. מציינים מזהה מפתח בארגומנט--kms-key-name.
בדוגמה הבאה מוסבר איך להגדיר הצפנת CMEK למסד הנתונים המשוכפל:
gcloud firestore databases clone \
--source-database='projects/example-project/databases/(default)' \
--snapshot-time='2025-06-01T10:20:00.00Z' \
--destination-database='example-dest-db' \
--encryption-type='customer-managed-encryption' \
--kms-key-name='projects/example-project/locations/us-central1/keyRings/example-key-ring/cryptoKeys/example-key'
Firebase CLI
משתמשים בפקודה firebase firestore:databases:clone כדי לשכפל מסד נתונים:
firebase firestore:databases:clone \
'SOURCE_DATABASE' \
'DESTINATION_DATABASE' \
--snapshot-time 'PITR_TIMESTAMP'
מחליפים את מה שכתוב בשדות הבאים:
SOURCE_DATABASE: שם מסד הנתונים הקיים שרוצים לשכפל. השם משתמש בפורמט
projects/PROJECT_ID/databases/SOURCE_DATABASE_ID.DESTINATION_DATABASE: שם מסד הנתונים החדש שנוצר משכפול. השם משתמש בפורמט
projects/PROJECT_ID/databases/DESTINATION_DATABASE_ID. השם של מסד הנתונים הזה לא יכול להיות משויך למסד נתונים קיים.PITR_TIMESTAMP: חותמת זמן של PITR בפורמט RFC 3339, ברמת פירוט של דקות. לדוגמה:
2025-06-01T10:20:00.00Zאו2025-06-01T10:30:00.00-07:00. אם לא מציינים את השעה, המערכת בוחרת את השעה הנוכחית, מעוגלת כלפי מטה לדקה.
כברירת מחדל, למסד הנתונים המשוכפל תהיה אותה הגדרת הצפנה כמו למסד הנתונים המקורי. כדי לשנות את הגדרות ההצפנה, משתמשים בארגומנט --encryption-type:
- (ברירת מחדל)
USE_SOURCE_ENCRYPTION: שימוש באותן הגדרות הצפנה כמו במסד הנתונים של המקור. -
GOOGLE_DEFAULT_ENCRYPTION: שימוש בהצפנה שמוגדרת כברירת מחדל ב-Google. -
CUSTOMER_MANAGED_ENCRYPTION: שימוש בהצפנת CMEK. מציינים מזהה מפתח בארגומנט--kms-key-name.
בדוגמה הבאה מוסבר איך להגדיר הצפנת CMEK למסד הנתונים המשוכפל:
firebase firestore:databases:clone \
'projects/example-project/databases/(default)' \
'projects/example-project/databases/example-dest-db' \
--snapshot-time 'PITR_TIMESTAMP' \
--encryption-type CUSTOMER_MANAGED_ENCRYPTION
מגבלות
פעולת שכפול לא משכפלת נתוני חיפוש של App Engine או ישויות blob ממסד נתונים של (default). הנתונים האלה תקפים רק למסד הנתונים (default), והם לא יהיו שימושיים אם משכפלים מ-(default) למסד נתונים שלא תומך בנתונים כאלה, ולכן הם לא נכללים בשכפולים.
ייצוא וייבוא מנתוני PITR
אפשר לייצא את מסד הנתונים אל Cloud Storage מנתוני PITR באמצעות הפקודה gcloud firestore export. אפשר לייצא נתוני PITR שבהם חותמת הזמן היא חותמת זמן של דקה שלמה בשבעת הימים האחרונים, אבל לא לפני earliestVersionTime. אם הנתונים כבר לא קיימים בחותמת הזמן שצוינה, פעולת הייצוא תיכשל.
פעולת הייצוא של PITR תומכת בכל המסננים, כולל ייצוא של כל המסמכים וייצוא של אוספים ספציפיים.
מייצאים את מסד הנתונים ומציינים את הפרמטר
snapshot-timeלחותמת הזמן שנבחרה לשחזור.gcloud
מריצים את הפקודה הבאה כדי לייצא את מסד הנתונים לקטגוריה.
gcloud firestore export gs://BUCKET_NAME_PATH \ --snapshot-time=PITR_TIMESTAMP \ --collection-ids=COLLECTION_IDS \ --namespace-ids=NAMESPACE_IDSכאשר:
-
BUCKET_NAME_PATH– קטגוריה תקינה של Cloud Storage עם קידומת נתיב אופציונלית שבה מאוחסנים קובצי הייצוא. -
PITR_TIMESTAMP– חותמת זמן של PITR ברמת פירוט של דקות, לדוגמה2023-05-26T10:20:00.00Zאו2023-10-19T10:30:00.00-07:00. -
COLLECTION_IDS– רשימה של מזהי אוספים או מזהי קבוצות של אוספים, לדוגמה:'specific-collection-group1','specific-collection-group2'. -
NAMESPACE_IDS– רשימה של מזהי מרחבי שמות, לדוגמה'customer','orders'.
לפני שמייצאים נתוני PITR, חשוב לשים לב לנקודות הבאות:
- ציינו את חותמת הזמן בפורמט RFC 3339.
לדוגמה,
2023-05-26T10:20:00.00Zאו2023-10-19T10:30:00.00-07:00. - חשוב לוודא שחותמת הזמן שציינתם היא חותמת זמן של דקה שלמה בשבעת הימים האחרונים, אבל לא לפני
earliestVersionTime. אם הנתונים כבר לא קיימים בחותמת הזמן שצוינה, נוצרת שגיאה. חותמת הזמן חייבת להיות דקה שלמה, גם אם השעה שצוינה היא בשעה האחרונה. - לא תחויבו על ייצוא PITR שנכשל.
-
לייבא למסד נתונים.
מייבאים את מסד הנתונים שייצאתם לפי השלבים שמפורטים בקטע ייבוא כל המסמכים. אם מסמך כלשהו כבר קיים במסד הנתונים, הוא יוחלף.