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:
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. 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. 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
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
, daninformation_schema
). Gunakan perintah MySQLSHOW 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 pernyataanCREATE 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
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;
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; ...
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.
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 } }
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.
- Login ke instance replika. Untuk mengetahui informasi lebih lanjut, baca Menghubungkan menggunakan klien database dari komputer lokal.
Gunakan prosedur tersimpan
mysql.resetMaster
untuk mereset setelan replikasi.mysql> call mysql.resetMaster();
Konfigurasi replikasi. Langkah ini memerlukan informasi GTID atau binlog yang telah Anda tulis sebelumnya.
GTID
- Konfigurasikan kolom
gtid_purged
dengan prosedur tersimpanmysql.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');
- 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 berupa0
,1
.USE_SSL Apakah akan menggunakan replikasi berbasis SSL atau tidak. Nilainya dapat berupa true
,false
. Jikatrue
, Anda perlu menetapkan kolomcaCertificate
dalam permintaanDemoteMaster
.USE_SSL_CLIENT_AUTH Apakah akan menggunakan autentikasi klien SSL atau tidak. Nilainya dapat berupa true
,false
. Jikatrue
, Anda perlu menetapkan kolomclientKey
danclientCertificates
dalam permintaandemoteMaster
.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
. Jikatrue
, Anda perlu menetapkan kolomcaCertificate
dalam permintaanDemoteMaster
.USE_SSL_CLIENT_AUTH Apakah akan menggunakan autentikasi klien SSL atau tidak. Nilainya dapat berupa true
,false
. Jikatrue
, Anda perlu menetapkan kolomclientKey
danclientCertificates
dalam permintaandemoteMaster
.mysql> call mysql.setupExternalSource('1.1.1.1', 3306, \ 'user_name', 'password', 'mysql-bin-changelog.033877', 360, \ false, false);
- Konfigurasikan kolom
Gunakan prosedur tersimpan
mysql.startReplication()
untuk memulai replikasi dari database eksternal.mysql> call mysql.startReplication();
Verifikasi status replikasi. Pastikan kolom
Slave_IO_Running
danSlave_SQL_Running
menampilkanYES
.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 |
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 Jalankan perintah |
Migrasi data awal berhasil tetapi replikasi data berhenti berfungsi setelah beberapa saat. | Hal-hal yang sebaiknya dicoba:
|
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:
Buka Logs Viewer di konsol Google Cloud.
- Pilih replika Cloud SQL dari dropdown Instance.
- 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
- Pelajari cara mengupdate instance.
- Pelajari cara mengelola replika.
- Pelajari cara memantau instance.
- Pelajari cara mempromosikan replika Cloud SQL untuk mempromosikan replika ke instance mandiri dan berhenti melakukan replikasi dari server eksternal.