Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Di chuyển Google Cloud SQL dành cho MySQL sang máy chủ On-Prem

Google Cloud SQL dành cho MySQL là dịch vụ cơ sở dữ liệu được quản lý hoàn toàn giúp bạn thiết lập, duy trì, quản lý và quản trị cơ sở dữ liệu quan hệ MySQL của mình trên Google Cloud Platform. Tuy nhiên, có sự khác biệt giữa Cloud SQL và chức năng MySQL tiêu chuẩn như kiểm soát hạn chế, tài nguyên bị hạn chế, vị trí dữ liệu, ngân sách và bảo mật, có thể ảnh hưởng đến quyết định cuối cùng của bạn để chuyển ra khỏi các phiên bản Google Cloud SQL và lưu trữ dịch vụ cơ sở dữ liệu trong- thay vào đó là cơ sở hạ tầng cơ sở.

Bài đăng trên blog này sẽ hướng dẫn bạn cách thực hiện di chuyển trực tuyến từ Google Cloud SQL sang máy chủ tại chỗ. Cơ sở dữ liệu mục tiêu của chúng tôi trên máy chủ tại chỗ là máy chủ Debian, nhưng các bước và thủ tục sẽ áp dụng trên các phiên bản Linux khác cũng như các gói được cài đặt đúng cách.

Phiên bản Google Cloud MySQL của chúng tôi đang chạy trên MySQL 5.7 và những gì chúng tôi cần là:

  • Một người dùng nô lệ sao chép được tạo trên bản chính.
  • Máy chủ phải được cài đặt cùng phiên bản chính với phiên bản chính.
  • SSL phải được bật để nhân rộng theo địa lý vì lý do bảo mật.

Vì Google Cloud theo mặc định đã bật tính năng sao chép GTID cho MySQL, chúng tôi sẽ thực hiện di chuyển dựa trên sơ đồ sao chép này. Do đó, các hướng dẫn được mô tả trong bài đăng này cũng sẽ hoạt động trong các phiên bản MySQL 8.0.

Tạo người dùng nô lệ nhân bản

Trước hết, chúng tôi phải tạo một người dùng nô lệ sao chép trên phiên bản Google Cloud SQL của chúng tôi. Đăng nhập vào Google Cloud Platform -> Cơ sở dữ liệu -> SQL -> chọn phiên bản MySQL -> Người dùng -> Thêm tài khoản người dùng và nhập các chi tiết được yêu cầu:

202.187.194.255 là địa chỉ IP công cộng nô lệ nằm trong on- tiền đề sẽ tái tạo từ trường hợp này. Như bạn có thể thấy, không có cấu hình đặc quyền vì người dùng được tạo từ giao diện này sẽ có các đặc quyền cao nhất mà Google Cloud SQL có thể cung cấp (hầu hết mọi thứ ngoại trừ SUPER và FILE). Để xác minh các đặc quyền, chúng ta có thể sử dụng lệnh sau:

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

Có vẻ như người dùng nô lệ của chúng tôi có quyền cần thiết để chạy như một nô lệ (REPLICATION SLAVE).

Đang sao lưu mysqldump

Trước khi chúng tôi tạo bản sao lưu mysqldump bên ngoài, chúng tôi cần định cấu hình chứng chỉ SSL của ứng dụng khách vì rủi ro khi kết nối phiên bản thông qua mạng công cộng. Để thực hiện việc này, hãy đi tới Kết nối -> Định cấu hình chứng chỉ máy khách SSL -> Tạo chứng chỉ máy khách:

Tải xuống các tệp ở trên (server-ca.pem, client-cert. pem và client-key.pem) và lưu trữ chúng bên trong máy chủ nô lệ. Chúng tôi sẽ sử dụng các chứng chỉ này để kết nối với chính một cách an toàn từ lần phục vụ nô lệ. Để đơn giản hóa quy trình, tất cả các chứng chỉ và tệp khóa ở trên sẽ được đặt trong một thư mục có tên "gcloud-certs":

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

Đảm bảo các quyền là chính xác, đặc biệt là tệp khóa riêng, client-key.pem:

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

Bây giờ chúng tôi đã sẵn sàng sao lưu mysqldump từ phiên bản Google Cloud SQL MySQL 5.7 của chúng tôi một cách an toàn:

$ 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

Bạn sẽ nhận được cảnh báo sau:

"Cảnh báo:Kết xuất một phần từ máy chủ có GTID theo mặc định sẽ bao gồm GTID của tất cả các giao dịch, ngay cả những giao dịch đã thay đổi các phần bị cấm của cơ sở dữ liệu. Nếu bạn không muốn khôi phục GTID, chuyển --set-gtid-purged =OFF. Để tạo một kết xuất hoàn chỉnh, hãy chuyển --all-databases --triggers --routines --events. "

Cảnh báo trên xảy ra vì chúng tôi đã bỏ qua việc xác định cờ --events yêu cầu đặc quyền SUPER. Người dùng gốc được tạo cho mọi phiên bản Google Cloud SQL không đi kèm với đặc quyền FILE và SUPER. Đây là một trong những hạn chế của việc sử dụng phương pháp này, đó là không thể nhập Sự kiện MySQL từ Google Cloud SQL.

Định cấu hình Máy chủ Slave

Trên máy chủ nô lệ, hãy cài đặt MySQL 5.7 cho 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

Sau đó, thêm các dòng sau vào phần [mysqld] bên trong /etc/mysql/my.cnf (hoặc bất kỳ tệp cấu hình MySQL có liên quan nào khác):

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

Khởi động lại máy chủ MySQL để áp dụng các thay đổi trên:

$ systemctl restart mysql

Khôi phục bản sao lưu mysqldump trên máy chủ này:

$ mysql -uroot -p < fullbackup.sql

Tại thời điểm này, mật khẩu gốc MySQL của máy chủ nô lệ phải giống với mật khẩu trong Google Cloud SQL. Bạn nên đăng nhập bằng mật khẩu gốc khác từ bây giờ.

Hãy lưu ý rằng người dùng root trong Google Cloud không có đầy đủ các đặc quyền. Chúng tôi cần thực hiện một số sửa đổi ở phía máy chủ, bằng cách cho phép người dùng gốc có tất cả các đặc quyền bên trong MySQL, vì chúng tôi có nhiều quyền kiểm soát hơn đối với máy chủ này. Để làm điều này, chúng ta cần cập nhật bảng người dùng của MySQL. Đăng nhập vào máy chủ MySQL của nô lệ với tư cách là người dùng gốc MySQL và chạy câu lệnh sau:

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

Xóa bảng đặc quyền:

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

Thoát khỏi thiết bị đầu cuối hiện tại và đăng nhập lại. Chạy lệnh sau để xác minh rằng người dùng root hiện có cấp đặc quyền cao nhất:

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

Thiết lập liên kết sao chép

Vì lý do bảo mật, người dùng nô lệ sao chép phải kết nối với máy chủ chính (phiên bản Google Cloud) qua kênh được mã hóa SSL. Do đó, chúng tôi phải chuẩn bị khóa và chứng chỉ SSL với sự cho phép chính xác và người dùng mysql có thể truy cập được. Sao chép thư mục gcloud vào / etc / mysql và chỉ định quyền và quyền sở hữu chính xác:

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

Trên máy chủ nô lệ, hãy định cấu hình liên kết sao chép như sau:

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

Sau đó, khởi động nô lệ sao chép:

mysql> START SLAVE;

Xác minh đầu ra như sau:

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:

Đảm bảo các giá trị Slave_IO_Running và Slave_SQL_Running là 'Có', cũng như Seconds_Behind_Master phải bằng 0, có nghĩa là nô lệ đã bắt kịp với chủ. Lưu ý rằng Executed_Gtid_Set có hai GTID:

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

GTID đầu tiên đại diện cho những thay đổi đến từ bản chính hiện tại (phiên bản Google Cloud SQL), trong khi GTID thứ hai đại diện cho những thay đổi mà chúng tôi đã thực hiện khi sửa đổi đặc quyền cho người dùng gốc MySQL trên máy chủ nô lệ. Hãy chú ý đến GTID đầu tiên để xem liệu cơ sở dữ liệu có đang sao chép chính xác hay không (phần số nguyên sẽ tăng dần trong khi sao chép).

Xác minh xem máy chủ nô lệ của chúng tôi có phải là một phần của bản sao theo quan điểm của chủ nhân hay không. Đăng nhập vào phiên bản SQL Cloud với tư cách là người chủ:

$ 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

Và chạy câu lệnh sau:

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

Tại thời điểm này, bạn có thể lập kế hoạch di chuyển tiếp theo của mình để chuyển hướng khối lượng công việc cơ sở dữ liệu từ các ứng dụng đến máy chủ phụ này làm máy chủ mới và hủy truyền tải máy chủ cũ trong Google Cloud.

Lời kết

Bạn có thể thực hiện di chuyển trực tuyến từ Google Cloud SQL dành cho MySQL sang máy chủ tại chỗ mà không gặp nhiều rắc rối. Điều này cung cấp cho bạn khả năng di chuyển cơ sở dữ liệu của mình ra bên ngoài các nhà cung cấp đám mây để bảo mật và kiểm soát khi đến thời điểm thích hợp.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách tạo API đồ thị không máy chủ cho MySQL, Postgres và Aurora

  2. Làm cách nào để nhận bản ghi mới nhất trong mỗi nhóm bằng cách sử dụng GROUP BY?

  3. Tôi có thể tạo cơ sở dữ liệu bằng PDO trong PHP không?

  4. PyInstaller, tệp đặc tả, Lỗi nhập khẩu:Không có mô-đun nào có tên 'blah'

  5. Các câu lệnh chuẩn bị sẵn trong PHP PDO