Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Memigrasikan Google Cloud SQL untuk MySQL ke Server Lokal

Google Cloud SQL untuk MySQL adalah layanan database terkelola sepenuhnya yang membantu Anda menyiapkan, memelihara, mengelola, dan mengelola database relasional MySQL Anda di Google Cloud Platform. Namun, ada perbedaan antara Cloud SQL dan fungsionalitas MySQL standar seperti kontrol terbatas, sumber daya terbatas, lokalitas data, anggaran, dan keamanan, yang dapat memengaruhi keputusan akhir Anda untuk keluar dari instance Google Cloud SQL dan menghosting layanan database di on- sebagai gantinya.

Postingan blog ini akan memandu Anda tentang cara melakukan migrasi online dari Google Cloud SQL ke server lokal. Basis data target kami di server lokal adalah server Debian, tetapi langkah-langkah dan prosedur akan berlaku pada versi lain dari Linux serta selama paket diinstal dengan benar.

Instance Google Cloud MySQL kami berjalan di MySQL 5.7 dan yang kami butuhkan adalah:

  • Pengguna slave replikasi dibuat di master.
  • Budak harus diinstal dengan versi utama yang sama dengan master.
  • SSL harus diaktifkan untuk replikasi geografis demi alasan keamanan.

Karena Google Cloud secara default mengaktifkan replikasi GTID untuk MySQL, kami akan melakukan migrasi berdasarkan skema replikasi ini. Oleh karena itu, instruksi yang dijelaskan dalam posting ini juga harus berfungsi di instance MySQL 8.0.

Membuat Pengguna Budak Replikasi

Pertama-tama, kita harus membuat pengguna slave replikasi di instance Google Cloud SQL kita. Masuk ke Google Cloud Platform -> Basis Data -> SQL -> pilih instance MySQL -> Pengguna -> Tambahkan Akun Pengguna dan masukkan detail yang diperlukan:

202.187.194.255 adalah alamat IP publik budak yang terletak di- tempat yang akan mereplikasi dari contoh ini. Seperti yang Anda lihat, tidak ada konfigurasi hak istimewa karena pengguna yang dibuat dari antarmuka ini akan memiliki hak istimewa tertinggi yang dapat ditawarkan Google Cloud SQL (hampir semuanya kecuali SUPER dan FILE). Untuk memverifikasi hak istimewa, kita dapat menggunakan perintah berikut:

mysql> SHOW GRANTS FOR [email protected]\G
*************************** 1. row ***************************
Grants for [email protected]: GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, 
DROP, RELOAD, SHUTDOWN, PROCESS, REFERENCES, INDEX, ALTER, SHOW DATABASES, 
CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, 
CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, 
CREATE TABLESPACE ON *.* TO 'slave'@'202.187.194.255' WITH GRANT OPTION

Sepertinya pengguna budak kami memiliki izin yang diperlukan untuk berjalan sebagai budak (REPLICATION SLAVE).

Mengambil Cadangan mysqldump

Sebelum kita membuat cadangan mysqldump eksternal, kita perlu mengonfigurasi sertifikat SSL klien karena risiko menghubungkan instans melalui jaringan publik. Untuk melakukannya, buka Koneksi -> Konfigurasikan sertifikat klien SSL -> Buat sertifikat klien:

Unduh file di atas (server-ca.pem, client-cert. pem dan client-key.pem) dan simpan di dalam server budak. Kami akan menggunakan sertifikat ini untuk terhubung ke master dengan aman dari layanan budak. Untuk menyederhanakan proses, semua sertifikat dan file kunci di atas akan diletakkan di bawah direktori bernama "gcloud-certs":

$ mkdir -p /root/gcloud-certs # put the certs/key here

Pastikan izin sudah benar, terutama file kunci pribadi, client-key.pem:

$ chmod 600 /root/gcloud-certs/client-key.pem

Sekarang kami siap untuk mengambil cadangan mysqldump dari instance Google Cloud SQL MySQL 5.7 kami dengan aman:

$ mysqldump -uroot -p \
-h 35.198.197.171 \
--ssl-ca=/root/gcloud-certs/server-ca.pem \
--ssl-cert=/root/gcloud-certs/client-cert.pem \
--ssl-key=/root/gcloud-certs/client-key.pem \
--single-transaction \
--all-databases \
--triggers \
--routines > fullbackup.sql

Anda akan mendapatkan peringatan berikut:

"Peringatan:Dump sebagian dari server yang memiliki GTID akan secara default menyertakan GTID dari semua transaksi, bahkan yang mengubah bagian database yang disembunyikan. Jika Anda tidak ingin melakukannya pulihkan GTID, teruskan --set-gtid-purged=OFF. Untuk membuat dump lengkap, teruskan --all-databases --triggers --routines --events."

Peringatan di atas terjadi karena kita melewatkan pendefinisian flag --events yang membutuhkan hak istimewa SUPER. Pengguna root yang dibuat untuk setiap instance Google Cloud SQL tidak dilengkapi dengan hak istimewa FILE dan SUPER. Ini adalah salah satu kelemahan menggunakan metode ini, MySQL Events tidak dapat diimpor dari Google Cloud SQL.

Mengonfigurasi Server Budak

Di server budak, instal MySQL 5.7 untuk Debian 10:

$ echo 'deb http://repo.mysql.com/apt/debian/ buster mysql-5.7' > /etc/apt/sources.list.d/mysql.list
$ apt-key adv --keyserver pgp.mit.edu --recv-keys 5072E1F5
$ apt update
$ apt -y install mysql-community-server

Kemudian, tambahkan baris berikut di bawah bagian [mysqld] di dalam /etc/mysql/my.cnf (atau file konfigurasi MySQL lain yang relevan):

server-id = 1111 # different value than the master
log_bin = binlog
log_slave_updates = 1
expire_logs_days = 7
binlog_format = ROW
gtid_mode = ON
enforce_gtid_consistency = 1
sync_binlog = 1
report_host = 202.187.194.255 # IP address of this slave

Mulai ulang server MySQL untuk menerapkan perubahan di atas:

$ systemctl restart mysql

Pulihkan cadangan mysqldump di server ini:

$ mysql -uroot -p < fullbackup.sql

Pada titik ini, kata sandi root MySQL dari server slave harus sama dengan yang ada di Google Cloud SQL. Anda harus masuk dengan kata sandi root yang berbeda mulai sekarang.

Perhatikan bahwa pengguna root di Google Cloud tidak memiliki hak penuh. Kita perlu membuat beberapa modifikasi pada sisi slave, dengan mengizinkan pengguna root memiliki semua hak istimewa di dalam MySQL, karena kita memiliki kendali lebih besar atas server ini. Untuk melakukan ini, kita perlu memperbarui tabel pengguna MySQL. Login ke server MySQL slave sebagai pengguna root MySQL dan jalankan pernyataan berikut:

mysql> UPDATE mysql.user SET Super_priv = 'Y', File_priv = 'Y' WHERE User = 'root';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

Hapus tabel hak istimewa:

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

Keluar dari terminal saat ini dan login kembali. Jalankan perintah berikut untuk memverifikasi bahwa pengguna root sekarang memiliki tingkat hak istimewa tertinggi:

mysql> SHOW GRANTS FOR [email protected];
+---------------------------------------------------------------------+
| Grants for [email protected]                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
+---------------------------------------------------------------------+

Menyiapkan Tautan Replikasi

Untuk alasan keamanan, pengguna slave replikasi harus terhubung ke host master (instance Google Cloud) melalui saluran terenkripsi SSL. Oleh karena itu, kita harus menyiapkan kunci dan sertifikat SSL dengan izin yang benar dan dapat diakses oleh pengguna mysql. Salin direktori gcloud ke /etc/mysql dan tetapkan izin dan kepemilikan yang benar:

$ mkdir -p /etc/mysql
$ cp /root/gcloud-certs /etc/mysql
$ chown -Rf mysql:mysql /etc/mysql/gcloud-certs

Pada server slave, konfigurasikan link replikasi seperti di bawah ini:

mysql> CHANGE MASTER TO MASTER_HOST = '35.198.197.171', 
MASTER_USER = 'slave', 
MASTER_PASSWORD = 'slavepassword', 
MASTER_AUTO_POSITION = 1, 
MASTER_SSL = 1, 
MASTER_SSL_CERT = '/etc/mysql/gcloud-certs/client-cert.pem', 
MASTER_SSL_CA = '/etc/mysql/gcloud-certs/server-ca.pem', 
MASTER_SSL_KEY = '/etc/mysql/gcloud-certs/client-key.pem';

Kemudian, mulai budak replikasi:

mysql> START SLAVE;

Verifikasi output sebagai berikut:

mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 35.198.197.171
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 1120160
               Relay_Log_File: puppet-master-relay-bin.000002
                Relay_Log_Pos: 15900
        Relay_Master_Log_File: mysql-bin.000003
             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:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 1120160
              Relay_Log_Space: 16115
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: Yes
           Master_SSL_CA_File: /etc/mysql/gcloud-certs/server-ca.pem
           Master_SSL_CA_Path:
              Master_SSL_Cert: /etc/mysql/gcloud-certs/client-cert.pem
            Master_SSL_Cipher:
               Master_SSL_Key: /etc/mysql/gcloud-certs/client-key.pem
        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: 2272712871
                  Master_UUID: 8539637e-14d1-11eb-ae3c-42010a94001a
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set: 8539637e-14d1-11eb-ae3c-42010a94001a:5611-5664
            Executed_Gtid_Set: 8539637e-14d1-11eb-ae3c-42010a94001a:1-5664,
b1dabe58-14e6-11eb-840f-0800278dc04d:1-2
                Auto_Position: 1
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:

Pastikan nilai Slave_IO_Running dan Slave_SQL_Running adalah 'Ya', serta Seconds_Behind_Master harus 0, yang berarti budak telah menyusul master. Perhatikan bahwa Executed_Gtid_Set memiliki dua GTID:

  • 8539637e-14d1-11eb-ae3c-42010a94001a:1-5664
  • b1dabe58-14e6-11eb-840f-8000278dc04d:1-2

GTID pertama mewakili perubahan yang berasal dari master saat ini (instance Google Cloud SQL), sedangkan GTID kedua mewakili perubahan yang telah kami buat saat kami memodifikasi hak istimewa untuk pengguna root MySQL pada host slave. Perhatikan GTID pertama untuk melihat apakah database direplikasi dengan benar (bagian bilangan bulat harus bertambah saat mereplikasi).

Verifikasi apakah host budak kami adalah bagian dari replikasi dari sudut pandang master. Masuk ke instance SQL Cloud sebagai root:

$ mysql -uroot -p \
-h 35.198.197.171 \
--ssl-ca=/root/gcloud-certs/server-ca.pem \
--ssl-cert=/root/gcloud-certs/client-cert.pem \
--ssl-key=/root/gcloud-certs/client-key.pem

Dan jalankan pernyataan berikut:

mysql> SHOW SLAVE HOSTS;
*************************** 1. row ***************************
 Server_id: 1111
      Host: 202.187.194.255
      Port: 3306
 Master_id: 2272712871
Slave_UUID: b1dabe58-14e6-11eb-840f-0800278dc04d

Pada titik ini, Anda dapat merencanakan langkah selanjutnya untuk mengalihkan beban kerja database dari aplikasi ke server slave ini sebagai master baru dan menonaktifkan master lama di Google Cloud.

Pemikiran Terakhir

Anda dapat melakukan migrasi online dari Google Cloud SQL untuk MySQL ke server lokal tanpa banyak kesulitan. Ini memberi Anda kemungkinan untuk memindahkan database Anda ke luar vendor cloud untuk privasi dan kontrol ketika waktu yang tepat telah tiba.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:Rincian cepat dari jenis gabungan

  2. PILIH kueri mengembalikan 1 baris dari setiap grup

  3. Berikan Izin ke Pengguna MySQL di Linux melalui Command Line

  4. Pemecahan Masalah Replikasi MySQL:Bagian Kedua

  5. Fungsi MySQL ACOS() – Mengembalikan Arc Cosinus dari Angka