בדף הזה מפורטות בעיות מוכרות בטבלאות יתומות ב-MySQL.
מהם טבלאות יתומות?
טבלאות יתומות הן טבלאות עם הגדרות מנותקות במילוני נתונים של MySQL, והן יכולות להופיע ב-MySQL 5.6 או ב-MySQL 5.7. אחד מהתרחישים הבאים יכול לחסום שדרוג של גרסה ראשית (MVU) מ-MySQL 5.7 ל-MySQL 8.0:
- קיימים קובצי נתונים
InnoDB(.ibd) ללא קובצי הגדרה תואמים (.frm), או להפך. - קיום של טבלאות ביניים שנשארו מהצהרות
ALTER TABLEשכבר לא מתייחסים אליהן או משתמשים בהן בלוגיקה של אפליקציה פעילה.
טבלאות זמניות יתומות
שמות של טבלאות זמניות יתומות מתחילים בקידומת #sql-, כמו #sql-123.
אפשר להשתמש בשאילתה הבאה כדי לזהות טבלאות זמניות (temp) יתומות:
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME RLIKE '#sql-[0-9].*';
אפשר להשתמש בפקודה DROP TABLE כדי להסיר טבלאות זמניות יתומות בלי לבצע שלבים נוספים. הפתרון הזה מתאים לרוב המקרים:
DROP TABLE `DB`.`#mysql50#TEMPORARY_ORPHAN_TABLE`;
מחליפים את DB בשם מסד הנתונים שרוצים להשתמש בו.
דוגמה:
DROP TABLE `testdb`.`#mysql50##sql-1234`;
אם הפקודה הקודמת של טבלת DROP לא פועלת, יכול להיות שקובץ ההגדרה (.frm) נמצא בשימוש חוזר על ידי פעולה אחרת של ALTER TABLE. במקרים כאלה, צריך ליצור קובץ placeholder
.frm בדיסק כדי להסיר את הטבלה. לקבלת עזרה, אפשר לפנות אל התמיכה של Cloud SQL.
אם אין לכם חוזה תמיכה, תוכלו להיעזר בשיטות לשירות עצמי כדי לפתור את הבעיה.
טבלאות ביניים יתומות
שמות של טבלאות ביניים יתומות מתחילים בקידומת #sql-ib, לדוגמה, #sql-ib23-343224.
כדי לזהות טבלאות ביניים יתומות, משתמשים בשאילתה הבאה:
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE '%#sql-ib%';
כדי להסיר טבלאות יתומות ביניים, קודם משנים את שם הקובץ של הגדרת הטבלה היתומה (.frm) כך שיתאים לשם הטבלה, ואז משמיטים את הטבלה משורת הפקודה.
כדי להסיר טבלאות יתומות ביניים, צריך לפנות לצוות התמיכה של Cloud SQL לקבלת עזרה. אם אין לכם חוזה תמיכה, תוכלו לעיין בשיטות לשירות עצמי כדי לקבל שלבים לפתרון בעיות.
טבלאות רגילות יתומות
טבלת יתום InnoDB נוצרת כשקובץ הנתונים התואם שלה (.ibd) נשאר במערכת הקבצים, אבל מילון הנתונים כבר לא מפנה לקובץ הנתונים בצורה נכונה. בתרחיש הזה נדרבת התערבות ידנית.
כדי לפתור את הבעיה הזו, צריך לפנות לתמיכה של Cloud SQL. צוות התמיכה יכול ליצור קובץ placeholder .frm ואז להשתמש בפקודה DROP TABLE כדי לנסות להסיר את הטבלה. אם הפעולה נכשלת, סביר להניח שצריך להסיר את הקובץ InnoDB (.ibd) באופן ידני מספריית הנתונים.
אחרי שמסירים את הקובץ באופן ידני, אפשר לגבות את כל הטבלאות ואת מבני מסד הנתונים.
מחיקת מסד נתונים באמצעות DROP DATABASE ויצירת מסד נתונים באמצעות CREATE DATABASE. השלב האחרון הזה עשוי לדרוש השבתה של האפליקציות שמחוברות למסד הנתונים המושפע.
אם אין לכם חוזה תמיכה, תוכלו להיעזר בשיטות לשירות עצמי כדי לפתור את הבעיה.
פתרון בעיות בשירות עצמי
השיטות הבאות לפתרון בעיות בשירות עצמי כוללות השמטה או העברה של כל מסד הנתונים כדי להסיר את הטבלאות היתומות, אם השמטה של טבלה בודדת לא פועלת. השיטה הזו משבשת את הפעילות. אם לארגון שלכם יש הסכם תמיכה, מומלץ מאוד לפנות לצוות התמיכה של Cloud SQL לקבלת עזרה.
כדי להסיר טבלאות זמניות יתומות, צריך קודם לפעול לפי השלבים שמפורטים במאמר בנושא טבלאות זמניות יתומות. אם הפקודה DROP TABLE לא מצליחה, נסו את ההצעות הבאות.
לפני שמתחילים
מומלץ מאוד ליצור גיבוי מלא של המופע כדי לצמצם את הסיכון לאובדן נתונים.
כדי לצמצם את משך ההשבתה האפשרי של האפליקציה, מומלץ מאוד לשכפל את המופע ולאמת את שלבי המיגרציה הבאים לפני שמבצעים אותם בסביבת ייצור.
מידע נוסף מופיע במאמר שיבוט של מופעים.
הורדת סכימה באמצעות העברת אובייקטים
העברת אובייקטים במסד נתונים היא תהליך רב-שלבי להעברת אובייקטים במסד נתונים, כמו טבלאות, לסכימה זמנית:
- מגבים אובייקטים אחרים במסד הנתונים, כולל פרוצדורות, פונקציות ותצוגות.
- מבטלים את הסכימה המושפעת ויוצרים אותה מחדש.
- מייבאים את האובייקטים שגובו בחזרה לסכימה המקורית.
בדרך כלל שיטת ההעברה הזו גורמת להשבתה של האפליקציה. כדי למזער את ההפרעות, מומלץ להכין מראש את כל הסקריפטים הנדרשים. לדוגמה, מוודאים שהסקריפטים מוכנים לטפל במקרים הבאים:
- שינוי השם של הטבלאות והעברה שלהן לסכימה זמנית.
- גיבוי של אובייקטים אחרים במסד הנתונים, כמו פרוצדורות, פונקציות, תצוגות וכל אובייקט אחר.
- שחזור כל האובייקטים במסד הנתונים לסכימה המקורית.
אחרי שהסקריפטים מוכנים, מבצעים את השלבים הבאים:
- יוצרים סכימה זמנית (לדוגמה:
fix_orphan_tables) באותה מכונה. - עוצרים את התנועה של האפליקציה בסכימה המושפעת.
מעבירים את כל הטבלאות לסכימה זמנית באמצעות
RENAME TABLE:RENAME TABLE DB.TABLE_NAME TO fix_orphan_tables.TABLE_NAME;מחליפים את הפרטים הבאים:
-
DB: שם מסד הנתונים שרוצים להשתמש בו. -
TABLE_NAME: שם הטבלה.
-
גיבוי אובייקטים של מסד נתונים, כמו תצוגות, שגרות, פרוצדורות מאוחסנות, טריגרים ואירועים. אחת הדרכים לעשות זאת היא באמצעות
mysqldump:mysqldump -u USER --password=PASSWORD \ -h HOST_IP --set-gtid-purged=OFF --no-data --no-create-db \ --no-create-info --routines --triggers --skip-opt --events \ DB > DB_export.sqlמחליפים את הפרטים הבאים:
-
USER: שם המשתמש. -
PASSWORD: סיסמת מסד הנתונים. -
HOST_IP: כתובת ה-IP של המארח. -
DB: שם מסד הנתונים שרוצים להשתמש בו.
מומלץ מאוד לגבות ידנית את התצוגות באמצעות קטע הפקודה
SHOW CREATE VIEW.-
משחררים את הסכימה שמכילה טבלאות ללא בעלים.
יוצרים את הסכימה עם השם המקורי.
בודקים אם טבלת הנתונים היתומים הוסרה:
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE '%ORPHAN_TABLE_NAME</var>';מחליפים את
ORPHAN_TABLE_NAMEבשם הטבלה היתומה.מעתיקים את הטבלאות בחזרה לסכימה המקורית:
RENAME TABLE fix_orphan_tables.TABLE_NAME TO DB.TABLE_NAME;מחליפים את הפרטים הבאים:
-
TABLE_NAME: שם הטבלה. -
DB: שם מסד הנתונים שרוצים להשתמש בו.
-
מעתיקים את כל האובייקטים של מסד הנתונים מהגיבוי שנוצר בשלב 4.
mysql -u USER \ --password=PASSWORD \ -h <var>HOST_IP \ -D<var>DB < <var>DB_export.sqlמחליפים את הפרטים הבאים:
-
USER: שם המשתמש. -
PASSWORD: סיסמת מסד הנתונים. -
HOST_IP: כתובת ה-IP של המארח. -
DB: שם מסד הנתונים שרוצים להשתמש בו.
מומלץ מאוד לשחזר ידנית את התצוגות על ידי יצירה שלהן מחדש באמצעות ההצהרה
CREATE VIEW.-
להמשיך את תנועת הנתונים של האפליקציה שהופסקה קודם.
הסרת סכימה באמצעות dump וטעינה לאותה מכונה
דרך נוספת להסיר טבלה יתומה היא לבצע dump מלא של הסכימה המושפעת, להשליך את הסכימה וליצור אותה מחדש, ואז לשחזר את ה-dump. במקרים מסוימים, השיטה הזו עשויה להיות מהירה ופשוטה יותר. כדי לצמצם את ההפרעות, חשוב להכין מראש את כל סקריפטים הגיבוי והשחזור.
אחרי שהסקריפטים מוכנים, מבצעים את השלבים הבאים:
- עוצרים את תעבורת האפליקציה בסכימה המושפעת.
- מגבים את הסכימה שבה נמצאת הטבלה היתומה, כולל כל הפרוצדורות המאוחסנות, הטריגרים, התצוגות והאירועים באמצעות
mysqldump. - מחיקת הסכימה.
- יוצרים את הסכימה מחדש ומשחזרים את קובץ הגיבוי.
- ממשיכים את התנועה של האפליקציה שהופסקה בשלב הראשון.
גיבוי וטעינה למכונה חדשה או למכונה שנוצרה מחדש
בתנאים מסוימים, אי אפשר להסיר את הסכימה שמכילה את הטבלה היתומה. במקרים כאלה, צריך להעביר את הנתונים למופע חדש או ליצור מחדש את המופע הקיים באמצעות dump וטעינה לוגיים. כל אחת מהגישות האלה עלולה לגרום להפרעות באפליקציה, ויכול להיות שתצטרכו להגדיר מחדש את האפליקציות כך שיצביעו על מופע מסד הנתונים החדש שנוצר או שנוצר מחדש. בקטעים הבאים מתוארות שתי השיטות.
העברת נתונים למופע חדש באמצעות Database Migration Service (DMS)
- משתמשים בDatabase Migration Service כדי ליצור מכונה חדשה של Cloud SQL ל-MySQL.
- אחרי שהנתונים שמשויכים למופע החדש יסיימו את השכפול למופע המשוכפל, צריך להפסיק את כל האפליקציות שמתחברות למופע המקור.
- להעלות בדרגה את רפליקת המכונה של Cloud SQL ל-MySQL.
- משנים את כל חיבורי האפליקציות כך שיצביעו על מופע Cloud SQL ל-MySQL החדש שהועלה לרמת ייצור, ומפעילים מחדש את האפליקציות.
שמירת נתונים ושחזור ידני
- אם אתם יוצרים מופע חדש של מסד נתונים, צריך ליצור מופע עם אותה הגדרה כמו המופע הנוכחי.
- עוצרים את כל התנועה של האפליקציה במופע הנוכחי של מסד הנתונים.
- מגבים את כל הסכימות באמצעות
mysqldumpאו כלי דומה. - אם משתמשים באותו מופע, צריך למחוק אותו וליצור אותו מחדש.
- באמצעות הגיבוי שיצרתם בשלב השלישי, משחזרים את הגיבוי למופע החדש או לאותו מופע שנוצר מחדש.
- מפנים את האפליקציות למופע החדש או לאותו מופע שנוצר מחדש וממשיכים את פעולות האפליקציה.