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

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

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 או עדכון נתונים באמצעות מוטציות.
אפשרות נוספת: אם רוצים לבצע ניתוח של הנתונים ששוחזרו לפני שכותבים אותם בחזרה, אפשר ליצור באופן ידני טבלה זמנית באותו מסד נתונים, לכתוב את הנתונים ששוחזרו קודם בטבלה הזמנית הזו, לבצע את הניתוח, ואז לקרוא את הנתונים שרוצים לשחזר מהטבלה הזמנית ולכתוב אותם בטבלה שצריך לשחזר.
שחזור של מסד נתונים שלם
אפשר לשחזר את כל מסד הנתונים באמצעות גיבוי ושחזור או ייבוא וייצוא, ולציין חותמת זמן של השחזור.
גיבוי ושחזור
יוצרים גיבוי ומגדירים את
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
משתמשים בתבנית Dataflow Cloud Storage Avro to Spanner כדי לייבא את קובצי Avro.
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, יכול להיות שהשאילתה תעריך יתר על המידה את הגידול בנפח האחסון.