יכול להיות שבתהליך של משימת ההעברה יתרחשו שגיאות בזמן הריצה.
- יש שגיאות שאפשר לתקן, כמו סיסמה שגויה במסד הנתונים של המקור. אחרי שמתקנים אותן, משימת ההעברה ממשיכה באופן אוטומטי.
- חלק מהשגיאות לא ניתנות לשחזור, כמו שגיאות בשכפול נתונים, ולכן צריך להפעיל מחדש את משימת ההעברה מההתחלה.
כשמתרחשת שגיאה, סטטוס משימת ההעברה משתנה ל-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. הגדרת רמת WAL |
הודעת השגיאה: 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 |
משימת ההעברה נכשלה בשלב ה-dump המלא, ואי אפשר לשחזר את המשימה. מופע מסד הנתונים של המקור הופעל מחדש או היה במצב שחזור, או שחיבורי השכפול הסתיימו בגלל ערך לא מספיק שהוגדר לפרמטר כדי למצוא את שורש הבעיה:
|
|
הודעת השגיאה: 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. |
במקור יש טבלאות עם תמיכה מוגבלת, למשל טבלאות בלי מפתחות ראשיים. |
זוהי הודעת אזהרה. אפשר להמשיך בהעברה, אבל חשוב לזכור שישויות שלא נתמכות (למשל טבלאות בלי מפתחות ראשיים) לא יועברו. מידע נוסף זמין במאמר הגדרת מסדי נתונים של מקור. |
| כשמעבירים מסדי נתונים נבחרים ומשימת ההעברה לא מצליחה לשכפל נתונים למסד נתונים אחד או יותר, הסטטוס Failed מופיע ברשימת מסדי הנתונים. | שגיאות שונות במשימת ההעברה. | בעמודה שגיאות, לוחצים על הצגת השגיאות ומתקנים אותן. אפשר גם להסיר את מסדי הנתונים שנכשלו ממשימת ההעברה. מידע נוסף על הסרת מסד נתונים שנכשל ממשימת העברה זמין במאמר ניהול משימות העברה. |
מחיקת נתונים מיותרים מהמופע הקיים של היעד
כשמעבירים למכונה קיימת ביעד, מופיעה הודעת השגיאה הבאה:
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. - המדד של משימת העברת נפח אחסון נדרש לא מראה התקדמות אחרי הרבה זמן, כשמשימת ההעברה מבצעת את ה-dump המלא של מסד הנתונים.
יכול להיות שהבעיה היא
הבעיה הזו קשורה לעיתים קרובות לבעיית מבוי סתום בתוסף pglogical. מידע נוסף זמין בכלי למעקב אחר בעיות של pglogical ב-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 שהועברה באמצעות Database Migration Service ל-Cloud Storage, ואז מייבאים את הנתונים מ-Cloud Storage למכונה עצמאית של Cloud SQL, יכול להיות שהייבוא ייכשל כי המשתמש cloudsqlexternalsync לא קיים במכונת היעד.
כדי לפתור את הבעיה, אפשר ליצור את המשתמש cloudsqlexternalsync במכונה המועברת או להסיר את המשתמש מהמכונה המועברת.