阿里云RDS数据库与自建数据库做主从同步
场景
购买了阿里云的RDS数据库,基础版,没有主备,有做本地备份,但是如果RDS宕机了没办法马上切到可用的数据库,为了系统的高可用和容灾,决定做一下RDS和自建数据库的主从同步(不购买RDS的高可用版说到底也是因为qiong……)
前提
大版本相同的MySQL,我的RDS是5.7的,原本CentOS上是用预置yum源安装的mariadb5.5,于是我就先新增了MySQL5.7的源对数据库版本进行更新,这里不对如何更新进行赘述。
动工
配置主库
首先登录阿里云的控制台,进入RDS数据库的实例,将即将配置从库的服务器IP添加进RDS实例白名单中: 接着登录RDS数据库,执行SQL语句,得到RDS的server_id: show variables like %server_id%; 得到 RDS 的 log_pos 和 log file(下面用到): show master status;
配置从库
先检查从库MySQL的大版本是否与主库一致: mysql -v 停止从库的MySQL服务: systemctl stop mysqld 修改从库MySQL的配置文件: vim /etc /my.cnf 这里要注意配置的参数放在[mysqld]下:
server-id = 2222 //服务 ID,主从实例 server-id 需不同。 log_bin = mysql-bin.log //这里要确保路径存在 expire_logs_days = 10 max_binlog_size = 100M replicate-do-db = exampledb //需要同步的数据库 replicate-ignore-db = mysql //不需要同步的数据库 replicate-ignore-db = information_schema //不需要同步的数据库 replicate-ignore-db = performance_schema //不需要同步的数据库
配置GTID同步模式,binlog格式为ROW,同样放置在[mysqld]下:
#GTID gtid_mode=on enforce_gtid_consistency=on binlog_format=row //设置 binlog 为 row log-slave-updates=1
启动MySQL服务:
systemctl start mysqld
进入MySQL,执行语句,查看配置是否生效(值为ROW即生效):
show variables like %binlog_format%;
将主库数据全量导出。
mysqldump -h RDS数据库ip -P RDS数据库端口 -u RDS数据库账号 -p RDS数据库密码 数据库名 > 导出的文件名.sql
进入MySQL,将主库数据全量导入从库。
CREATE DATABASE 数据库名; USE 数据库名; SOURCE 导出的文件名.sql
在从库中配置同步选项:
change master to master_host=192.168.0.104, //Master 服务器Ip master_port=3306, master_user=test, master_password=mysql, master_log_file=master-bin.000001,//Master服务器产生的日志 master_log_pos=0; //binlog起始位置
启动slave:
start slave;
查看slave状态:
show slave statusG
如果Slave_IO_Running 和 Slave_SQL_Running 的状态是否都为 Yes的话则配置成功!
可能遇到的问题
Q:ERROR 1794 (HY000): Slave is not configured or failed to initialize properly. You must at least set --server-id to enable either a master or a slave. Additional error messages can be found in the MySQL error log. A:前面我是从mariadb5.5直接升级到MySQL5.7的,推测是因为版本兼容导致的表结构不一致,这里把ibd表删除后重建
use mysql; drop table slave_master_info; drop table slave_relay_log_info; drop table slave_worker_info; drop table innodb_index_stats; drop table innodb_table_stats; source /usr/share/mysql/share/mysql_system_tables.sql
之后重启slave,再重新执行change master to即可。
By the way
回复“学习”,即可领取一份 【Java工程师进阶架构师的视频教程】~
回复“面试”,可以获得: 【本人呕心沥血整理的 Java 面试题】
回复“MySQL脑图”,可以获得 【MySQL 知识点梳理高清脑图】
