יכול להיות שבתהליך של משימת ההעברה יתרחשו שגיאות בזמן הריצה.
- יש שגיאות שאפשר לתקן, כמו סיסמה שגויה במסד הנתונים של המקור. במקרים כאלה, אחרי שמתקנים את השגיאה, משימת ההעברה ממשיכה באופן אוטומטי.
- חלק מהשגיאות לא ניתנות לשחזור, כמו פגיעה בנתונים או חוסר תאימות לסכימה, ולכן צריך להפעיל מחדש את משימת ההעברה.
אם מתרחשת שגיאה, סטטוס משימת ההעברה משתנה ל-Failed, וסטטוס המשנה משקף את הסטטוס האחרון לפני הכישלון.
כדי לפתור שגיאה, עוברים למשימת ההעברה שנכשלה, בודקים את השגיאה ופועלים לפי השלבים שמפורטים בהודעת השגיאה.
כדי לראות פרטים נוספים על השגיאה, עוברים אל Cloud Monitoring באמצעות הקישור במשימת ההעברה. היומנים מסוננים לפי משימת ההעברה הספציפית.
בטבלה הבאה מפורטות בעיות נפוצות והפתרונות שלהן:
| בבעיה הזו… | יכול להיות שהבעיה היא... | אפשר לנסות את זה… |
|---|---|---|
כשמעבירים לאשכול יעד קיים, מופיעה הודעת השגיאה הבאה:
The destination cluster contains existing data or user defined entities (for example databases, tables, or functions). You can only migrate to empty clusters. Clear your destination cluster and retry the migration job.
|
אשכול היעד של AlloyDB ל-PostgreSQL מכיל נתוני משתמשים נוספים. אפשר להעביר רק לאשכולות קיימים וריקים. מגבלות ידועות | מוחקים את הנתונים הנוספים או הנתונים שמתנגשים מאשכול היעד ומנסים שוב להפעיל את משימת ההעברה. מחיקת נתונים מיותרים מאשכול היעד הקיים. |
| החיבור למכונה של מסד הנתונים במקור נכשל. | הייתה בעיית קישוריות בין מכונת מסד הנתונים במקור לבין אשכול AlloyDB ל-PostgreSQL ביעד. | פועלים לפי השלבים שמפורטים בקטע ניפוי באגים בקישוריות. |
| הפעלת משימת ההעברה נכשלה כי הגרסאות של מסד הנתונים של המקור והיעד לא תואמות. | הגרסאות של מסד הנתונים של המקור והיעד הן לא שילוב נתמך. באופן ספציפי, גרסת מסד הנתונים של המקור שצוינה לא תואמת לגרסת מסד הנתונים של היעד. | מוודאים שגרסת מסד הנתונים של היעד זהה לגרסה הראשית הנתמכת של מסד הנתונים של המקור, או שהיא גרסה מאוחרת יותר. אחר כך יוצרים משימת העברה חדשה. |
| שפות הגדרת נתונים (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 RDS, שימוש באישור בסיס עצמאי במקום בחבילת אישורים עלול לגרום לבעיה הזו. |
יוצרים אישור CA משולב של מקור שמכיל גם את אישור הבסיס וגם את כל אישורי הביניים הנדרשים. במקורות של Amazon RDS, צריך להשתמש בחבילת אישורים שכוללת גם את אישור הביניים וגם את אישור הבסיס. מידע נוסף זמין במאמר הורדת חבילות אישורים במסמכי התיעוד של Amazon RDS. |
|
הודעת השגיאה: |
הערך שמוגדר לפרמטר max_locks_per_transaction לא מספיק. |
צריך להגדיר את הערך של הפרמטר הזה כך שיהיה לפחות {max_number_of_tables_per_database}/(max_connections + max_prepared_transactions). |
|
הודעת השגיאה: |
חבילת pglogical לא מותקנת בצורה נכונה במכונה של המקור. | למידע נוסף על התקנה נכונה של החבילה הזו, ראו הגדרת מסד הנתונים של המקור. |
|
הודעת השגיאה: |
המקור שהוגדר נמצא במצב שחזור. | צריך להגדיר מקור שלא נמצא במצב שחזור. |
| ההורדה המלאה איטית. | יכול להיות שהמכונה הראשית של אשכול היעד של AlloyDB ל-PostgreSQL תייבא לאט נתונים גדולים ממסד הנתונים של המקור. |
|
הודעת השגיאה: 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. |
במקור יש טבלאות עם תמיכה מוגבלת, למשל טבלאות בלי מפתחות ראשיים. |
זוהי הודעת אזהרה. אפשר להמשיך בהעברה, אבל חשוב לזכור שבהעברות רגילות, טבלאות בלי מפתחות ראשיים משכפלות רק את תמונת המצב הראשונית ואת הצהרות |
| כשמעבירים מסדי נתונים נבחרים ומשימת ההעברה לא מצליחה לשכפל נתונים למסד נתונים אחד או יותר, הסטטוס נכשל מוצג ברשימת מסדי הנתונים. | שגיאות שונות במשימת ההעברה. | בעמודה שגיאות, לוחצים על הצגת השגיאות ומתקנים אותן. אפשר גם להסיר את מסדי הנתונים שנכשלו ממשימת ההעברה. מידע נוסף על הסרת מסד נתונים שנכשל ממשימת העברה זמין במאמר ניהול משימות העברה. |
מחיקת נתונים מיותרים מאשכול היעד הקיים
כשמעבירים לאשכול יעד קיים, מופיעה הודעת השגיאה הבאה:
The destination cluster contains existing data or user defined
entities (for example databases, tables, or functions). You can only
migrate to empty clusters. Clear your destination cluster and retry
the migration job.
הבעיה הזו יכולה לקרות אם אשכול היעד מכיל נתונים נוספים. אפשר להעביר רק לאשכולות קיימים וריקים. מגבלות ידועות
דברים שכדאי לנסות
כדי לנקות את הנתונים הסותרים או הנוספים מאשכול היעד ולהתחיל מחדש את משימת ההעברה:
- עצירת משימת ההעברה.
- מתחברים למכונה הראשית של אשכול היעד ב-AlloyDB ל-PostgreSQL באמצעות
psqlאו AlloyDB Studio. -
מסירים נתונים מיותרים ממסדי הנתונים של אשכול היעד. היעד יכול להכיל רק נתוני הגדרות מערכת. מסדי הנתונים של היעד לא יכולים להכיל נתוני משתמשים (כמו טבלאות או שגרות שהוגדרו על ידי המשתמש). יש כמה הצהרות SQL שאפשר להריץ על מסדי הנתונים כדי למצוא נתונים שהם לא של המערכת:
דוגמה להצהרת SQL לאחזור מסדי נתונים שאינם של המערכת (לחצו כדי להרחיב)
SELECT datname FROM pg_catalog.pg_database WHERE datname NOT IN ('alloydbadmin', '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 NOT IN ('plpgsql', 'alloydb_utility');
- מוחקים את כל מסדי הנתונים שאינם של המערכת, טבלאות המשתמשים והפונקציות בהגדרת המשתמש שזוהו בשלב הקודם.
- מתחילים את משימת ההעברה.
ניקוי משבצות רפליקציה
מופיעה אחת מההודעות הבאות:
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.
יכול להיות שהבעיה היא
כשמקַדמים אשכול יעד של AlloyDB ל-PostgreSQL, אם אי אפשר להגיע למכונה של המקור מאשכול AlloyDB ל-PostgreSQL (לדוגמה, המכונה של המקור לא פועלת, או שהסרתם את אשכול AlloyDB ל-PostgreSQL מרשימת ההיתרים של מכונות המקור), אי אפשר לנקות את ההגדרות שנדרשות לרפליקציה במהלך הקידום של משימת ההעברה. צריך לנקות את משבצות השכפול באופן ידני.
דברים שכדאי לנסות
לכל מסד נתונים, מריצים את הפקודות הבאות כמשתמש עם הרשאת superuser:
מאתרים את השמות של משבצות הרפליקציה בהודעת השגיאה, ואז מריצים את הפקודה הבאה כדי להסיר את המשבצות, אחת אחרי השנייה:
SELECT pg_drop_replication_slot('slot_name');
-
אם השמות של משבצות השכפול לא זמינים בהודעת השגיאה, מריצים את הפקודה הבאה כדי לשלוח שאילתה על משבצות השכפול הקיימות:
SELECT pg_drop_replication_slot(slot_name) FROM pg_replication_slots WHERE slot_name LIKE '%alloydb%' AND active = 'f';
-
אם אין רפליקות של AlloyDB ל-PostgreSQL שמשתמשות במכונה המקורית, מריצים את הפקודה הבאה כדי לנקות את ההגדרות של
pglogical:SELECT pglogical.drop_node(node_name) FROM pglogical.node WHERE node_name LIKE '%alloydb%';
-
אם כבר לא צריך את התוסף
pglogical, מריצים את הפקודה הבאה כדי להסיר אותו:DROP EXTENSION IF EXISTS pglogical;
הודעת שגיאה: Cannot connect to invalid database
כשמעבירים ל-PostgreSQL גרסה 15, אחרי כמה ניסיונות חוזרים של התחברות, מתרחש אחד מהתסמינים הבאים:
-
מוצגת הודעת השגיאה
Cannot connect to invalid database. - המדד Total destination storage usage migration job לא מראה התקדמות אחרי הרבה זמן, כשמשימת ההעברה מבצעת את ה-dump המלא של מסד הנתונים.
יכול להיות שהבעיה היא
הבעיה הזו קשורה לעיתים קרובות לבעיית המבוי הסתום בתוסף pglogical. מידע נוסף זמין בכלי למעקב אחר בעיות של pglogical ב-GitHub.
דברים שכדאי לנסות
מבצעים שוב את משימת ההעברה עם אשכול יעד חדש
נסו למחוק את אשכול היעד שבו נתקלתם בבעיה וליצור מחדש את משימת ההעברה. איך לעשות את זה?
- מוחקים את משימת ההעברה שנכשלה. אפשר לקרוא מידע נוסף במאמר בדיקה של משימת העברה.
- מוחקים את אשכול היעד שבו נתקלתם בבעיה. ניהול אשכולות ב-AlloyDB
- יוצרים מחדש את משימת ההעברה. איך יוצרים משימת העברה
מעבר לגרסת ביניים
כדאי לעבור לגרסה קודמת של PostgreSQL, כמו PostgreSQL 14. אחרי שההעברה מסתיימת, אתם יכולים לשדרג למכונה הרצויה של PostgreSQL 15. שדרוג גרסה ראשית של מסד נתונים במאמרי העזרה של AlloyDB ל-PostgreSQL.
מחיקת אשכולות מיותרים של AlloyDB ל-PostgreSQL במצב אתחול
במקרים נדירים, יכול להיות שמשימת ההעברה נמחקה, אבל אשכול AlloyDB ל-PostgreSQL שמשויך אליה לא נמחק ועדיין נמצא במצב אתחול. כדי למחוק את האשכול, אפשר להשתמש בפקודה gcloud alloydb clusters delete עם האפשרות --force:
gcloud alloydb clusters delete CLUSTER_ID \ --region=REGION_ID \ --force
שימו לב: אם מוחקים אשכול אתחול בזמן שהוא נמצא בשימוש על ידי משימת העברה פעילה, התוצאה היא התנהגות לא מוגדרת.
ניהול משתמשים ותפקידים
העברת משתמשים קיימים
נכון לעכשיו, Database Migration Service לא תומך בהעברה אוטומטית של משתמשים ותפקידים קיימים ממכונה במקור לאשכול AlloyDB ל-PostgreSQL ביעד. כדי לנהל את ההעברה הזו, אתם יכולים ליצור את המשתמשים ב-AlloyDB ל-PostgreSQL באופן ידני.
מידע על המשתמש alloydbexternalsync
במהלך העברה רגילה, כל האובייקטים של מסד הנתונים ברפליקה של AlloyDB ל-PostgreSQL נמצאים בבעלות המשתמש alloydbexternalsync (בהעברות מהירות, המשתמש הוא postgres). אחרי שהנתונים מועברים ומשימת ההעברה מקודמת, אתם יכולים לשנות את הבעלות על האובייקטים למשתמשים אחרים באפליקציה. כדי לעשות את זה:
- מריצים את הפקודה
GRANT alloydbexternalsync TO USER;. - בכל מסד נתונים, מריצים את הפקודה
REASSIGN OWNED BY alloydbexternalsync TO USER;. - כדי להסיר את המשתמש
alloydbexternalsync, מריצים את הפקודהDROP ROLE alloydbexternalsync;.