阿里雲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%';

配置從庫

先檢查從庫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 status\G

如果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即可。