בדף הזה מוסבר איך להשתמש בשחזור לנקודת זמן (PITR) כדי לשמור ולשחזר נתונים ב-Spanner עבור מסדי נתונים בניב GoogleSQL ומסדי נתונים בניב PostgreSQL.
מידע נוסף זמין במאמר בנושא שחזור מערכת מנקודה מסוימת בזמן (PITR).
דרישות מוקדמות
במדריך הזה נעשה שימוש במסד הנתונים ובסכימה שמוגדרים בהפעלה מהירה של Spanner. אפשר להריץ את ההפעלה המהירה כדי ליצור את מסד הנתונים ואת הסכימה, או לשנות את הפקודות כדי להשתמש בהן במסד הנתונים שלכם.
הגדרת תקופת השמירה
כדי להגדיר את תקופת השמירה של מסד הנתונים:
המסוף
נכנסים לדף Spanner Instances במסוףGoogle Cloud .
לוחצים על המופע שמכיל את מסד הנתונים כדי לפתוח את הדף סקירה כללית.
לוחצים על מסד הנתונים כדי לפתוח את הדף סקירה כללית שלו.
בוחרים בכרטיסייה גיבוי/שחזור.

לוחצים על סמל העיפרון בשדה תקופת השמירה של הגרסה.
מזינים את הכמות ואת יחידת הזמן של תקופת השמירה ולוחצים על עדכון.
gcloud
מעדכנים את הסכימה של מסד הנתונים באמצעות ההצהרה ALTER DATABASE. לדוגמה:
gcloud spanner databases ddl update example-db \
--instance=test-instance \
--ddl="ALTER DATABASE \"example-db\" \
SET spanner.version_retention_period = '7d';"הפלט שמתקבל:
ALTER DATABASE "example-db" SET "spanner.version_retention_period" = '7d';כדי לראות את תקופת השמירה, צריך לקבל את ה-DDL של מסד הנתונים:
gcloud spanner databases ddl describe example-db \
--instance=test-instanceהפלט שמתקבל:
ALTER DATABASE example-db SET OPTIONS (
version_retention_period = '7d'
);
...
ספריות לקוח
C#
C++
Go
Java
Node.js
PHP
Python
Ruby
הערות שימוש:
- תקופת השמירה צריכה להיות בין שעה ל-7 ימים, ואפשר לציין אותה בימים, בשעות, בדקות או בשניות. לדוגמה, הערכים
1d,24h,1440mו-86400sשווים. - אם הפעלתם את הרישום ביומן עבור Spanner API בפרויקט, האירוע יתועד כ-UpdateDatabaseDdl ויוצג בLogs Explorer.
- כדי לחזור לתקופת השמירה שמוגדרת כברירת מחדל של שעה אחת, אפשר להגדיר את האפשרות
version_retention_periodשל מסד הנתונים לערךNULLבמסדי נתונים של GoogleSQL או לערךDEFAULTבמסדי נתונים של PostgreSQL. - כשמאריכים את תקופת השמירה, המערכת לא ממלאת מחדש נתונים מגרסאות קודמות. לדוגמה, אם מאריכים את תקופת השמירה משעה אחת ל-24 שעות, צריך להמתין 23 שעות עד שהמערכת תצבור נתונים ישנים, לפני שאפשר יהיה לשחזר נתונים מ-24 שעות אחורה.
קבלת תקופת השמירה והשעה של הגרסה המוקדמת ביותר
המשאב Database כולל שני שדות:
-
version_retention_period: התקופה שבה Spanner שומר את כל גרסאות הנתונים במסד הנתונים.
earliest_version_time: חותמת הזמן המוקדמת ביותר שבה אפשר לקרוא גרסאות קודמות של הנתונים מהמסד. הערך הזה מתעדכן באופן רציף על ידי Spanner, והוא הופך להיות לא עדכני ברגע שמבצעים עליו שאילתה. אם אתם משתמשים בערך הזה כדי לשחזר נתונים, חשוב לקחת בחשבון את הזמן שחלף מהרגע שבו נשלחה השאילתה לגבי הערך ועד לרגע שבו התחלתם את השחזור.
המסוף
נכנסים לדף Spanner Instances במסוף Google Cloud .
לוחצים על המופע שמכיל את מסד הנתונים כדי לפתוח את הדף סקירה כללית.
לוחצים על מסד הנתונים כדי לפתוח את הדף סקירה כללית שלו.
לוחצים על הכרטיסייה גיבוי/שחזור כדי לפתוח את הדף גיבוי/שחזור ולהציג את תקופת השמירה.

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

gcloud
אפשר לקבל את השדות האלה באמצעות קריאה לפונקציות describe databases או list databases. לדוגמה:
gcloud spanner databases describe example-db \
--instance=test-instanceהפלט שמתקבל:
createTime: '2020-09-07T16:56:08.285140Z'
earliestVersionTime: '2020-10-07T16:56:08.285140Z'
name: projects/my-project/instances/test-instance/databases/example-db
state: READY
versionRetentionPeriod: 3d
שחזור חלק ממסד הנתונים
מבצעים קריאה בעבר ומציינים את חותמת הזמן של השחזור הנדרש. חשוב לוודא שחותמת הזמן שציינתם עדכנית יותר מ
earliest_version_time.gcloud
משתמשים ב-execute-sql לדוגמה:
gcloud spanner databases execute-sql example-db \ --instance=test-instance \ --read-timestamp=2020-09-11T10:19:36.010459-07:00 \ --sql='SELECT * FROM SINGERS'ספריות לקוח
שמירת תוצאות השאילתה. הדבר נדרש כי אי אפשר לכתוב את תוצאות השאילתה בחזרה למסד הנתונים באותה טרנזקציה. אם מדובר בכמויות קטנות של נתונים, אפשר להדפיס אותם במסוף או לאחסן אותם בזיכרון. אם מדובר בכמויות גדולות יותר של נתונים, יכול להיות שתצטרכו לכתוב לקובץ מקומי.
כותבים את הנתונים ששוחזרו בחזרה לטבלה שצריך לשחזר. לדוגמה:
gcloud
gcloud spanner rows update --instance=test-instance \ --database=example-db --table=Singers \ --data=SingerId=1,FirstName='Marc'מידע נוסף זמין במאמר בנושא עדכון נתונים באמצעות gcloud.
ספריות לקוח
מידע נוסף זמין במאמרים בנושא עדכון נתונים באמצעות DML או עדכון נתונים באמצעות מוטציות.
אפשרות נוספת: אם רוצים לבצע ניתוח של הנתונים ששוחזרו לפני שכותבים אותם בחזרה, אפשר ליצור באופן ידני טבלה זמנית באותו מסד נתונים, לכתוב את הנתונים ששוחזרו קודם בטבלה הזמנית, לבצע את הניתוח, ואז לקרוא את הנתונים שרוצים לשחזר מהטבלה הזמנית ולכתוב אותם בטבלה שצריך לשחזר.
שחזור טבלה ספציפית
אם אתם צריכים לשחזר טבלה ספציפית ונקודת השחזור שנבחרה עדכנית יותר מearliest_version_time של מסד הנתונים, אתם יכולים לייצא את הטבלה מחותמת זמן מוקדמת יותר באותו מסד נתונים ואז לייבא אותה בחזרה.
תהליך הייבוא לא מוחק אוטומטית שורות שנוספו אחרי שיצרתם את הגיבוי. לכן, אם רוצים שהטבלה המשוחזרת תהיה זהה בדיוק למצב שלה בחותמת הזמן שנבחרה לשחזור, צריך למחוק ידנית את השורות שנוצרו אחרי חותמת הזמן של השחזור.
- מייצאים את הטבלה הספציפית ממסד הנתונים ומציינים את הפרמטר
snapshotTimeעם חותמת הזמן של השחזור שדרושה. אפשר להשתמש בתבנית Dataflow Spanner to Avro. מידע נוסף זמין במאמר בנושא ייצוא נתונים. - מייבאים את הטבלה המיוצאת בחזרה למסד הנתונים באמצעות תבנית Dataflow Cloud Storage Avro to Spanner. מידע נוסף מופיע במאמר בנושא ייבוא נתונים.
שחזור של מסד נתונים שלם
אפשר לשחזר את כל מסד הנתונים באמצעות גיבוי ושחזור או ייבוא וייצוא, ולציין חותמת זמן של השחזור.
גיבוי ושחזור
יוצרים גיבוי ומגדירים את
version_timeלחותמת הזמן של השחזור שרוצים.המסוף
נכנסים לדף Database details במסוף Cloud.
בכרטיסייה גיבוי/שחזור, לוחצים על יצירה.
מסמנים את התיבה יצירת גיבוי מנקודת זמן קודמת.

gcloud
gcloud spanner backups create example-db-backup-1 \ --instance=test-instance \ --database=example-db \ --retention-period=1y \ --version-time=2021-01-22T01:10:35Z --asyncמידע נוסף זמין במאמר יצירת גיבוי באמצעות gcloud.
ספריות לקוח
C#
C++
Go
Java
Node.js
PHP
Python
Ruby
משחזרים מהגיבוי למסד נתונים חדש. הערה: Spanner שומר על הגדרת תקופת השמירה מהגיבוי למסד הנתונים המשוחזר.
המסוף
נכנסים לדף Instance details במסוף Cloud.
בכרטיסייה גיבוי/שחזור, בוחרים גיבוי ולוחצים על שחזור.
gcloud
gcloud spanner databases restore --async \ --destination-instance=destination-instance --destination-database=example-db-restored \ --source-instance=test-instance --source-backup=example-db-backup-1מידע נוסף זמין במאמר שחזור מסד נתונים מגיבוי.
ספריות לקוח
C#
C++
Go
Java
Node.js
PHP
Python
Ruby
ייבוא וייצוא
- מייצאים את מסד הנתונים ומציינים את הפרמטר
snapshotTimeלחותמת הזמן של השחזור הנדרש.המסוף
נכנסים לדף Instance details במסוף Cloud.
בכרטיסייה ייבוא/ייצוא, לוחצים על ייצוא.
מסמנים את התיבה ייצוא מסד נתונים מנקודת זמן מוקדמת יותר.

הוראות מפורטות זמינות במאמר בנושא ייצוא מסד נתונים.
gcloud
כדי לייצא את מסד הנתונים, משתמשים בתבנית Dataflow Spanner to Avro.
gcloud dataflow jobs run JOB_NAME \ --gcs-location='gs://cloud-spanner-point-in-time-recovery/Import Export Template/export/templates/Cloud_Spanner_to_GCS_Avro' --region=DATAFLOW_REGION \ --parameters='instanceId=test-instance,databaseId=example-db,outputDir=YOUR_GCS_DIRECTORY,snapshotTime=2020-09-01T23:59:40.125245Z'הערות שימוש:
- אפשר לעקוב אחרי ההתקדמות של עבודות הייבוא והייצוא במסוף Dataflow.
- מערכת Spanner מבטיחה שהנתונים שמיוצאים יהיו עקביים מבחינה חיצונית ומבחינת העסקאות בחותמת הזמן שצוינה.
- מציינים את חותמת הזמן בפורמט RFC 3339. לדוגמה, 2020-09-01T23:59:30.234233Z.
- חשוב לוודא שחותמת הזמן שצוינה עדכנית יותר מ
earliest_version_timeבמסד הנתונים. אם הנתונים כבר לא קיימים בחותמת הזמן שצוינה, תוצג שגיאה.
ייבוא למסד נתונים חדש.
המסוף
נכנסים לדף Instance details במסוף Cloud.
בכרטיסייה ייבוא/ייצוא, לוחצים על ייבוא.
הוראות מפורטות זמינות במאמר בנושא ייבוא קובצי Avro של Spanner.
gcloud
כדי לייבא את קובצי ה-Avro, משתמשים בתבנית Dataflow Cloud Storage Avro to Spanner.
gcloud dataflow jobs run JOB_NAME \ --gcs-location='gs://cloud-spanner-point-in-time-recovery/Import Export Template/import/templates/GCS_Avro_to_Cloud_Spanner' \ --region=DATAFLOW_REGION \ --staging-location=YOUR_GCS_STAGING_LOCATION \ --parameters='instanceId=test-instance,databaseId=example-db,inputDir=YOUR_GCS_DIRECTORY'
הערכת הגידול בנפח האחסון
לפני שמגדילים את תקופת השמירה של גרסה של מסד נתונים, אפשר להעריך את הגידול הצפוי בשימוש בנפח האחסון של מסד הנתונים. לשם כך, מחשבים את סך בייטים של העסקאות לתקופת הזמן הנדרשת. לדוגמה, השאילתה הבאה מחשבת את מספר ה-GiB שנכתבו ב-7 הימים האחרונים (168 שעות) על ידי קריאה מהטבלאות של סטטיסטיקות העסקאות.
GoogleSQL
SELECT
SUM(bytes_per_hour) / (1024 * 1024 * 1024 ) as GiB
FROM (
SELECT
((commit_attempt_count - commit_failed_precondition_count - commit_abort_count) * avg_bytes)
AS bytes_per_hour, interval_end
FROM
spanner_sys.txn_stats_total_hour
ORDER BY
interval_end DESC
LIMIT
168);
PostgreSQL
SELECT
bph / (1024 * 1024 * 1024 ) as GiB
FROM (
SELECT
SUM(bytes_per_hour) as bph
FROM (
SELECT
((commit_attempt_count - commit_failed_precondition_count - commit_abort_count) * avg_bytes)
AS bytes_per_hour, interval_end
FROM
spanner_sys.txn_stats_total_hour
ORDER BY
interval_end DESC
LIMIT
168)
sub1) sub2;
הערה: השאילתה מספקת הערכה גסה, ויכול להיות שהיא לא מדויקת מכמה סיבות:
- השאילתה לא מתייחסת לחותמת הזמן שצריך לשמור לכל גרסה של נתונים ישנים. אם מסד הנתונים שלכם מורכב מהרבה סוגי נתונים קטנים, יכול להיות שהשאילתה תעריך הערכת חסר את הגידול בנפח האחסון.
- השאילתה כוללת את כל פעולות הכתיבה, אבל רק פעולות העדכון יוצרות גרסאות קודמות של הנתונים. אם עומס העבודה כולל הרבה פעולות insert, יכול להיות שהשאילתה תעריך יתר על המידה את הגידול בנפח האחסון.