בדף הזה מוסבר איך להשתמש בשחזור לנקודת זמן (PITR) כדי לשמור ולשחזר נתונים ב-Firestore במצב Datastore.
כדי להבין את המושגים שקשורים ל-PITR, אפשר לעיין במאמר בנושא שחזור מערכת מנקודה מסוימת בזמן.
הרשאות
כדי לקבל את ההרשאות שנדרשות לניהול הגדרות PITR, צריך לבקש מהאדמין להקצות לכם את תפקיד ה-IAM בעלים של Cloud Datastore (roles/datastore.owner) בפרויקט שבו רוצים להפעיל את הגדרות ה-PITR.
כדי לקרוא הסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.
זהו תפקיד שמוגדר מראש וכולל את ההרשאות שנדרשות לניהול ההגדרות של PITR. כדי לראות בדיוק אילו הרשאות נדרשות, אפשר להרחיב את הקטע ההרשאות הנדרשות:
ההרשאות הנדרשות
כדי לנהל את ההגדרות של PITR, נדרשות ההרשאות הבאות:
-
כדי להפעיל PITR כשיוצרים מסד נתונים:
datastore.databases.create -
כדי לעדכן את ההגדרות של PITR במסד נתונים קיים:
datastore.databases.update,datastore.databases.list -
כדי לבצע קריאות מנתוני PITR:
datastore.databases.get,datastore.entities.get,datastore.entities.list,datastore.namespaces.get,datastore.namespaces.list,datastore.statistics.get,datastore.statistics.list -
כדי לייצא נתונים של PITR:
datastore.databases.export -
כדי לייבא נתונים של PITR:
datastore.databases.import
יכול להיות שתקבלו את ההרשאות האלה באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש אחרים.
לפני שמתחילים
לפני שמתחילים להשתמש ב-PITR, חשוב לשים לב לנקודות הבאות:
- אי אפשר להתחיל לקרוא מנקודה בזמן שהייתה לפני שבעה ימים מיד אחרי שמפעילים את PITR.
- אם רוצים להפעיל PITR כשיוצרים מסד נתונים, צריך להשתמש בפקודה
gcloud firestore databases create. אי אפשר להפעיל PITR בזמן יצירת מסד נתונים באמצעות מסוף Google Cloud . - במצב Datastore, המערכת מתחילה לשמור גרסאות מהנקודה שבה מפעילים את PITR והלאה.
- אחרי שמשביתים את PITR, אי אפשר לקרוא את הנתונים בחלון PITR.
- אם מפעילים מחדש את PITR מיד אחרי ההשבתה, הנתונים הקודמים של PITR כבר לא זמינים. נתונים שנוצרו לפני השבתת PITR יימחקו אחרי תאריך התפוגה של PITR.
- אם מחקתם בטעות נתונים בשעה האחרונה והתכונה PITR מושבתת, אתם יכולים לשחזר את הנתונים על ידי הפעלת התכונה PITR תוך שעה מהמחיקה.
- כל קריאה שמתבצעת בנתוני PITR שתוקף שלהם פג נכשלת.
הפעלת PITR
לפני שמשתמשים ב-PITR, צריך להפעיל את החיוב בפרויקט Google Cloud. אפשר להשתמש בתכונה PITR רק Google Cloud בפרויקטים שמופעל בהם חיוב.
כדי להפעיל PITR במסד הנתונים:
המסוף
נכנסים לדף Databases במסוף Google Cloud .
בוחרים את מסד הנתונים הרצוי מתוך רשימת מסדי הנתונים.
בתפריט הניווט, לוחצים על Disaster Recovery (התאוששות מאסון).
לוחצים על עריכה כדי לערוך את ההגדרות.
מסמנים את התיבה הפעלת שחזור מערכת מנקודה מסוימת בזמן ולוחצים על שמירה.
הפעלת PITR כרוכה בעלויות אחסון. מידע נוסף מופיע במאמר בנושא תמחור.
כדי להשבית את PITR, מבטלים את הסימון בתיבת הסימון Enable point-in-time recovery בדף Disaster Recovery במסוף Google Cloud .
gcloud
כדי להפעיל PITR במהלך יצירת מסד הנתונים, משתמשים בפקודה gcloud firestore databases create באופן הבא:
gcloud firestore databases create\
--location=LOCATION\
[--database=DATABASE_ID; default="(default)"]\
[--type=TYPE; default="firestore-native"]\
--enable-pitr
מחליפים את הערכים באופן הבא:
-
LOCATION– המיקום שבו רוצים ליצור את מסד הנתונים. -
DATABASE_ID– מוגדר למזהה מסד הנתונים או לערך (default). -
TYPE– מוגדר כ-datastore-mode.
כדי להשבית את PITR, משתמשים בפקודה [gcloud firestore databases update][update] באופן הבא:
gcloud firestore databases update\
[--database=DATABASE_ID; default="(default)"]\
--no-enable-pitr
מחליפים את הערכים באופן הבא:
-
DATABASE_ID– מוגדר למזהה מסד הנתונים או לערך (default).
קבלת תקופת השמירה והשעה של הגרסה המוקדמת ביותר
המסוף
נכנסים לדף Databases במסוף Google Cloud .
בוחרים את מסד הנתונים הרצוי מתוך רשימת מסדי הנתונים.
בתפריט הניווט, לוחצים על Disaster Recovery (התאוששות מאסון).
בקטע הגדרות, רושמים את תקופת השמירה ואת השעה של הגרסה הכי מוקדמת.
- תקופת השמירה: התקופה שבה מצב Datastore שומר את כל הגרסאות של הנתונים במסד הנתונים. הערך הוא שעה אחת כשה-PITR מושבת, ושבעה ימים כשה-PITR מופעל.
- הזמן של הגרסה המוקדמת ביותר: חותמת הזמן המוקדמת ביותר שבה אפשר לקרוא גרסאות קודמות של הנתונים בחלון PITR. הערך הזה מתעדכן באופן שוטף במצב Datastore, והוא הופך להיות לא עדכני ברגע שמתבצעת שאילתה לגביו. אם אתם משתמשים בערך הזה כדי לשחזר נתונים, חשוב לקחת בחשבון את הזמן שחלף מהרגע שבו הערך נשאל ועד לרגע שבו התחלתם את השחזור.
- שחזור מנקודה מסוימת בזמן: מוצג
Enabledאם האפשרות PITR מופעלת. אם 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/(default)
pointInTimeRecoveryEnablement: POINT_IN_TIME_RECOVERY_DISABLED
type: DATASTORE_MODE
uid: 5230c382-dcd2-468f-8cb3-2a1acfde2b32
updateTime: '2021-11-17T17:48:22.171180Z'
versionRetentionPeriod: 3600s
where,
-
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, צריך להשתמש בשיטה readTime במחלקה ReadOption. אי אפשר להשתמש בטרנזקציה ReadOnly כדי לבצע קריאות.
למידע נוסף, אפשר לעיין בדוגמת הקוד [ReadOption][readoption].
Datastore datastore = ...
Timestamp timestamp = ...
// lookup
Key key = ...
Entity entity = datastore.get(key, ReadOption.readTime(timestamp));
// runQuery
Query<Entity> query = ...
QueryResults<Entity> queryResult = datastore.run(query, ReadOption.readTime(timestamp));
// runAggregationQuery
AggregationQuery countAggregationQuery = ...
Long count = getOnlyElement(datastore.runAggregation(countAggregationQuery, ReadOption.readTime(timestamp))).get("total_count");
רשימה מלאה של דוגמאות ל-readTime זמינה ב[מאגר GitHub][GitHub-java].
Python
כדי לבצע קריאות, משתמשים בקריאת PITR ב-Python SDK במצב Datastore באמצעות השיטה readTime או באמצעות העסקה ReadOnly עם readTime.
from datetime import datetime, timezone
read_time = datetime.now(tz=timezone.utc)
key = …
# read without PITR read time
entity = client.get(key)
# read with PITR read time
entity = client.get(key, read_time=read_time)
# PITR read using read_only transaction
with client.transaction(read_only=True, read_time=read_time):
entity = client.get(key)
query = client.query…
# run query without PITR read time
iterator = query.fetch()
# run query with PITR read time
iterator = query.fetch(read_time=read_time)
# PITR read query using read_only transaction
with client.transaction(read_only=True, read_time=read_time):
iterator = query.fetch()
רשימה מלאה של דוגמאות ל-readTime זמינה במאגר [GitHub][GitHub-python].
API בארכיטקטורת REST
קריאות PITR נתמכות בשיטות הקריאה של Datastore במצב V1, שהן [lookup][lookup], [runQuery][runQuery] ו-[runAggregationQuery][runAggregationQuery].
כדי לבצע קריאה באמצעות שיטות REST, אפשר לנסות אחת מהאפשרויות הבאות:
בבקשה של שיטת הקריאה, מעבירים את הערך
readTimeכחותמת זמן נתמכת של PITR בשיטהreadOptions. חותמת זמן של PITR יכולה להיות חותמת זמן ברמת דיוק של מיקרו-שנייה בשעה האחרונה, או חותמת זמן של דקה שלמה לפני השעה האחרונה, אבל לא לפניearliestVersionTime.אפשר להשתמש בפרמטר
readTimeיחד עם השיטהBeginTransactionכחלק מ[ReadOnlyטרנזקציה][readonly] לכמה קריאות של PITR.
Apache Beam
אפשר להשתמש במחבר Datastore mode IO Apache Beam כדי לקרוא או לכתוב ישויות במסד נתונים במצב Datastore בקנה מידה גדול באמצעות Dataflow.
מציינים את השיטה withReadTime(Instant readTime) באובייקט [DatastoreV1.Read][datastore-read]. כל הקריאות הבאות באמצעות האובייקט DatastoreV1.Read קוראות מאותו readTime.
Java
בדוגמה הבאה מוצג איך להשתמש בשיטה withReadTime לקריאות PITR.
com.google.datastore.v1.Query query = ...
Instant readTime = Instant.ofEpochSecond(1684098540L);
DatastoreV1.Read read =
DatastoreIO.v1()
.read()
.withProjectId(project)
.withQuery(query)
.withNamespace(namespace)
.withReadTime(readTime);
PCollection<Entity> entities = pipeline.apply(read);
...
רשימה מלאה של דוגמאות ל-withReadTime זמינה במאגר [GitHub][GitHub].
שכפול ממסד נתונים
אפשר לשכפל מסד נתונים קיים בנקודת זמן נבחרת למסד נתונים חדש:
מסד הנתונים המשוכפל הוא מסד נתונים חדש שייווצר באותו מיקום כמו מסד הנתונים המקורי.
כדי ליצור שיבוט, Firestore משתמש בנתוני שחזור לנקודת זמן (PITR) של מסד הנתונים המקורי. מסד הנתונים המשוכפל כולל את כל הנתונים והאינדקסים.
כברירת מחדל, מסד הנתונים המשוכפל יוצפן באותו אופן שבו מוצפן מסד הנתונים המקורי, באמצעות ההצפנה שמוגדרת כברירת מחדל ב-Google או באמצעות הצפנת CMEK. אפשר לציין סוג הצפנה אחר או להשתמש במפתח אחר להצפנת CMEK.
חותמת הזמן היא ברמת גרנולריות של דקה אחת ומציינת נקודת זמן בעבר, בתקופה שמוגדרת על ידי חלון ה-PITR:
- אם PITR מופעל במסד הנתונים, אפשר לבחור כל דקה ב-7 הימים האחרונים (או פחות, אם PITR הופעל לפני פחות מ-7 ימים).
- אם PITR לא מופעל, אפשר לבחור כל דקה בשעה האחרונה.
- אפשר לבדוק את חותמת הזמן המוקדמת ביותר שאפשר לבחור בתיאור של מסד הנתונים.
המסוף
נכנסים לדף Databases במסוף Google Cloud .
לוחצים על View more בשורה של מסד הנתונים שרוצים לשכפל. לוחצים על Clone (שיבוט). מופיעה תיבת הדו-שיח יצירת שיבוט.
בתיבת הדו-שיח יצירת שיבוט, מציינים פרמטרים לשיבוט של מסד הנתונים:
בשדה Give the clone an ID (הקצאת מזהה לשיבוט), מזינים מזהה מסד נתונים למסד נתונים משובט חדש. מזהה מסד הנתונים הזה לא יכול להיות משויך למסד נתונים קיים.
בשדה Clone from, בוחרים נקודת זמן לשיבוט. הזמן שנבחר תואם לחותמת זמן של PITR, ברמת גרנולריות של דקה.
לוחצים על יצירת שיבוט.
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'
שינוי הגדרות ההצפנה של מסד הנתונים המשוכפל
כברירת מחדל, למסד הנתונים המשוכפל תהיה אותה הגדרת הצפנה כמו למסד הנתונים המקורי. כדי לשנות את הגדרות ההצפנה, משתמשים בארגומנט --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'
ייצוא וייבוא מנתוני PITR
אפשר לייצא את מסד הנתונים ל-Cloud Storage מנתוני PITR באמצעות הפקודה [gcloud firestore export][sdk]. אפשר לייצא נתונים של PITR עם חותמת זמן של דקה שלמה ב-7 הימים האחרונים, אבל לא לפני 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 שנכשל.
-
ייבוא למסד נתונים.
כדי לייבא את מסד הנתונים שייצאתם, פועלים לפי השלבים במאמר בנושא [ייבוא כל הישויות][import-export]. אם ישות כלשהי כבר קיימת במסד הנתונים, היא תוחלף. יש גם תמיכה ב[ייבוא של קבוצת משנה ספציפית של סוגים או מרחבי שמות עם מסנן ישויות][import-kind].
[GitHub]: https://github.com/apache/beam/blob/master/sdks/java/io/google-cloud-platform/src/test/java/org/apache/beam/sdk/io/gcp/datastore/V1ReadIT.java [GitHub-java]: https://github.com/googleapis/java-datastore/blob/main/google-cloud-datastore/src/test/java/com/google/cloud/datastore/it/ITDatastoreTest.java [GitHub-python]: https://github.com/googleapis/python-datastore/blob/main/tests/system/test_read_consistency.py [lookup]: /datastore/docs/reference/data/rest/v1/projects/lookup [runQuery]: /datastore/docs/reference/data/rest/v1/projects/runQuery [runAggregationQuery]: /datastore/docs/reference/data/rest/v1/projects/runAggregationQuery [readonly]: /java/docs/reference/google-cloud-datastore/latest/com.google.datastore.v1#transactionoptions.readonly [import-export]: /datastore/docs/export-import-entities#importing_all_entities [update]: https://cloud.google.com/sdk/gcloud/reference/firestore/databases/update [datastore-read]: https://beam.apache.org/releases/javadoc/current/org/apache/beam/sdk/io/gcp/datastore/DatastoreV1.Read.html [readoption]: https://github.com/googleapis/java-datastore/blob/main/google-cloud-datastore/src/main/java/com/google/cloud/datastore/ReadOption.java [import-kind]: /datastore/docs/export-import-entities#importing_specific_kinds_or_namespaces [sdk]: /sdk/gcloud/reference/firestore/export