שחזור טבלאות שנמחקו
במאמר הזה מוסבר איך לשחזר (או לבטל מחיקה) של טבלה שנמחקה ב-BigQuery. אפשר לשחזר טבלה שנמחקה במסגרת חלון הנסיעה בזמן שצוין עבור מערך הנתונים, כולל מחיקות מפורשות ומחיקות מרומזות עקב תפוגה של הטבלה. אפשר גם להגדיר את חלון הזמן של התכונה 'חזרה בזמן'.
למידע על שחזור של מערך נתונים או תמונת מצב שנמחקו, אפשר לעיין במקורות המידע הבאים:
חלון הזמן של המסע בזמן יכול להיות בין יומיים ל-7 ימים. אחרי שחלון הזמן של Time Travel מסתיים, BigQuery מספק תקופת הגנה שבה הנתונים שנמחקו נשמרים אוטומטית למשך שבעה ימים נוספים. אחרי שתקופת ההגנה מסתיימת, אי אפשר לשחזר טבלה באף שיטה, כולל פתיחת כרטיס תמיכה.
לפני שמתחילים
חשוב לוודא שיש לכם את ההרשאות הנדרשות לניהול זהויות והרשאות גישה (IAM) כדי לשחזר טבלה שנמחקה.
אם אתם משחזרים טבלה ממערך נתונים שנמחק, אתם צריכים ליצור מחדש את מערך הנתונים באותו אזור שבו הוא אוחסן במקור. יצירה מחדש של מערך הנתונים באזור אחר גורמת לכך ששחזור הטבלה באמצעות תכונת Time Travel ייכשל.
התפקידים הנדרשים
כדי לקבל את ההרשאות שנדרשות לשחזור טבלה שנמחקה, צריך לבקש מהאדמין להקצות לכם את תפקיד ה-IAM BigQuery User (roles/bigquery.user) בפרויקט.
כדי לקרוא הסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.
יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.
שחזור טבלה
אפשר לשחזר טבלה מנתונים היסטוריים על ידי העתקת הנתונים ההיסטוריים לטבלה חדשה. העתקת נתונים היסטוריים פועלת גם אם הטבלה נמחקה או פג תוקפה, כל עוד משחזרים את הטבלה במהלך חלון הזמן של Time Travel.
כשמשחזרים טבלה מנתונים היסטוריים, תגים מהטבלה המקורית לא מועתקים לטבלת היעד. גם פרטי החלוקה למחיצות של הטבלה לא מועתקים לטבלת היעד. כדי ליצור מחדש את סכימת החלוקה למחיצות של הטבלה המקורית, אפשר לעיין בבקשה הראשונית ליצירת הטבלה ב-Cloud Logging ולהשתמש במידע הזה כדי לחלק את הטבלה המשוחזרת למחיצות.
אפשר לשחזר רק טבלה שלמה. אי אפשר לשחזר מחיצות בודדות.
לדוגמה, אי אפשר להעתיק מחיצה באמצעות מעטר מחיצה כמו bq cp mydataset.mytable$20260712@1418864998000 mydataset.mytable_restored.
אפשר לשחזר טבלה שנמחקה אבל עדיין נמצאת בחלון הזמן של התכונה 'מסע בזמן' על ידי העתקת הטבלה לטבלה חדשה באמצעות קישוט הזמן @<time>.
אי אפשר להריץ שאילתה על טבלה שנמחקה, גם אם משתמשים במעצב זמן. קודם צריך לשחזר אותו.
משתמשים בתחביר הבא עם מעצב הזמן @<time>:
-
tableid@TIME, כאשרTIMEהוא מספר אלפיות השנייה מאז ראשית זמן יוניקס (Unix epoch). -
tableid@-TIME_OFFSETכאשרTIME_OFFSETהוא ההפרש היחסי מהשעה הנוכחית, באלפיות השנייה. -
tableid@0: מציין את הנתונים ההיסטוריים הכי ישנים שזמינים.
כדי לשחזר טבלה, בוחרים באחת מהאפשרויות הבאות:
המסוף
אי אפשר לבטל את המחיקה של טבלה באמצעות מסוף Cloud de Confiance .
BQ
-
במסוף Cloud de Confiance , מפעילים את Cloud Shell.
בחלק התחתון של Cloud de Confiance המסוף יתחיל סשן של Cloud Shell ותופיע הודעה של שורת הפקודה. Cloud Shell היא סביבת מעטפת שבה ה-CLI של Google Cloud מותקן ומוגדרים ערכים לפרויקט הקיים. הסשן יופעל תוך כמה שניות.
כדי לשחזר טבלה, קודם צריך לקבוע את חותמת הזמן של מערכת UNIX שבה הטבלה הייתה קיימת (באלפיות השנייה). אפשר להשתמש בפקודה
dateשל Linux כדי ליצור את חותמת הזמן של Unix מערך רגיל של חותמת זמן:date -d '2023-08-04 16:00:34.456789Z' +%s000
לאחר מכן, משתמשים בפקודה
bq copyעם מעצב המסע בזמן@<time>כדי לבצע את פעולת ההעתקה של הטבלה.לדוגמה, מזינים את הפקודה הבאה כדי להעתיק את הטבלה
mydataset.mytableבשעה1418864998000לטבלה חדשהmydataset.newtable.bq cp mydataset.mytable@1418864998000 mydataset.newtable
(אופציונלי) מציינים את הדגל
--locationומגדירים את הערך למיקום.אפשר גם לציין היסט יחסי. בדוגמה הבאה מועתקת הגרסה של טבלה מלפני שעה:
bq cp mydataset.mytable@-3600000 mydataset.newtable
המשך
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Goהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Go API.
כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.
לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.
Java
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי הוראות ההגדרה של Java במדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Java API.
כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.
לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.
Node.js
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Node.jsהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. מידע נוסף מופיע במאמרי העזרה של BigQuery Node.js API.
כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.
לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.
Python
לפני שמנסים את הדוגמה הזו, צריך לפעול לפי Pythonהוראות ההגדרה שבמדריך למתחילים של BigQuery באמצעות ספריות לקוח. למידע נוסף, קראו את מאמרי העזרה של BigQuery Python API.
כדי לבצע אימות ב-BigQuery, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לספריות לקוח.
לפני שמריצים דוגמאות קוד, צריך להגדיר את משתנה הסביבה GOOGLE_CLOUD_UNIVERSE_DOMAIN לערך s3nsapis.fr.
אם אתם צופים שתצטרכו לשחזר טבלה אחרי חלון הזמן שמוגדר לשימוש בתכונה 'מסע בזמן', כדאי ליצור תמונת מצב של הטבלה. למידע נוסף, קראו את המאמר מבוא לתמונות מצב של טבלאות.
אי אפשר לשחזר תצוגה לוגית באופן ישיר. מידע נוסף מופיע במאמר בנושא שחזור תצוגה.
איך מזהים מתי טבלה נמחקה
כדי לזהות את רשומת הביקורת שמציגה את התפוגה או המחיקה של טבלה מסוימת, משתמשים במסנן הבא ב-Logs Explorer במסוף Cloud de Confiance :
resource.type="bigquery_resource"
protoPayload.resourceName="projects/PROJECT_ID/datasets/DATASET_ID/tables/TABLE_ID"
(protoPayload.methodName="google.cloud.bigquery.v2.TableService.DeleteTable" OR protoPayload.methodName="tableservice.delete" OR protoPayload.serviceData.jobCompletedEvent.job.jobConfiguration.query.statementType="DROP_TABLE" OR protoPayload.methodName="InternalTableExpired")
מחליפים את מה שכתוב בשדות הבאים:
PROJECT_ID: מזהה הפרויקט.-
DATASET_ID: המזהה של קבוצת הנתונים שהטבלה נכללת בו. -
TABLE_ID: המזהה של הטבלה שנמחקה.
אפשר גם להשתמש במסנן הבא כדי למצוא את התאריך של סיום התוקף או המחיקה של קבוצת הנתונים שהטבלה נכללת בה:
resource.type="bigquery_dataset"
protoPayload.resourceName="projects/PROJECT_ID/datasets/DATASET_ID"
(protoPayload.methodName="google.cloud.bigquery.v2.DatasetService.DeleteDataset" OR protoPayload.methodName="datasetservice.delete")
מחליפים את מה שכתוב בשדות הבאים:
PROJECT_ID: מזהה הפרויקט.-
DATASET_ID: המזהה של קבוצת הנתונים שהטבלה נכללת בו.
זיהוי הסיבה למחיקת הטבלה
אפשר להשתמש בתצוגה INFORMATION_SCHEMA.TABLE_STORAGE כדי לראות איך טבלה נמחקה.
התצוגה INFORMATION_SCHEMA.TABLE_STORAGE מכילה מידע על הטבלאות הנוכחיות ועל הטבלאות שנמחקו בחלון הזמן של המסע בזמן. אם טבלה נמחקה, העמודה table_deletion_time מכילה את חותמת הזמן של המחיקה, והעמודה table_deletion_reason מכילה את שיטת המחיקה.
כדי לגלות למה טבלה נמחקה, מריצים שאילתה בתצוגה INFORMATION_SCHEMA.TABLE_STORAGE:
SELECT table_name, deleted, table_deletion_time, table_deletion_reason FROM `PROJECT_ID`.`region-REGION`.INFORMATION_SCHEMA.TABLE_STORAGE WHERE table_schema = "DATASET_ID" AND table_name = "TABLE_ID"
מחליפים את המשתנים הבאים:
PROJECT_ID: מזהה הפרויקט.-
REGION: האזור של מערך הנתונים שהכיל את הטבלה. -
DATASET_ID: המזהה של קבוצת הנתונים שהטבלה נכללת בו. -
TABLE_ID: המזהה של הטבלה שנמחקה.
בעמודה table_deletion_reason מוסבר למה הטבלה נמחקה:
-
TABLE_EXPIRATION: הטבלה נמחקה אחרי שפג תוקף הזמן שהוגדר. -
DATASET_DELETION: מערך הנתונים שהטבלה הייתה שייכת אליו נמחק על ידי משתמש. -
USER_DELETED: הטבלה נמחקה על ידי משתמש.
פתרון בעיות בשחזור טבלאות
שאילתה על הטבלה שנמחקה באמצעות חותמת זמן מהעבר
אי אפשר לשחזר נתונים מטבלה באמצעות שאילתה של טבלה שנמחקה בעבר באמצעות קישוט חותמת זמן או באמצעות FOR SYSTEM_TIME AS OF כדי לשמור את התוצאה בטבלת יעד. שימוש באחת מהשיטות האלה יוצר את השגיאה הבאה:
Not found: Table myproject:mydataset.table was not found in location LOCATION
במקום זאת, כדי להעתיק את הטבלה, פועלים לפי השלבים שמפורטים במאמר שחזור טבלה.
שגיאה: VPC Service Controls: Request is prohibited by organization's policy
כשמנסים להריץ את פקודת ההעתקה מ-Google Cloud Shell, יכול להיות שתופיע שגיאה כמו זו:
BigQuery error in cp operation: VPC Service Controls: Request is prohibited by organization's policy
השימוש ב-Cloud Shell ממסוף Cloud de Confiance עם VPC SC לא נתמך, כי הוא נחשב לבקשה מחוץ לגבולות גזרה לשירות, והגישה לנתונים שמוגנים על ידי VPC Service Controls נדחית. כדי לעקוף את הבעיה, מפעילים את Cloud Shell ומתחברים אליו באופן מקומי באמצעות Google Cloud CLI.
שגיאה: Latest categories are incompatible with schema
אם מריצים את פקודת ההעתקה מ-Google Cloud Shell, יכול להיות שתקבלו שגיאה כמו זו שמופיעה בהמשך:
Latest categories are incompatible with schema at TIMESTAMP
יש כמה סיבות אפשריות לשגיאה הזו:
- הסכימה של טבלת היעד שונה מהסכימה של הטבלה המקורית (מותרות עמודות נוספות, כל עוד לא מצורפים אליהן תגי מדיניות ברמת העמודה).
- תגי מדיניות ברמת העמודה בטבלת היעד מוגדרים באופן שונה מטבלת המקור.
כדי לפתור את השגיאה:
- מוודאים שהסכימה של טבלת היעד זהה, ומוודאים שכל העמודות בטבלת המקור מופיעות בטבלת היעד ובאותו סדר.
- מסירים מתגי מדיניות ברמת העמודה מטבלת היעד שלא נמצאים בסכימה של הטבלה המקורית.
שגיאה: BigQuery error in cp operation: Invalid time travel timestamp
אם מריצים את הפקודה bq copy מ-Google Cloud Shell, יכול להיות שתופיע שגיאה כמו זו:
BigQuery error in cp operation: Invalid time travel timestamp 1744343690000 for table PROJECT_ID:DATASET_ID.TABLE_ID@1744343690000. Cannot read before 1744843691075
השגיאה הזו מציינת שאתם מנסים לשחזר נתונים ממצב הטבלה לפני חלון הזמן של Time Travel או לפני שהטבלה נוצרה. האפשרות הזו לא נתמכת. הודעת השגיאה מכילה את חותמת הזמן האחרונה שאפשר להשתמש בה כדי לקרוא את נתוני הטבלה. משתמשים בחותמת הזמן שמופיעה בשגיאה בפקודה bq copy.
השגיאה הזו יכולה להתרחש גם כשמספקים ערך שלילי של חותמת זמן, לדוגמה, TABLE@-1744963620000. במקום זאת, צריך להשתמש בהזזת זמן שאפשר להשתמש בה עם הסימן -.
BigQuery error in cp operation: Invalid time travel timestamp 584878816 for table PROJECT_ID:DATASET_ID.TABLE_ID@584878816. Cannot read before 1744843691075
הודעת השגיאה הזו מציינת שהפקודה bq cp מכילה ערך חותמת זמן שלילי כהיסט, ושהיה ניסיון לקרוא את הטבלה ב-CURRENT_TIMESTAMP - PROVIDED TIMESTAMP. הערך הזה הוא בדרך כלל חותמת זמן משנת 1970. כדי לעקוף את הבעיה הזו, צריך לאמת את ערכי ההיסט או חותמת הזמן כשמגדירים את ערך מעצב הטבלה ולהשתמש בסימן - בצורה מתאימה.
מחיצות
אפשר לשחזר רק טבלה שלמה. אי אפשר לשחזר מחיצות בודדות.
לדוגמה, אי אפשר להעתיק מחיצה באמצעות מעטר מחיצה כמו bq cp mydataset.mytable$20260712@1418864998000 mydataset.mytable_restored.
תצוגות מהותיות
אי אפשר לשחזר תצוגה חומרית שנמחקה באופן ישיר. אם מוחקים תצוגה חומרית, צריך ליצור אותה מחדש.
אם מוחקים טבלה שהיא מסד נתונים טבלאי לתצוגה מהותית, אי אפשר יותר לבצע שאילתות על התצוגה המהותית או לרענן אותה. אם משחזרים את מסד הנתונים הטבלאי לפי השלבים שמפורטים במאמר שחזור טבלה, צריך גם ליצור מחדש את כל התצוגות המהותיות שמשתמשות בטבלה הזו.
טבלאות חיצוניות
אי אפשר לשחזר ישירות טבלה חיצונית שנמחקה. אם מוחקים טבלה חיצונית, צריך ליצור אותה מחדש. כדי ליצור מחדש את הטבלה, צריך לדעת את ההגדרה של הטבלה המקורית, ובמיוחד את הפרטים הבאים:
- הסכימה של הטבלה
- מקור ה-URI שמפנה לנתונים החיצוניים
- הפורמט של הנתונים החיצוניים
אפשר לקבל את המידע הזה מ-Cloud Logging על ידי חיפוש של רשומה ביומן שקשורה ליצירת הטבלה.
אם הטבלה נמחקה לאחרונה, אפשר גם לנסות לקבל את כתובות ה-URI על ידי שליחת שאילתה לתצוגה INFORMATION_SCHEMA.TABLE_OPTIONS.
מחיקת הטבלה החיצונית לא מוחקת את הנתונים הבסיסיים.