שימוש בקובץ dump כדי להגדיר שכפול ממאגרי נתונים חיצוניים

בדף הזה מתואר התהליך להגדרת שכפול כשקיים קובץ dump שיצרתם מהשרת החיצוני.

חשוב להשלים את כל השלבים בדף הזה. בסיום התהליך, תוכלו לנהל ולנטר את מכונת המקור בדיוק כמו כל מכונה אחרת ב-Cloud SQL.

לפני שמתחילים

לפני שמתחילים, צריך להגדיר את השרת החיצוני, ליצור את מופע הייצוג של המקור ולהגדיר את הרפליקה של Cloud SQL.

עדכון ההרשאות של משתמש השכפול

משתמש השכפול בשרת החיצוני מוגדר לקבל חיבורים מכל מארח (%). כדאי לעדכן את חשבון המשתמש הזה כך שאפשר יהיה להשתמש בו רק עם העותק המשוכפל של Cloud SQL. פותחים טרמינל בשרת החיצוני ומזינים את הפקודות הבאות:

לקוח mysql

    UPDATE mysql.user
      SET Host='NEW_HOST'
      WHERE Host='OLD_HOST'
      AND User='USERNAME';
      GRANT REPLICATION SLAVE, EXECUTE
      ON *.* TO 'GCP_USERNAME'@'HOST';
    FLUSH PRIVILEGES;

דוגמה

    UPDATE mysql.user
      SET Host='192.0.2.0'
      WHERE Host='%'
      AND User='replicationUser';
      GRANT REPLICATION SLAVE, EXECUTE
      ON *.* TO 'gcp_user'@'gmail.com';
    FLUSH PRIVILEGES;
מאפיין (property) תיאור
NEW_HOST מציינים את כתובת ה-IP היוצאת של העותק המשוכפל של Cloud SQL.
OLD_HOST הערך הנוכחי שמוקצה למאפיין Host שרוצים לשנות.
USERNAME חשבון המשתמש של השכפול בשרת החיצוני.
GCP_USERNAME שם המשתמש של חשבון המשתמש Google Cloud .
HOST שם המארח של חשבון המשתמש Google Cloud .

אימות הגדרות השכפול

אחרי שתסיימו את ההגדרה, תוודאו שהרפליקה של Cloud SQL יכולה לשכפל מהשרת החיצוני.

קודם כל, צריך לוודא שהגדרות הסנכרון החיצוניות נכונות. כדי לעשות את זה, משתמשים בפקודות הבאות כדי לאמת:

  • קישוריות בין העותק המשוכפל של Cloud SQL לבין שרת חיצוני
  • הרשאות משתמש לשכפול
  • תאימות גרסאות
  • השכפול של העותק המשוכפל ב-Cloud SQL לא מתבצע כבר
  • הפעלת binlog בשרת חיצוני
  • מופעל מזהה עסקה גלובלי (GTID)

פותחים טרמינל ומזינים את הפקודות הבאות כדי לוודא שהגדרות הסנכרון החיצוני נכונות:

curl

    gcloud auth login
    ACCESS_TOKEN="$(gcloud auth print-access-token)"
    curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
         --header 'Content-Type: application/json' \
         --data '{
             "syncMode": "SYNC_MODE",
             "skipVerification": "SKIP_VERIFICATION"
           }' \
         -X POST \
         https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/REPLICA_INSTANCE/verifyExternalSyncSettings

דוגמה

    gcloud auth login
    ACCESS_TOKEN="$(gcloud auth print-access-token)"
    curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
         --header 'Content-Type: application/json' \
         --data '{
             "syncMode": "online"
           }' \
         -X POST \
         https://sqladmin.googleapis.com/sql/v1beta4/projects/myproject/instances/myreplica/verifyExternalSyncSettings
מאפיין (property) תיאור
SYNC_MODE ‫verifyExternalSyncSettings מוודא שאפשר לשמור את העותק המשוכפל של Cloud SQL ואת השרת החיצוני בסנכרון אחרי שההעתקה מוגדרת. מצבי הסנכרון כוללים EXTERNAL_SYNC_MODE_UNSPECIFIED,‏ ONLINE ו-OFFLINE.
SKIP_VERIFICATION האם לדלג על שלב האימות המובנה לפני סנכרון הנתונים. מומלץ רק אם כבר אימתתם את הגדרות השכפול.
PROJECT_ID המזהה של הפרויקט ב- Google Cloud.
REPLICA_INSTANCE המזהה של העותק המשוכפל ב-Cloud SQL.

ייצוא מסד הנתונים לקטגוריה של Cloud Storage

אפשר לאכלס רפליקה של Cloud SQL באמצעות קובץ mysqldump שנמצא בקטגוריה של Cloud Storage. התנאים האלה חלים:

  • חובה להשתמש בכלי mysqldump שמצורף ל-MySQL.
  • בזמן ש-mysqldump פועל, אל תבצעו פעולות DDL בשרת החיצוני. אם תעשו את זה, יכול להיות שיהיו אי-התאמות בקובץ הייצוא.

כדי לייצא את מסד הנתונים לקטגוריה של Cloud Storage:

  1. ב- Google Cloud, יוצרים קטגוריה של Cloud Storage.
  2. פותחים טרמינל באמצעות לקוח שמתחבר לשרת מסד הנתונים החיצוני ומריצים את הפקודה הבאה.

mysqldump

    mysqldump \
        --host=EXTERNAL_HOST \
        --port=EXTERNAL_PORT \
        --user=USERNAME \
        --password=PASSWORD \
        --databases=DATABASE_LIST  \
        --hex-blob \
        SOURCE_DATA  \
        --no-autocommit \
        --default-character-set=utf8mb4 \
        --single-transaction \
        --set-gtid-purged=on \
        ADD_DROP_TABLE \
        ROUTINES \
        COMPRESS \
        GZIP \
        | gcloud storage cp - gs://BUCKET/DUMP_FILENAME

דוגמה

    mysqldump \
        --host=192.0.2.1 \
        --port=3306 \
        --user=replicationUser \
        --password \
        --databases guestbook journal \
        --hex-blob \
        --master-data=1 \
        --no-autocommit \
        --default-character-set=utf8mb4 \
        --single-transaction \
        --compress \
        | gzip \
        | gcloud storage cp - gs://replica-bucket/external-database.sql.gz
מאפיין (property) תיאור
EXTERNAL_HOST כתובת ה-IPv4 או ה-DNS של השרת החיצוני.
EXTERNAL_PORT היציאה של השרת החיצוני. אם השרת החיצוני מתארח ב-Cloud SQL, זהו 3306.
USERNAME השם של חשבון המשתמש לשכפול או של חשבון המשתמש בשרת החיצוני שיש לו הרשאות קריאה במסד הנתונים.
PASSWORD סיסמת משתמש השכפול.
DATABASE_LIST רשימה של כל מסדי הנתונים בשרת החיצוני, מופרדים ברווחים, למעט מסדי הנתונים של המערכת (sys, ‏ mysql, ‏ performance_schema ו-information_schema). אפשר להשתמש בפקודה SHOW DATABASES MySQL כדי להציג את מסדי הנתונים.
SOURCE_DATA אם אתם משתמשים בגרסה מוקדמת יותר מ-8.0.26 של MySQL, אז צריך להשתמש בערך --master-data לפרמטר הזה. בגרסאות של MySQL מ-8.0.26 ואילך, מגדירים את הערך של הפרמטר הזה ל---source-data.
ADD_DROP_TABLE אם רוצים להוסיף הצהרת DROP TABLE לפני כל הצהרת CREATE TABLE, צריך לכלול את --add-drop-table.
ROUTINES אם רוצים להציג בשורת הפלט של מסדי נתונים שנוצרו באמצעות dump שגרות מאוחסנות, כמו פרוצדורות ופונקציות, צריך לכלול את האפשרות --routines.
COMPRESS אם רוצים לדחוס את כל המידע שנשלח בין העותק המשוכפל של Cloud SQL לבין השרת החיצוני, משתמשים ב---compress.
GZIP אם רוצים לדחוס עוד יותר את קובץ ה-dump, משתמשים ב-| gzip. אם מסד הנתונים שלכם מכיל נתונים שלא ניתן לדחוס, כמו נתונים בינאריים שלא ניתן לדחוס או תמונות בפורמט JPG, אל תשתמשו באפשרות הזו.
BUCKET שם הקטגוריה שיצרתם בשלב 1 כדי שתכיל את קובץ ה-dump.
DUMP_FILENAME נוצר קובץ בשם הזה בקטגוריה. הקובץ הזה מכיל את התוכן של מסד הנתונים בשרת החיצוני שלכם.

מעדכנים את מופע הייצוג של המקור עם נתיב הקובץ של הקטגוריה ב-Cloud Storage

מכונת הייצוג של המקור היא מכונת Cloud SQL שמייצגת את שרת מסד הנתונים המקורי עבור העותק המשוכפל של Cloud SQL. היא מוצגת במסוף Google Cloud ונראית כמו מופע רגיל של Cloud SQL, אבל היא לא מכילה נתונים, לא דורשת הגדרה או תחזוקה ולא משפיעה על החיוב.

הקובץ source.json מכיל מידע על מופע הייצוג של המקור.

REST

{
  "name": "PRIMARY_INSTANCE_NAME",
  "region": "REGION_NAME",
  "databaseVersion": "DB_NAME_AND_VERSION",
  "onPremisesConfiguration": {
    "hostPort": "IP_ADDRESS_AND_PORT",
    "selectedObjects": "SELECTED_OBJECTS",
    "username": "USERNAME",
    "password": "PASSWORD"
  },
  "dumpFilePath" :"DUMP_FILE_PATH"
}

דוגמה

{
  "name": "cloudsql-source-instance",
  "region": "us-central1",
  "databaseVersion": "MYSQL_5_7",
  "onPremisesConfiguration": {
    "hostPort": "192.0.2.0:3306",
    "selectedObjects":[{"database":"db1"}, {"database":"db3"}],
    "username": "replicationUser",
    "password": "486#@%*@"
  },
  "dumpFilePath" :"gs://replica-bucket/source-database.sql.gz"
}
מאפיין (property) תיאור
PRIMARY_INSTANCE_NAME השם של מכונת Cloud SQL שמשויכת למכונת ייצוג המקור.
REGION_NAME השם של האזור שהוקצה למופע של ייצוג המקור.
DB_NAME_AND_VERSION השם ומספר הגרסה של מסד הנתונים שמשויך למופע של ייצוג המקור.
IP_ADDRESS_AND_PORT כתובת ה-IP ומספר היציאה ששמורים למופע של ייצוג המקור.
SELECTED_OBJECTS רשימה מעודכנת של אובייקטים מופרדים בפסיקים, שבה מצוינים מסדי הנתונים שאתם מעבירים ממופע ייצוג המקור למופע היעד של Cloud SQL.
USERNAME שם המשתמש של מופע ייצוג המקור.
PASSWORD הסיסמה של מופע ייצוג המקור.
DUMP_FILE_PATH הנתיב של קובץ ה-dump שמכיל את התוכן של מסד הנתונים בשרת החיצוני.

אחרי שמגדירים את הרפליקה של Cloud SQL, צריך לעדכן את מופע הייצוג של המקור בנתיב הקובץ של הקטגוריה של Cloud Storage.

REST

    gcloud auth login
    ACCESS_TOKEN="$(gcloud auth print-access-token)"
    curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
         --header 'Content-Type: application/json' \
         --data @JSON_PATH \
         -X PATCH \
         https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/SOURCE_REPRESENTATION_INSTANCE

דוגמה

    gcloud auth login
    ACCESS_TOKEN="$(gcloud auth print-access-token)"
    curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
         --header 'Content-Type: application/json' \
         --data @./source.json \
         -X PATCH \
         https://sqladmin.googleapis.com/sql/v1beta4/projects/MyProject/instances/cloudsql-source-instance
מאפיין (property) תיאור
JSON_PATH הנתיב של הקובץ JSON שמאוחסן בקטגוריה של Cloud Storage. הקובץ הזה מכיל נתונים על מופע ייצוג המקור.
PROJECT_ID המזהה של הפרויקט ב- Google Cloud.
SOURCE_REPRESENTATION_INSTANCE השם של מופע ייצוג המקור.

התחלת השכפול בשרת החיצוני

אחרי שמוודאים שאפשר לשכפל מהשרת החיצוני, אפשר לבצע את השכפול.

במהלך תהליך הייבוא הראשוני, אל תבצעו פעולות DDL בשרת החיצוני. זה עלול לגרום לחוסר עקביות במהלך הייבוא. אחרי שתהליך הייבוא מסתיים, העותק משתמש ביומני הנתונים הבינאריים בשרת החיצוני כדי להתעדכן במצב הנוכחי של השרת החיצוני.

פותחים טרמינל, מתחברים באמצעות gcloud ומזינים את הפקודה curl כדי לשכפל מהשרת החיצוני.

REST

    gcloud auth login
    ACCESS_TOKEN="$(gcloud auth print-access-token)"
    curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
         --header 'Content-Type: application/json' \
         --data '{
             "syncMode": "SYNC_MODE",
             "skipVerification": "SKIP_VERIFICATION"
           }' \
         -X POST \
         https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/REPLICA_INSTANCE/startExternalSync

דוגמה

    gcloud auth login
    ACCESS_TOKEN="$(gcloud auth print-access-token)"
    curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \
         --header 'Content-Type: application/json' \
         --data '{
             "syncMode": "online",
             "skipVerification": false
           }' \
         -X POST \
         https://sqladmin.googleapis.com/sql/v1beta4/projects/MyProject/instances/replica-instance/startExternalSync
מאפיין (property) תיאור
SYNC_MODE מוודאים שאפשר לשמור על סנכרון בין העותק המשוכפל של Cloud SQL לבין השרת החיצוני אחרי שמגדירים את השכפול.
SKIP_VERIFICATION האם לדלג על שלב האימות המובנה לפני סנכרון הנתונים. מומלץ רק אם כבר אימתתם את הגדרות השכפול.
PROJECT_ID המזהה של הפרויקט ב- Google Cloud.
REPLICA_INSTANCE המזהה של העותק המשוכפל ב-Cloud SQL.

פינוי נפח האחסון

אם שכפלתם מקובץ בדלי, אתם יכולים להסיר את הקובץ והדלי. במסמכי העזרה של Cloud Storage מוסבר איך למחוק אובייקטים ואיך למחוק קטגוריות.

המשך השכפול

אחרי שמתחילים את השכפול מהשרת החיצוני, צריך לעקוב אחרי השכפול ואז להשלים את ההעברה. מידע נוסף זמין במאמר מעקב אחרי רפליקציה.

פתרון בעיות

שגיאה פתרון בעיות
Lost connection to MySQL server during query when dumping table. יכול להיות שהמקור הפך ללא זמין, או שה-dump הכיל חבילות גדולות מדי.

מוודאים שהמקור הראשי החיצוני זמין להתחברות. אפשר גם לשנות את הערכים של הדגלים net_read_timeout ו-net_write_timeout במופע המקור כדי שהשגיאה לא תופיע. מידע נוסף על הערכים המותרים של הדגלים האלה זמין במאמר בנושא הגדרת דגלים של מסד נתונים.

מידע נוסף על שימוש בדגלים של mysqldump לייבוא מנוהל של נתונים זמין במאמר .

הגיבוי הראשוני נכשל בגלל שגיאות שקשורות לזמן קצוב לתפוגה או לניתוק מהחיבור (לדוגמה, Dump timeout או Lost connection to MySQL server). השגיאה הזו יכולה להתרחש אם הצהרת DDL אחת או יותר יוצרת אינטראקציה עם תהליך ה-dump המקביל, וגורמת לתהליך להמתין ללא הגבלת זמן.

פתרון: אל תריצו הצהרות DDL במסד הנתונים של המקור במהלך שלב ההעברה הראשוני. לפני שמריצים הצהרות DDL, מפעילים מחדש את ההעברה וממתינים לסיום שלב הגיבוי הראשוני.

המיגרציה הראשונית של הנתונים הושלמה, אבל לא מתבצעת שכפול של הנתונים.

אחת הסיבות האפשריות לכך היא שבמסד הנתונים של המקור הוגדרו דגלי שכפול שגורמים לכך שחלק מהשינויים במסד הנתונים או כולם לא משוכפלים.

מוודאים שדגלי השכפול, כמו binlog-do-db,‏ binlog-ignore-db,‏ replicate-do-db או replicate-ignore-db, לא מוגדרים בצורה שיוצרת התנגשות.

מריצים את הפקודה show master status במופע הראשי כדי לראות את ההגדרות הנוכחיות.

המיגרציה הראשונית של הנתונים הושלמה בהצלחה, אבל שכפול הנתונים מפסיק לפעול אחרי זמן מה.

פעולות שכדאי לנסות:

  • בודקים את מדדי השכפול של מופע הרפליקה בקטע Cloud Monitoring במסוף Google Cloud .
  • השגיאות משרשור ה-IO או משרשור ה-SQL של MySQL מופיעות בCloud Logging בקובצי היומן mysql.err.
  • השגיאה יכולה להופיע גם כשמתחברים למופע המשוכפל. מריצים את הפקודה SHOW REPLICA STATUS ובודקים את השדות הבאים בפלט:
    • Replica_IO_Running
    • Replica_SQL_Running
    • Last_IO_Error
    • Last_SQL_Error

אם מופיעה השגיאה Unknown database DATABASE_NAME on query. Error_code: MY-001049, המשמעות היא שהשכפול נכשל בגלל הצהרת SQL משוכפלת שמנסה להפנות למסד נתונים שלא נבחר להעברה. כדי לשחזר את השכפול, צריך לקבוע אם השגיאה מבוססת על הודעה שנובעת מ-DDL באחד מהאובייקטים הבאים:

  • אירוע או פעולה שגרתית. אפשר להריץ את הפקודה CALL mysql.skipReplicationError() ברפליקה, וכך למנוע את השכפול של האירוע או השגרה ולהמשיך את השכפול.
  • אילוץ או תצוגה של מפתח זר. אחרי שקובעים באיזה מסד נתונים נמצא האובייקט ששונה על ידי ההצהרה, יש שתי אפשרויות לשחזור. אפשר להסיר את מסד הנתונים ממסדי הנתונים שנבחרו להעברה, או להריץ את הפקודה CALL mysql.skipReplicationError() על העותק המשוכפל כדי להמשיך את השכפול תוך דילוג על האילוץ או על ההפצה של התצוגה לעותק המשוכפל.
mysqld check failed: data disk is full. דיסק הנתונים של מופע הרפליקה מלא.

מגדילים את גודל הדיסק של מכונת ההעתקה. אפשר להגדיל את גודל הדיסק באופן ידני או להפעיל הגדלה אוטומטית של נפח האחסון.

בדיקת יומני השכפול

כשמאמתים את הגדרות השכפול, נוצרים יומני רישום.

כדי לראות את היומנים האלה:

  1. נכנסים לכלי Logs Viewer במסוף Google Cloud .

    כניסה לדף Logs Viewer

  2. בתפריט הנפתח Instance (מופע), בוחרים את העותק המשוכפל של Cloud SQL.
  3. בוחרים את קובץ היומן replication-setup.log.

אם העותק המשוכפל של Cloud SQL לא מצליח להתחבר לשרת החיצוני, צריך לוודא את הדברים הבאים:

  • חומת אש בשרת החיצוני מוגדרת כך שתאפשר חיבורים מכתובת ה-IP היוצאת של העותק המשוכפל של Cloud SQL.
  • הגדרת ה-SSL/TLS שלכם נכונה.
  • המשתמש, המארח והסיסמה של השכפול נכונים.

המאמרים הבאים