עבודה עם שחזור בנקודת זמן (PITR)

בדף הזה מוסבר איך להשתמש בשחזור לנקודת זמן (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

לפני שמשתמשים ב-PITR, צריך להפעיל את החיוב בפרויקט Google Cloud. אפשר להשתמש בתכונה PITR רק Google Cloud בפרויקטים שמופעל בהם חיוב.

כדי להפעיל PITR למסד הנתונים:

המסוף

  1. נכנסים לדף Databases במסוף Google Cloud .

    לדף Databases

  2. בוחרים את מסד הנתונים הרצוי מתוך רשימת מסדי הנתונים.

  3. בתפריט הניווט, לוחצים על Disaster Recovery (התאוששות מאסון).

  4. לוחצים על עריכה כדי לערוך את ההגדרות.

  5. מסמנים את התיבה הפעלת שחזור מערכת מנקודה מסוימת בזמן ולוחצים על שמירה.

הפעלת 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: מוגדר למזהה מסד הנתונים או (ברירת מחדל).
  • ‫TYPE: מוגדר ל-datastore-mode.

כדי להשבית את PITR, משתמשים בפקודה gcloud firestore databases update באופן הבא:

gcloud firestore databases update\
  [--database=DATABASE_ID; default="(default)"]\
  --no-enable-pitr

מחליפים את הערכים באופן הבא:

  • ‫DATABASE_ID: מוגדר למזהה מסד הנתונים או (ברירת מחדל).

קבלת תקופת השמירה והשעה של הגרסה המוקדמת ביותר

המסוף

  1. נכנסים לדף Databases במסוף Google Cloud .

    לדף Databases

  2. בוחרים את מסד הנתונים הרצוי מתוך רשימת מסדי הנתונים.

  3. בתפריט הניווט, לוחצים על Disaster Recovery (התאוששות מאסון).

  4. בקטע הגדרות, שימו לב לתקופת השמירה ולשעת הגרסה המוקדמת ביותר.

    • תקופת השמירה: התקופה שבה מצב 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.

  Datastore datastore = ...
  Timestamp timestamp = ...

  // lookup
  Key key = ...
  Entity entity = datastore.get(key, ReadOption.readTime(timestamp));

  // runQuery
  Query query = ...
  QueryResults queryResult = datastore.run(query, ReadOption.readTime(timestamp));

  // runAggregationQuery
  AggregationQuery countAggregationQuery = ...
  Long count = getOnlyElement(datastore.runAggregation(countAggregationQuery, ReadOption.readTime(timestamp))).get("total_count");

לרשימה מלאה של דוגמאות ל-readTime, אפשר לעיין במאגר GitHub.

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.

‫API בארכיטקטורת REST

קריאות PITR נתמכות בשיטות הקריאה במצב Datastore V1, שהן lookup,‏ runQuery ו-runAggregationQuery.

כדי לבצע קריאה באמצעות שיטות REST, אפשר לנסות אחת מהאפשרויות הבאות:

  1. בבקשה שלכם לשיטת הקריאה, מעבירים את הערך readTime כחותמת זמן נתמכת של PITR בשיטה readOptions. חותמת זמן של PITR יכולה להיות חותמת זמן ברמת דיוק של מיקרו-שנייה בשעה האחרונה, או חותמת זמן של דקה שלמה לפני השעה האחרונה, אבל לא לפני earliestVersionTime.

  2. אפשר להשתמש בפרמטר readTime יחד עם השיטה BeginTransaction כחלק מעסקת ReadOnly כדי לבצע כמה קריאות של PITR.

Apache Beam

אפשר להשתמש במחבר Datastore mode IO Apache Beam כדי לקרוא או לכתוב ישויות במסד נתונים במצב Datastore בקנה מידה גדול באמצעות Dataflow.

מציינים את שיטת withReadTime(Instant readTime) באובייקט DatastoreV1.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 entities = pipeline.apply(read);
    ...

רשימה מלאה של דוגמאות ל-withReadTime זמינה במאגר GitHub.

שכפול ממסד נתונים

אפשר לשכפל מסד נתונים קיים בנקודת זמן נבחרת למסד נתונים חדש:

  • מסד הנתונים המשוכפל הוא מסד נתונים חדש שייווצר באותו מיקום של מסד הנתונים המקורי.

    כדי ליצור שיבוט, Firestore משתמש בנתוני שחזור לנקודת זמן (PITR) של מסד הנתונים המקורי. מסד הנתונים המשוכפל כולל את כל הנתונים והאינדקסים.

  • כברירת מחדל, מסד הנתונים המשוכפל יוצפן באותו אופן שבו מוצפן מסד הנתונים המקורי, באמצעות ההצפנה שמוגדרת כברירת מחדל ב-Google או באמצעות הצפנת CMEK. אפשר לציין סוג הצפנה אחר או להשתמש במפתח אחר להצפנת CMEK.

  • חותמת הזמן היא ברמת גרנולריות של דקה אחת ומציינת נקודת זמן בעבר, בתקופה שמוגדרת על ידי חלון ה-PITR:

    • אם PITR מופעל במסד הנתונים, אפשר לבחור כל דקה ב-7 הימים האחרונים (או פחות, אם PITR הופעל לפני פחות מ-7 ימים).
    • אם PITR לא מופעל, אפשר לבחור כל דקה בשעה האחרונה.
    • אפשר לבדוק את חותמת הזמן המוקדמת ביותר שאפשר לבחור בתיאור של מסד הנתונים.

המסוף

  1. נכנסים לדף Databases במסוף Google Cloud .

    לדף Databases

  2. לוחצים על View more בשורה של מסד הנתונים שרוצים לשכפל. לוחצים על Clone (שיבוט). מופיעה תיבת הדו-שיח יצירת שיבוט.

  3. בתיבת הדו-שיח יצירת שיבוט, מציינים פרמטרים לשיבוט של מסד הנתונים:

    1. בשדה Give the clone an ID (הקצאת מזהה לשיבוט), מזינים מזהה מסד נתונים למסד נתונים משובט חדש. מזהה מסד הנתונים הזה לא יכול להיות משויך למסד נתונים קיים.

    2. בשדה Clone from, בוחרים נקודת זמן לשיבוט. הזמן שנבחר תואם לחותמת זמן של PITR, ברמת דיוק של דקה.

  4. לוחצים על יצירת שיבוט.

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. אפשר לייצא נתונים מ-PITR עם חותמת זמן של דקה שלמה בטווח של שבעת הימים האחרונים, אבל לא לפני התאריך earliestVersionTime. אם הנתונים כבר לא קיימים בחותמת הזמן שצוינה, פעולת הייצוא תיכשל.

פעולת הייצוא PITR תומכת בכל המסננים, כולל ייצוא של כל הישויות וייצוא של סוגים או מרחבי שמות ספציפיים.

  1. מייצאים את מסד הנתונים ומציינים את הפרמטר 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 שנכשל.
  2. ייבוא למסד נתונים.

    כדי לייבא את מסד הנתונים שייצאתם, פועלים לפי השלבים במאמר בנושא ייבוא כל הישויות. אם יש כבר ישות במסד הנתונים, היא תוחלף. אפשר גם לייבא קבוצת משנה ספציפית של סוגים או מרחבי שמות באמצעות מסנן ישויות. מידע נוסף זמין במאמר בנושא ייבוא של סוגים או מרחבי שמות ספציפיים.