如果在RDS中,可以为一个RDS MySQL创建 只读库 或创建 Aurora只读库。
如果我想在EC2或是本地机房为RDS创建只读库,或是在RDS中创建本地机房或 EC2 的只读库呢?
无论是在本地机房做RDS MySQL的只读,或是在RDS做本地的只读,都要借助同VPC中的EC2。
所以实验就直接做 EC2 到 RDS MySQL的主备。
主要应用于向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) 在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)