יכול להיות שיתרחשו שגיאות במהלך זמן הריצה של תהליך העברת המשימות.
- אפשר לתקן שגיאות מסוימות, כמו סיסמה שגויה במסד הנתונים של המקור, והעברת הנתונים תתחדש באופן אוטומטי.
- חלק מהשגיאות לא ניתנות לתיקון, כמו שגיאות בשכפול נתונים, ולכן צריך להפעיל מחדש את משימת ההעברה מההתחלה.
כשמתרחשת שגיאה, סטטוס משימת ההעברה משתנה ל-Failed, וסטטוס המשנה משקף את הסטטוס האחרון לפני הכשל.
כדי לפתור שגיאה, עוברים אל משימת ההעברה שנכשלה כדי לראות את השגיאה ופועלים לפי השלבים שמפורטים בהודעת השגיאה.
כדי לראות פרטים נוספים על השגיאה, עוברים אל Cloud Monitoring באמצעות הקישור למשימת ההעברה. היומנים מסוננים לפי משימת ההעברה הספציפית.
בטבלה הבאה מפורטות כמה דוגמאות לבעיות ופתרונות אפשריים:
| לבעיה הזו... | יכול להיות שהבעיה היא... | אפשר לנסות את הפעולות הבאות… |
|---|---|---|
כשמעבירים אל
מופע יעד קיים, מוצגת הודעת השגיאה הבאה:
The destination instance contains existing data or user defined
entities (for example databases, tables, or functions). You can only
migrate to empty instances. Clear your destination instance and retry
the migration job.
|
מכונת היעד של Cloud SQL מכילה נתונים נוספים. אפשר לבצע מיגרציה רק למופעים קיימים וריקים. מגבלות ידועות | מקדמים את מופע היעד כדי שיהיה מופע לקריאה ולכתיבה, מסירים את הנתונים הנוספים ומנסים שוב להפעיל את משימת ההעברה. אפשר לעיין במאמר ניקוי נתונים נוספים ממופע היעד הקיים. |
| החיבור למופע של מסד הנתונים המקורי נכשל. | הייתה בעיית קישוריות בין מופע מסד הנתונים של המקור לבין מופע היעד. | פועלים לפי השלבים במאמר בנושא ניפוי באגים בקישוריות. |
| הפעלת משימת ההעברה נכשלה בגלל גרסאות לא תואמות של מסד הנתונים של המקור ומסד הנתונים של היעד. | גרסאות מסד הנתונים של המקור והיעד לא נתמכות בשילוב. באופן ספציפי, גרסת מסד הנתונים של המקור לא תואמת לגרסת מסד הנתונים של היעד. | מוודאים שגרסת מסד הנתונים של היעד זהה לגרסת מסד הנתונים של המקור או גבוהה ממנה בגרסה ראשית אחת. לאחר מכן, יוצרים משימת העברה חדשה. |
| שפות להגדרת נתונים (DDL) או שפות לטיפול בנתונים (DML) חסומות במקור. | פקודות DDL שדורשות ACCESS EXCLUSIVE נעילה ומופעלות במהלך שלב הגיבוי המלא נחסמות. |
במהלך תהליך הסנכרון הראשוני (dump מלא), צריך להימנע משימוש ב-DDL או בתוכניות שדורשות לדוגמה, אם טבלה עדיין נמצאת בתהליך הסנכרון הראשוני ומופעלת פקודת |
הודעת שגיאה: No pglogical extension installed on databases (X)
|
במסד נתונים אחד או יותר של מקורות לא מותקן pglogical. |
כדי להתקין את pglogical במסדי הנתונים במופע המקור, פועלים לפי ההנחיות האלה. |
כשמבצעים מיגרציה ל-PostgreSQL גרסה 15, אחרי כמה ניסיונות חוזרים של חיבור, אחד מהתסמינים הבאים מתרחש:
|
הבעיה הזו קורית בדרך כלל בגלל בעיית הקיפאון בתוסף pglogical. מידע נוסף זמין ב
pglogical הכלי למעקב אחר בעיות ב-GitHub.
|
מנסים שוב להפעיל את משימת ההעברה, או מעבירים קודם לגרסת ביניים של PostgreSQL. פרטים נוספים זמינים במאמר
הודעת השגיאה: Cannot connect to invalid database.
|
הודעת שגיאה: Replication user 'x' doesn't have sufficient privileges.
|
למשתמש שמשתמש ב-Database Migration Service אין את ההרשאות הנדרשות לביצוע הפעולה שצוינה. | כדי לוודא שלמשתמש הזה יש את ההרשאות הנדרשות, צריך לפעול לפי ההנחיות האלה. |
הודעת שגיאה: Unable to connect to source database server.
|
Database Migration Service לא יכול ליצור חיבור לשרת של מסד הנתונים המקורי. | מוודאים שמופעי מסד הנתונים של המקור והיעד יכולים לתקשר זה עם זה, ושהשלמתם את כל הדרישות המוקדמות שהופיעו כשהגדרתם את ההגדרות של משימת ההעברה. |
הודעת שגיאה: The source database 'wal_level' configuration must be equal to 'logical'.
|
הערך של wal_level עבור מסד הנתונים של המקור מוגדר לערך שאינו logical. |
מגדירים את wal_level לערך logical. |
הודעת שגיאה: The source database 'max_replication_slots' configuration is not sufficient.
|
הפרמטר max_replication_slots לא הוגדר בצורה נכונה. |
כדי להגדיר את הפרמטר הזה בצורה נכונה, צריך לפעול לפי ההנחיות האלה. |
הודעת שגיאה: The source database 'max_wal_senders' configuration is not sufficient.
|
הפרמטר max_wal_senders לא הוגדר בצורה נכונה. |
כדי להגדיר את הפרמטר הזה בצורה נכונה, צריך לפעול לפי ההנחיות האלה. |
הודעת שגיאה: The source database 'max_worker_processes' configuration is not sufficient.
|
הפרמטר max_worker_processes לא הוגדר בצורה נכונה. |
כדי להגדיר את הפרמטר הזה בצורה נכונה, צריך לפעול לפי ההנחיות האלה. |
|
הודעת שגיאה: או
הודעת שגיאה: |
אי אפשר לנקות את ההגדרות שנדרשות לשכפול במהלך קידום של משימת העברה. | לכל מסד נתונים, מריצים פקודות בתור משתמש עם הרשאת מידע נוסף על הפקודות שצריך להריץ זמין במאמר הסרת משבצות רפליקציה. |
|
הודעת שגיאה: |
יכול להיות שאישור ה-CA של המקור שסופק ל-Database Migration Service יכיל רק את אישור הבסיס. עם זאת, אישור המקור דורש גם את אישור הבסיס וגם את כל אישורי הביניים. לדוגמה, ב-Amazon Relational Database Service, שימוש באישור rds-ca-2019-root.pem עלול לגרום לבעיה הזו. |
יוצרים אישור משולב של רשות אישורים (CA) שמכיל גם את אישור הבסיס וגם את כל אישורי הביניים הנדרשים. בתרחיש השימוש של Amazon Relational Database Service, במקום באישור rds-ca-2019-root.pem, משתמשים באישור rds-combined-ca-bundle.pem. |
|
הודעת שגיאה: |
הערך שהוגדר לפרמטר max_locks_per_transaction לא מספיק. |
הערך של הפרמטר הזה צריך להיות לפחות {max_number_of_tables_per_database}/(max_connections + max_prepared_transactions). |
|
הודעת שגיאה: |
חבילת pglogical לא מותקנת בצורה תקינה במופע המקור. | מידע נוסף על התקנה נכונה של החבילה זמין במאמר בנושא התקנת החבילה pglogical במופע המקור. |
|
הודעת שגיאה: |
המקור שהוגדר נמצא במצב שחזור. | הגדרה של מקור שלא נמצא במצב שחזור. |
| הפריקה המלאה איטית. | יכול להיות שייקח זמן רב לייבא נתונים גדולים ממסד הנתונים המקורי אל היעד ב-Cloud SQL. |
|
הודעת שגיאה: subscriber {subscriber_name} initialization failed during nonrecoverable step (d), please try the setup again |
העברת העבודה נכשלה במהלך שלב הגיבוי המלא, ואי אפשר לשחזר את העבודה. הופעלה מחדש של מופע מסד הנתונים של המקור, או שהוא במצב שחזור, או שהחיבורים לשכפול הסתיימו בגלל ערך לא מספיק שהוגדר לפרמטר כדי למצוא את שורש הבעיה:
|
|
הודעת שגיאה: ERROR: unknown column name {column_name} |
עמודה נוספה לטבלה משוכפלת בצומת הראשי, אבל לא בצומת המשוכפל. |
במהלך העברות רציפות, רק שינויים בשפת טיפול בנתונים (DML) מתעדכנים באופן אוטומטי. המשתמש אחראי לניהול השינויים בשפת הגדרת הנתונים (DDL) כדי שמסדי הנתונים של המקור והיעד יישארו תואמים. אפשר לעשות זאת בשתי דרכים:
דוגמאות לשימוש ב- |
הודעת שגיאה: ERROR: cannot truncate a table referenced in a foreign key constraint |
המשתמש ניסה לחתוך טבלה שיש לה אילוץ של מפתח זר. |
קודם מסירים את אילוץ המפתח הזר, ואז חותכים את הטבלה. |
הודעת שגיאה: ERROR: connection to other side has died |
החיבור לשכפול הסתיים בגלל ערך לא מספיק שהוגדר ל- |
כדאי להגדיל את ערך הפרמטר |
הודעת אזהרה: migration job test configuration has returned the following warnings: Some table(s) have limited support. |
במקור יש טבלאות עם תמיכה מוגבלת, למשל טבלאות ללא מפתחות ראשיים. |
זוהי הודעת אזהרה. אפשר להמשיך בהעברה, אבל חשוב לדעת שישויות לא נתמכות (לדוגמה, טבלאות ללא מפתחות ראשיים) לא יועברו. מידע נוסף זמין במאמר בנושא הגדרת מסדי נתונים של מקורות. |
| כשמעבירים מסדי נתונים נבחרים ועבודת ההעברה לא מצליחה לשכפל נתונים למסד נתונים אחד או יותר, הסטטוס נכשל מוצג ברשימת מסדי הנתונים. | שגיאות שונות בעבודת ההעברה. | בעמודה שגיאות, לוחצים על הצגת שגיאות ומתקנים אותן. אפשר גם להסיר את מסדי הנתונים שנכשלו מעבודת ההעברה. מידע נוסף על הסרת מסד נתונים שנכשל מהעברת נתונים זמין במאמר ניהול של משימות העברה. |
ניקוי נתונים נוספים ממופע היעד הקיים
כשמעבירים ל
מופע יעד קיים, מוצגת הודעת השגיאה הבאה:
The destination instance contains existing data or user defined
entities (for example databases, tables, or functions). You can only
migrate to empty instances. Clear your destination instance and retry
the migration job.
הבעיה הזו יכולה לקרות אם מופע היעד מכיל נתונים נוספים. אפשר להעביר רק למופעים קיימים שהם ריקים. מגבלות ידועות
פעולות שכדאי לנסות
כדי לנקות נתונים מיותרים ממופע היעד ולהתחיל מחדש את משימת ההעברה, מבצעים את השלבים הבאים:
- הפסקת משימת ההעברה.
- בשלב הזה, מכונת היעד של Cloud SQL נמצאת במצב read-only (קריאה בלבד). קידום מופע היעד כדי לקבל גישת כתיבה.
- מתחברים למכונת היעד של Cloud SQL.
- מסירים נתונים מיותרים ממסדי הנתונים של מופע היעד. יעד הגיבוי יכול להכיל רק נתוני תצורת מערכת. מסדי נתונים של יעדים
לא יכולים להכיל נתוני משתמשים (כמו טבלאות). יש כמה הצהרות SQL שאפשר להריץ במסדי הנתונים כדי למצוא נתונים שלא קשורים למערכת, למשל:
דוגמה להוראת SQL לאחזור מסדי נתונים שאינם מסדי נתונים של המערכת (יש ללחוץ כדי להרחיב את הקטע)
SELECT datname FROM pg_catalog.pg_database WHERE datname NOT IN ('cloudsqladmin', 'template1', 'template0', 'postgres');
דוגמה להוראת SQL לאחזור נתונים שאינם נתוני מערכת במסד הנתונים
postgres(לחיצה להרחבה)מסד הנתונים
postgresהוא מסד נתונים של המערכת, אבל הוא יכול להכיל נתונים שלא שייכים למערכת. חשוב להריץ את ההצהרות האלה במסד הנתוניםpostgres. אם משתמשים בלקוחpsqlכדי להתחבר למופע היעד, אפשר לעבור למסד נתונים אחר בלי לאפס את החיבור באמצעות הפקודה\connect {database_name_here}.SELECT table_schema, table_name FROM information_schema.tables WHERE table_schema != 'information_schema' AND table_schema not like 'pg\_%'; SELECT routine_schema, routine_name FROM information_schema.routines WHERE routine_schema != 'information_schema' AND routine_schema not like 'pg\_%'; SELECT extname FROM pg_extension WHERE extname != 'plpgsql';
- התחלת עבודת ההעברה.
ניקוי משבצות שכפול
אחת מההודעות הבאות תופיע:
Cleanup may have failed on source due to error: generic::unknown: failed to connect to on-premises database.Error promoting EM replica: finished drop replication with errors.
יכול להיות שהבעיה היא
כשמקדמים מופע של Cloud SQL, אם אי אפשר להגיע למופע המקור ממופע Cloud SQL (לדוגמה, מופע המקור לא פועל, או שהסרתם את מופע Cloud SQL מרשימת ההיתרים של מופעי המקור), אי אפשר לנקות את ההגדרות שנדרשות לשכפול במהלך הקידום של משימת ההעברה. צריך לנקות את משבצות השכפול באופן ידני.
פעולות שכדאי לנסות
לכל מסד נתונים, מריצים את הפקודות הבאות כמשתמש עם הרשאת superuser:
מעתיקים את שמות משבצות השכפול מהודעת השגיאה ומריצים את הפקודה הבאה כדי להסיר את המשבצות, אחת אחרי השנייה:
select pg_drop_replication_slot({slot_name});-
אם שמות משבצות השכפול לא מופיעים בהודעת השגיאה, מריצים את הפקודה הבאה כדי לשלוח שאילתה לגבי משבצות השכפול הקיימות:
select pg_drop_replication_slot(slot_name) from pg_replication_slots where slot_name like '%cloudsql%' and active = 'f';
-
אם אין רפליקות של Cloud SQL שמשתמשות במופע המקור, מריצים את הפקודה הבאה כדי לנקות את ההגדרות של
pglogical:select pglogical.drop_node(node_name) from pglogical.node where node_name like
'cloudsql'; -
אם כבר אין צורך בתוסף
pglogical, מריצים את הפקודה הבאה כדי להסיר אותו:DROP EXTENSION IF EXISTS pglogical;
הודעת שגיאה:
Cannot connect to invalid database
כשמבצעים מיגרציה ל-PostgreSQL בגרסה 15, אחרי כמה ניסיונות חוזרים של חיבור, אחת מהבעיות הבאות מתרחשת:
-
מופיעה הודעת שגיאה.
Cannot connect to invalid database - מדד משימת המיגרציה של נפח האחסון הנדרש לא מציג התקדמות אחרי זמן רב, כשמשימת המיגרציה מבצעת את הגיבוי המלא של מסד הנתונים.
יכול להיות שהבעיה היא
הבעיה הזו קשורה בדרך כלל לבעיית הקיפאון בתוסף pglogical. מידע נוסף אפשר למצוא ב
pglogical Issue Tracker ב-GitHub.
פעולות שכדאי לנסות
מבצעים שוב את עבודת ההעברה עם מופע יעד חדש
אפשר לנסות למחוק את מסד הנתונים של היעד שבו נתקלתם בבעיה ולצור מחדש את משימת ההעברה. איך לעשות את זה?
- מוחקים את מופע היעד שבו נתקלתם בבעיות. אפשר לעיין במאמר מחיקת מכונות במסמכי Cloud SQL ל-PostgreSQL.
- מוחקים את משימת ההעברה שנכשלה. אפשר לעיין במאמר בדיקת משימת העברה.
- יוצרים מחדש את עבודת ההעברה. איך יוצרים עבודת העברה
מעבר לגרסה ביניים
כדאי לשקול מעבר לגרסה קודמת של PostgreSQL, כמו PostgreSQL 14. אחרי שההעברה הסתיימה בהצלחה, אפשר לנסות לשדרג למופע הרצוי של PostgreSQL 15. מידע נוסף מופיע במאמר שדרוג הגרסה הראשית של מסד הנתונים על ידי העברת נתונים במסמכי Cloud SQL ל-PostgreSQL.
ניהול משתמשים ותפקידים
העברת משתמשים קיימים
נכון לעכשיו, Database Migration Service לא תומך בהעברת משתמשים קיימים ממופע מקור למופע יעד של Cloud SQL. אפשר לנהל את ההעברה הזו על ידי יצירת המשתמשים ב-Cloud SQL באופן ידני.
מידע על המשתמש cloudsqlexternalsync
במהלך ההעברה, כל האובייקטים בעותק המשוכפל של Cloud SQL נמצאים בבעלות המשתמש cloudsqlexternalsync. אחרי העברת הנתונים, אפשר לשנות את הבעלות על האובייקטים למשתמשים אחרים. כך עושים זאת:
- מריצים את הפקודה
GRANT cloudsqlexternalsync to {USER}. - בכל מסד נתונים, מריצים את הפקודה
reassign owned by cloudsqlexternalsync to {USER};. - כדי להסיר את המשתמש
cloudsqlexternalsync, מריצים את הפקודהdrop role cloudsqlexternalsync.
ייבוא נתונים למכונה חדשה של Cloud SQL
אם קודם מייצאים נתונים ממכונת Cloud SQL שהועברה אל Cloud Storage באמצעות Database Migration Service, ואז מייבאים את הנתונים מ-Cloud Storage אל מכונת Cloud SQL עצמאית, יכול להיות שהייבוא ייכשל כי המשתמש cloudsqlexternalsync לא קיים במכונת היעד.
כדי לפתור את הבעיה, אפשר ליצור את המשתמש cloudsqlexternalsync במופע היעד או להסיר את המשתמש מהמופע שהועבר.