Menggunakan impor kustom untuk menyiapkan replikasi dari database eksternal besar

Halaman ini menjelaskan tentang proses penyiapan replikasi server eksternal menggunakan impor kustom. Langkah-langkah ini adalah pilihan terbaik jika Anda perlu mereplikasi dari database eksternal yang besar.

Anda harus menyelesaikan semua langkah di halaman ini. Setelah selesai, Anda dapat mengelola dan memantau replikasi dengan cara yang sama seperti yang Anda lakukan pada instance Cloud SQL lainnya.

Proses ini hanya mendukung server eksternal yang dikonfigurasi untuk menggunakan replikasi berbasis ID transaksi global (GTID). Sebelum replikasi dapat dimulai, Anda perlu memuat data dari server eksternal ke replikasi Cloud SQL. Jika Anda tidak menggunakan replikasi berbasis GTID, maka Cloud SQL tidak dapat mengidentifikasi posisi log biner yang tepat tempat replikasi dimulai. Jika tidak dapat menggunakan replikasi berbasis GITD, Anda harus mengonfigurasi alat dump untuk menerapkan kunci hanya baca global selama proses dump.

Sebelum memulai

Sebelum memulai, Anda harus mengonfigurasi server eksternal, membuat instance representasi sumber, dan menyiapkan replika Cloud SQL.

Memperbarui izin untuk pengguna replikasi

Pengguna replikasi di server eksternal dikonfigurasi untuk menerima koneksi dari semua host (%). Anda harus memperbarui akun pengguna ini agar akun ini hanya dapat digunakan dengan replika Cloud SQL. Buka terminal pada server database sumber dan masukkan perintah berikut:

Klien 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;

contoh

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;
Properti Deskripsi
NEW_HOST Menentukan IP keluar dari replika Cloud SQL.
OLD_HOST Nilai saat ini yang ditetapkan ke Host yang ingin Anda ubah.
USERNAME Akun pengguna replikasi di server eksternal.
GCP_USERNAME Nama pengguna untuk akun pengguna GCP.
HOST Nama host untuk akun pengguna GCP.

Menyiapkan replika Cloud SQL sebagai instance utama

Karena instance replika Cloud SQL bersifat hanya baca, agar dapat melakukan impor kustom, Anda perlu mempromosikan replika Cloud SQL ke instance mandiri. Setelah impor data awal selesai, demosikan instance kembali ke replika.

Menjalankan dump dan impor kustom

Di bagian ini, kami akan menunjukkan cara membuat file dump dan mengimpornya ke replika Cloud SQL akhir menggunakan utilitas klien mydumper atau mysqldump.

Saat melakukan dump data, Anda mungkin perlu mengecualikan database umum MySQL, termasuk mysql, dan sys, jika ada di instance sumber. Jika tidak, impor data akan gagal. Baca Cara mengecualikan (atau menyertakan) database?.

Menggunakan mydumper dan myloader

Untuk membuat file dump dan mengimpornya ke Cloud SQL:

  1. Buat file dump dari database server eksternal menggunakan mydumper.

       $ mydumper -u USERNAME -p PASSWORD \
                  --threads=16 -o ./backup \
                  -h HOST \
                  --no-locks \
                  --regex '^(?!(mysql\.|sys\.))'
    
    Properti Deskripsi
    USERNAME Nama akun pengguna replikasi atau akun pengguna di server eksternal yang memiliki izin baca database.
    PASSWORD Sandi pengguna replikasi.
    HOST Alamat IPv4 atau DNS untuk server eksternal.
  2. Impor data ke dalam instance Cloud SQL menggunakan myloader.

     $ myloader -u REPLICA_USERNAME -p REPLICA_PASSWORD \
                --threads=16 \
                -d ./backup -h HOST -o
    
    Properti Deskripsi
    REPLICA_USERNAME Akun pengguna di instance Cloud SQL.
    REPLICA_PASSWORD Sandi pengguna instance Cloud SQL.
    HOST IPv4 untuk instance Cloud SQL.
  3. Tuliskan informasi GTID atau binlog dari data dump tersebut. Anda memerlukan informasi ini saat mengonfigurasi replikasi dengan prosedur yang disimpan.

    Untuk mendapatkan informasi GTID atau binlog data dump, jalankan perintah berikut:

      sudo cat ./backup/metadata
    

Gunakan mysqldump

  1. Buat dump menggunakan mysqldump:

    mysqldump

    mysqldump \
        --host=EXTERNAL_HOST \
        --port=EXTERNAL_PORT \
        --user=USERNAME\
        --password=PASSWORD \
        --databases=DATABASE_LIST  \
        --hex-blob \
        --master-data=EXTERNAL_DATA  \
        --no-autocommit \
        --default-character-set=utf8mb4 \
        --single-transaction \
        GTID_PURGED \
        ADD_DROP_TABLE \
        ROUTINES \
        COMPRESS \
        GZIP
    
    Properti Deskripsi
    EXTERNAL_HOST Alamat IPv4 atau DNS untuk server eksternal.
    EXTERNAL_PORT Port untuk server eksternal. Jika server eksternal dihosting di Cloud SQL, maka ini adalah 3306.
    USERNAME Nama akun pengguna replikasi atau akun pengguna di server eksternal yang memiliki izin baca database.
    USER_PASSWORD Sandi pengguna replikasi.
    DATABASE_LIST Daftar yang dipisahkan spasi dari semua database di server eksternal, kecuali untuk database sistem (sys,mysql, performance_schema, dan information_schema). Gunakan perintah MySQL SHOW DATABASES untuk mencantumkan database Anda.
    EXTERNAL_DATA Jika server eksternal Anda tidak mendukung GTID, dan Anda memiliki izin untuk mengakses kunci baca global, gunakan --master-data=1. Jika tidak, jangan gunakan properti ini.
    GTID_PURGED Jika server eksternal Anda mendukung GTID, gunakan --set-gtid-purged=on; jika tidak, jangan gunakan properti ini.
    ADD_DROP_TABLE Jika Anda ingin menambahkan pernyataan DROP TABLE sebelum setiap pernyataan CREATE TABLE, tambahkan --add-drop-table.
    ROUTINES Jika Anda ingin menampilkan rutinitas yang tersimpan, seperti prosedur dan fungsi dalam output untuk database yang dibuang, sertakan --routines.
    COMPRESS Jika Anda ingin mengompresi semua informasi yang dikirim antara replika Cloud SQL dan server eksternal, gunakan --compress.
    GZIP Jika ingin mengompresi file dump lebih banyak lagi, gunakan | gzip. Jika database Anda berisi data yang tidak dikompresi dengan baik, seperti data biner yang tidak dapat dikompresi atau gambar JPG, jangan gunakan ini.

    contoh

    
    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
    
  2. Tuliskan informasi GTID atau binlog dari data dump tersebut. Anda memerlukan informasi ini untuk mengonfigurasi replikasi dengan prosedur tersimpan Cloud SQL.

    Untuk GTID, cari baris yang mirip dengan berikut ini:

       SET @@GLOBAL.GTID_PURGED='32eb1e6a-17b6-11ea-a39e-06d94ac3ec98:1-33496';
    

    Untuk binlog, cari baris yang mirip dengan berikut ini:

       CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin-changelog.033877', MASTER_LOG_POS=360;
    
  3. Hapus baris berikut di file dump yang memerlukan hak istimewa super. Karena pengguna Cloud SQL tidak memiliki hak istimewa super, baris ini akan menyebabkan proses impor gagal.

    Untuk replikasi berbasis GTID: Hapus pernyataan SET GTID_PURGED dan pernyataan setelan variabel sesi dalam dump. Contoh:

       ...
       SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN;
       SET @@SESSION.SQL_LOG_BIN= 0;
       ...
       SET @@GLOBAL.GTID_PURGED='32eb1e6a-17b6-11ea-a39e-06d94ac3ec98:1-33496';
       ...
       SET @@SESSION.SQL_LOG_BIN=@MYSQLDUMP_TEMP_LOG_BIN;
    

    Untuk replikasi berbasis binlog, hapus pernyataan CHANGE MASTER. Misalnya:

       ...
       CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin-changelog.033877', MASTER_LOG_POS=360;
        ...
    
  4. Impor data ke replika Cloud SQL, menggunakan CLI mysql:

    mysql

    mysql -h REPLICA_HOST -u REPLICA_USER \
    -p REPLICA_DATABASE_NAME RESULT_FILE
    
    Properti Deskripsi
    REPLICA_HOST Host tempat server MySQL berada.
    REPLICA_USER Nama pengguna MySQL yang akan digunakan saat terhubung ke server.
    REPLICA_DATABASE_NAME Nama database tempat data berada.
    RESULT_FILE Nama file dump yang akan diimpor.

    contoh

      mysql -h 255.255.255.255 -u replica_username -p replica_db < result.sql
    

Anda juga dapat mengimpor file dump menggunakan bucket Google Cloud. Baca bagian Mengimpor data dari file dump SQL ke Cloud SQL.

Mendemosikan instance Cloud SQL

Untuk mendemosikan instance Cloud SQL ke replika Cloud SQL, gunakan metode demoteMaster pada instance.

  1. Siapkan file permintaan JSON dengan nama instance yang ingin didemosikan.

    JSON sumber

     {
        "demoteMasterContext": {
          "masterInstanceName": SOURCE_REPRESENTATION_INSTANCE_NAME,
          "skipReplicationSetup": true
          }
     }
    
    Properti Deskripsi
    SOURCE_REPRESENTATION_INSTANCE_NAME Nama instance representasi sumber.

    contoh

       {
         "demoteMasterContext": {
           "masterInstanceName": "cloudsql-source-instance",
           "skipReplicationSetup": true
         }
       }
    
  2. Buka terminal dan gunakan perintah berikut untuk memanggil demoteMaster:

    curl

      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 POST \
      https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT-ID/instances/INSTANCE-NAME/demoteMaster
    
    Properti Deskripsi
    JSON_PATH Jalur ke file JSON.
    PROJECT_ID ID project Anda di Google Cloud.
    INSTANCE-NAME Nama instance yang akan didemosikan.

    contoh

       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 POST \
       https://sqladmin.googleapis.com/sql/v1beta4/projects/MyProject/instances/cloudsql-replica-instance/demoteMaster
    

Yang akan Anda lihat setelah selesai

Untuk memastikan instance Anda disiapkan dengan benar, buka halaman Instance Cloud SQL.

Anda akan melihat instance representasi sumber dan replika Cloud SQL. Tampilannya terlihat seperti berikut ini:

ID instance Jenis IP Publik
(-) source-representation-instance Eksternal utama MySQL 10.68.48.3:3306
     replica-instance Replika baca MySQL 34.66.48.59

Memulai replikasi pada instance Cloud SQL

Langkah ini menggunakan prosedur tersimpan Cloud SQL. Prosedur tersimpan Cloud SQL diinstal setelah memanggil permintaan demoteMaster. Class tersebut akan dihapus setelah memanggil promoteReplica. Untuk mengetahui informasi selengkapnya, lihat Prosedur tersimpan untuk pengelolaan replikasi.

  1. Login ke instance replika. Untuk mengetahui informasi lebih lanjut, baca Menghubungkan menggunakan klien database dari komputer lokal.
  2. Gunakan prosedur tersimpan mysql.resetMaster untuk mereset setelan replikasi.

     mysql> call mysql.resetMaster();
    
  3. Konfigurasi replikasi. Langkah ini memerlukan informasi GTID atau binlog yang telah Anda tulis sebelumnya.

    GTID

    1. Konfigurasikan kolom gtid_purged dengan prosedur tersimpan mysql.skipTransactionWithGtid(GTID_TO_SKIP).
    Properti Deskripsi
    GTID_TO_SKIP Nilai set GTID yang akan dikonfigurasi.

    Contoh:

        mysql> call mysql.skipTransactionWithGtid('32eb1e6a-17b6-11ea-a39e-06d94ac3ec98:1-33496');
    

    1. Jalankan prosedur tersimpan mysql.setupExternalSourceAutoPosition(HOST, PORT, USER_NAME, USER_PASSWORD, MASTER_AUTO_POSITION, USE_SSL, USE_SSL_CLIENT_AUTH).
    Properti Deskripsi
    HOST Endpoint sumber.
    PORT Port sumber.
    USER_NAME Pengguna sumber.
    USER_PASSWORD Sandi pengguna sumber.
    MASTER_AUTO_POSITION Nilai parameter master_auto_position. Nilainya dapat berupa 0, 1.
    USE_SSL Apakah akan menggunakan replikasi berbasis SSL atau tidak. Nilainya dapat berupa true, false. Jika true, Anda perlu menetapkan kolom caCertificate dalam permintaan DemoteMaster.
    USE_SSL_CLIENT_AUTH Apakah akan menggunakan autentikasi klien SSL atau tidak. Nilainya dapat berupa true, false. Jika true, Anda perlu menetapkan kolom clientKey dan clientCertificates dalam permintaan demoteMaster.
        mysql> call mysql.setupExternalSourceAutoPosition('1.1.1.1', 3306, \
        'USERNAME', 'PASSWORD', \
        /* master_auto_position= */ 1,false, false); \
    

    binlog

    Jalankan prosedur tersimpan mysql.setupExternalSource(HOST, PORT, USER_NAME, USER_PASSWORD, SOURCE_LOG_NAME, SOURCE_LOG_POS, USE_SSL, USE_SSL_CLIENT_AUTH).

    Properti Deskripsi
    HOST Endpoint sumber.
    PORT Port sumber.
    USER_NAME Pengguna sumber.
    USER_PASSWORD Sandi pengguna sumber.
    SOURCE_LOG_NAME Nama log biner pada instance database sumber yang berisi informasi replikasi.
    SOURCE_LOG_POS Lokasi di log biner mysql_binary_log_file_name tempat replikasi mulai membaca informasi replikasi.
    USE_SSL Apakah akan menggunakan replikasi berbasis SSL atau tidak. Nilainya dapat berupa true, false. Jika true, Anda perlu menetapkan kolom caCertificate dalam permintaan DemoteMaster.
    USE_SSL_CLIENT_AUTH Apakah akan menggunakan autentikasi klien SSL atau tidak. Nilainya dapat berupa true, false. Jika true, Anda perlu menetapkan kolom clientKey dan clientCertificates dalam permintaan demoteMaster.
        mysql> call mysql.setupExternalSource('1.1.1.1', 3306, \
        'user_name', 'password', 'mysql-bin-changelog.033877', 360, \
        false, false);
    
  4. Gunakan prosedur tersimpan mysql.startReplication() untuk memulai replikasi dari database eksternal.

       mysql> call mysql.startReplication();
    
  5. Verifikasi status replikasi. Pastikan kolom Slave_IO_Running dan Slave_SQL_Running menampilkan YES.

       mysql> show slave status\G
    

    Output dari perintah ini tampak seperti berikut ini:

       *************************** 1. row ***************************
                       Slave_IO_State: Waiting for master to send event
                          Master_Host: 1.1.1.1
                          Master_User: user_name
                          Master_Port: 3306
                        Connect_Retry: 60
                      Master_Log_File: mysql-bin-changelog.000001
                  Read_Master_Log_Pos: 1
                       Relay_Log_File: relay-log.000002
                        Relay_Log_Pos: 1
                Relay_Master_Log_File: mysql-bin-changelog.000001
                     Slave_IO_Running: Yes
                    Slave_SQL_Running: Yes
                      Replicate_Do_DB:
                  Replicate_Ignore_DB:
                   Replicate_Do_Table:
               Replicate_Ignore_Table:
              Replicate_Wild_Do_Table:
          Replicate_Wild_Ignore_Table: mysql.%
                           Last_Errno: 0
                           Last_Error:
                         Skip_Counter: 0
                  Exec_Master_Log_Pos: 412
                      Relay_Log_Space: 752
                      Until_Condition: None
                       Until_Log_File:
                        Until_Log_Pos: 0
                   Master_SSL_Allowed: No
                   Master_SSL_CA_File:
                   Master_SSL_CA_Path:
                      Master_SSL_Cert:
                    Master_SSL_Cipher:
                       Master_SSL_Key:
                Seconds_Behind_Master: 0
        Master_SSL_Verify_Server_Cert: No
                        Last_IO_Errno: 0
                        Last_IO_Error:
                       Last_SQL_Errno: 0
                       Last_SQL_Error:
          Replicate_Ignore_Server_Ids:
                     Master_Server_Id: 1509941531
                          Master_UUID: 1cb2c80e-90f0-11eb-9ea3-02389b1c2e6f
                 Master_Info_File: mysql.slave_master_info
                        SQL_Delay: 0
              SQL_Remaining_Delay: NULL
          Slave_SQL_Running_State: Slave has read all r
               Master_Retry_Count: 86400
                      Master_Bind:
          Last_IO_Error_Timestamp:
         Last_SQL_Error_Timestamp:
                   Master_SSL_Crl:
               Master_SSL_Crlpath:
               Retrieved_Gtid_Set:
                Executed_Gtid_Set: 478af53c-bd24-11eb-be72-42010a80002a:1-226
                    Auto_Position: 0
       1 row in set (0.00 sec)
    

Melanjutkan dengan replikasi

Setelah memulai replikasi dari server eksternal, Anda harus memantau replikasi, lalu menyelesaikan migrasi. Untuk mempelajari lebih lanjut, lihat Memantau replikasi.

Memecahkan masalah

Masalah Pemecahan masalah
Lost connection to MySQL server during query when dumping table. Sumbernya mungkin tidak tersedia, atau file dump berisi paket yang terlalu besar.

Pastikan kabel primer eksternal tersedia untuk terhubung. Anda juga dapat mengubah nilai tanda net_read_timeout dan net_write_timeout pada instance sumber untuk menghentikan error. Untuk informasi selengkapnya tentang nilai yang diizinkan untuk tanda ini, lihat Mengonfigurasi tanda database.

Untuk mempelajari lebih lanjut cara menggunakan tanda mysqldump untuk migrasi impor terkelola, lihat Tanda sinkronisasi awal yang diizinkan dan default

Migrasi data awal berhasil, tetapi tidak ada data yang direplikasi. Salah satu kemungkinan penyebabnya adalah database sumber Anda telah menentukan flag replikasi yang menyebabkan beberapa atau semua perubahan database tidak direplikasi.

Pastikan tanda replikasi seperti binlog-do-db, binlog-ignore-db, replicate-do-db, atau replicate-ignore-db tidak ditetapkan dengan cara yang bertentangan.

Jalankan perintah show master status pada instance utama untuk melihat setelan saat ini.

Migrasi data awal berhasil tetapi replikasi data berhenti berfungsi setelah beberapa saat. Hal-hal yang sebaiknya dicoba:

  • Periksa metrik replikasi untuk instance replika Anda di bagian Cloud Monitoring pada konsol Google Cloud.
  • Error dari thread IO MySQL atau thread SQL dapat ditemukan di Cloud Logging dalam file mysql.err log.
  • Error ini juga dapat ditemukan saat menghubungkan ke instance replika. Jalankan perintah SHOW SLAVE STATUS, dan periksa kolom berikut dalam output:
    • Slave_IO_Running
    • Slave_SQL_Running
    • Last_IO_Error
    • Last_SQL_Error
mysqld check failed: data disk is full. Disk data instance replika penuh.

Tingkatkan ukuran disk instance replika. Anda dapat meningkatkan ukuran disk secara manual atau mengaktifkan peningkatan penyimpanan otomatis.

Meninjau log replikasi Anda

Saat Anda memverifikasi setelan replikasi, log akan dihasilkan.

Anda dapat melihat log ini dengan mengikuti langkah-langkah berikut:

  1. Buka Logs Viewer di konsol Google Cloud.

    Buka Logs Viewer

  2. Pilih replika Cloud SQL dari dropdown Instance.
  3. Pilih file log replication-setup.log.

Jika replika Cloud SQL tidak dapat terhubung ke server eksternal, konfirmasi hal berikut:

  • Setiap firewall di server eksternal akan dikonfigurasi untuk mengizinkan koneksi dari alamat IP keluar replika Cloud SQL.
  • Konfigurasi SSL/TLS Anda sudah benar.
  • Pengguna, host, dan sandi replikasi Anda sudah benar.

Langkah selanjutnya