שימוש בקובץ 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 פלטפורמה (GCP).
HOST שם המארח של חשבון המשתמש בפלטפורמה (GCP). 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 אם אתם משתמשים בגרסה קודמת של MySQL מגרסה 8.0.26, אז צריך להשתמש בערך --master-data לפרמטר הזה. בגרסאות של MySQL מ-8.0.26 ואילך, מגדירים את הערך של הפרמטר הזה ל---source-data.
ADD_DROP_TABLE אם רוצים להוסיף הצהרת DROP TABLE לפני כל הצהרת CREATE TABLE, צריך לכלול את --add-drop-table.
ROUTINES אם רוצים להציג את התרחישים המאוחסנים, כמו פרוצדורות ופונקציות, בפלט של מסדי הנתונים שנוצרו, צריך לכלול את --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",
    "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",
    "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 ומספר היציאה ששמורים למופע של ייצוג המקור.
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 להעברת ייבוא מנוהל זמין במאמר דגלים מותרים ודגלי ברירת מחדל לסנכרון ראשוני

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

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

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

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

  • בודקים את מדדי השכפול של מופע הרפליקה בקטע Cloud Monitoring במסוף Google Cloud .
  • אפשר למצוא את השגיאות משרשור הקלט/פלט או משרשור ה-SQL של MySQL בקבצים mysql.err log ב-Cloud Logging.
  • השגיאה יכולה להופיע גם כשמתחברים למופע המשוכפל. מריצים את הפקודה SHOW SLAVE STATUS ובודקים אם השדות הבאים מופיעים בפלט:
    • Slave_IO_Running
    • Slave_SQL_Running
    • Last_IO_Error
    • Last_SQL_Error
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 נכונה.
  • המשתמש, המארח והסיסמה של השכפול נכונים.

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