AWS - RDS MySQL - RDS的本地從庫與本地的RDS從庫

如果在RDS中,可以爲一個RDS MySQL創建 只讀庫 或創建 Aurora只讀庫。
如果我想在EC2或是本地機房爲RDS創建只讀庫,或是在RDS中創建本地機房或 EC2 的只讀庫呢?

無論是在本地機房做RDS MySQL的只讀,或是在RDS做本地的只讀,都要藉助同VPC中的EC2。
所以實驗就直接做 EC2 到 RDS MySQL的主備。

  1. EC2 主,RDS 備。

主要應用於向RDS上進行遷移。例如我們在本地機房有一套MySQL,想要遷移到RDS中。
那麼首先我們要先在RDS的同VPC中,創建一個EC2,將EC2作爲本地實例的只讀庫。

之後,我們將EC2中的MySQL實例作爲主庫,在RDS中創建只讀庫。
實驗步驟:
(1) 在RDS中創建實例。注意:此時請勿選擇多可用區部署。
(2) 主庫中創建角色並授權。

grant replication slave on *.* to 'slave_rds'@'%' identified by '123456';

(3) 備份EC2中的實例,並查看當前bin-log信息。

mysqldump -- databases testdb1 testdb2  --master-data=2 --single-transaction  --order-by-primary -p'123456' > backup.sql

**注意:必須在 Amazon RDS 數據庫中手動創建任何存儲過程、觸發器、函數或事件。如果您所複製的數據庫中有上述任一對象,請在運行 mysqldump 時排除這些對象,方式是將以下參數與 mysqldump 命令一起包含:–routines=0 --triggers=0 --events=0。
查看master_log_file 信息

 grep "CHANGE MASTER TO" test_slave01.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=120;

如果使用基於GTID的複製,需要運行SQL查看GTID

SELECT BINLOG_GTID_POS('<binary log file name>', <binary log file position>);

(4) 將數據導入到 RDS MySQL 實例中

source  test_slave01.sql

(5) 使用RDS中封裝好的過程,創建只讀庫

CALL mysql.rds_stop_replication;

CALL mysql.rds_set_external_master ('172.31.21.136', 3306, 'slave_rds', '123456', 'mysql-bin.000004', 120, 0); 

CALL mysql.rds_start_replication;

(6) 測試數據。
在EC2 中插入數據,在RDS中查看。

mysql> insert into test01 values(1);
Query OK, 1 row affected (0.00 sec)
mysql> select * from test01;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

參考文檔:https://docs.amazonaws.cn/AmazonRDS/latest/UserGuide/MySQL.Procedural.Importing.NonRDSRepl.html

  1. RDS主,EC2備

(1) 在EC2中安裝MySQL,並修改參數,啓動數據庫實例。

server_id = 11
replicate-ignore-db = mysql,performance_schema,information_schema,sys
replicate-wild-ignore-table=mysql.*,performance_schema.*,information_schema.*,sys.*

**這是因爲如果在其他庫,對 mysql.table 執行更改,從庫是同步的。所以對RDS的從庫是有問題的。

(2) 創建用戶授權

grant replication slave on *.* to 'slave_rds'@'%' identified by '123456';

(3) 備份
由於用戶無法鎖定所有表,所以要在參數組中設置read_only 或 人工確認沒有數據寫入。

mysqldump -udbadmin -p'!QAZ2wsx' -h chen-externalmaster-0419.cfipcukslrth.rds.cn-north-1.amazonaws.com.cn  --databases testdb dms_test test_restore --single-transaction --master-data=2 -p'!QAZ2wsx' > test_slave02.sql
mysqldump: Couldn't execute 'FLUSH TABLES WITH READ LOCK': Access denied for user 'dbadmin'@'%' (using password: YES) (1045)
show global variables like "read_only"; 

mysql> show global variables like "%read_only%";
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_read_only      | OFF   |
| read_only             | ON    |
| super_read_only       | OFF   |
| transaction_read_only | OFF   |
| tx_read_only          | OFF   |
+-----------------------+-------+

5 rows in set (0.00 sec)
記錄BinLog信息

mysql> show master status \G

mysqldump -udbadmin -p'!QAZ2wsx' -h chen-externalmaster-0419.cfipcukslrth.rds.cn-north-1.amazonaws.com.cn  --databases testdb dms_test test_restore --single-transaction  -p'!QAZ2wsx' > test_slave02.sql

完成備份之後再修改參數組,更改回來。此爲動態參數,不需重啓,保存修改及生效。

(3) 將備份導入EC2實例

source  test_slave02.sql

(4) 通過RDS的endpoint,解析內網IP。
**注意:
數據庫實例的重啓,
數據庫實例停止之後,再啓動

(5) 連接至EC2 mysql,配置slave

stop slave;

change master to
master_host='172.31.9.128',
master_user='slave_rds',
master_password='!QAZ2wsx',
master_port=3306,
master_log_file='mysql-bin-changelog.000551', 
master_log_pos=511;

start slave; 

show slave status \G

(6) 驗證

-- RDS中插入
mysql> insert into test01 values (11);
Query OK, 1 row affected (0.01 sec)
-- EC2中查詢
mysql> select * from test01;
+------+
| id   |
+------+
|    1 |
|   11 |
+------+
2 rows in set (0.00 sec)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章