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 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)

你可能感兴趣的:(AWS-RDS)