如果在RDS中,可以爲一個RDS MySQL創建 只讀庫 或創建 Aurora只讀庫。
如果我想在EC2或是本地機房爲RDS創建只讀庫,或是在RDS中創建本地機房或 EC2 的只讀庫呢?
無論是在本地機房做RDS MySQL的只讀,或是在RDS做本地的只讀,都要藉助同VPC中的EC2。
所以實驗就直接做 EC2 到 RDS MySQL的主備。
- 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
- 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)