mysql 5.7 主从复制分为基于日志点的复制和GTID 的复制,GTID 是从MySQL 5.6 开始支持的的一种新的复制方式。这里主要说下基于日志点的复制方式。基于日志点复制本身配置很简单,但因为环境不同可能躺过的坑也就不同,这里打算以centos7 虚拟机为例说下主要配置[在正式的服务器上配置会比在虚拟机上容易点,感觉虚拟机坑多一点]。
centos7 虚拟机下 Mysql5.7 的主从复制
环境
centos7( 最小化安装 ) ,mysql5.7-community 版本
前提:centos7 能上网 ,并且已经安装了mysql5.7-community 版本( 不一定是community 版本,但这里建议最好是mysql5.7)
centos7 启用网络参考:https://blog.youkuaiyun.com/zhang_referee/article/details/87479576
centos7 安装mysql5.7 参考:https://blog.youkuaiyun.com/zhang_referee/article/details/87904636
配置
- 在主DB服务器上建立复制账号
-- 创建virtual_repl账户
create user 'virtual_repl'@'192.168.1.107' identified by 'virtual_repl&xiaomuxizi';
-- 在ip段192.168.1.107上授予virtual_repl复制权限
grant replication slave on *.* to 'virtual_repl'@'192.168.1.107';
注:如果跟我这边一样,mysql 报密码不符合当前策略,可作如下更改
set global validate_password_policy=0;
- 配置主数据库服务器
打开主库服务器/etc/my.cnf 配置文件加入以下配置即可
#replication config
log-bin=mysql-bin
binlog_format=mixed
server_id=104
注:server_id 在一个主从集群中必须是唯一的,一般为ip段后3位。 我这里主库服务器ip地址为:192.168.1.104 ,从库服务器地址为:192.168.1.107。
- 配置从数据库服务器
打开从库服务器/etc/my.cnf 配置文件加入以下配置即可
log-bin=mysql-bin
relay_log=mysql-relay-bin
server_id=107
注:relay_log 是中继日志
- 分别重启主从数据库
重启命令:
systemctl restart mysqld
- 网络检测
在正式服务器上这一步操作可以选择跳过
在进行后续操作前,进行网络检测是必要的,以保证后续操作能够正常进行。
确保两台主机能互通
这里可以使用ping 命令来检测
检测从数据库服务器是否可以连接到主数据库服务器
可以在主数据库服务器建立一个测试账号,来验证是否可以从从服务器上登陆主服务器数据库。
登录主数据库服务器,
创建测试账号:
grant all privileges on *.* to test@'%' identified by 'ZHANG&test';
刷新权限
flush privileges;
在从数据库服务器上使用 主服务器上的test 账号进行登陆验证:
这是由于防火墙设置造成的,清一下防火墙
在主数据库服务上执行以下命令
sudo iptables -F
-
初始化主数据库服务器数据
这里指把主数据库的数据复制到从数据库,可以使用mysqldump 命令,这里跳过! -
配置复制链路
在从数据库服务器上进行配置
change master to
master_host='master ip address',
master_user='master repl account user',
master_password='master repl account password',
master_log_file='master mysql-bin-log file',
master_log_pos='master mysql-bin-log file position';
注:以上信息根据自己的主数据库服务器进行配置,以上值可以主数据库服务器中查看得到。
在主数据库服务器中:
mysql> show master status ;
±-----------------±---------±-------------±-----------------±------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
±-----------------±---------±-------------±-----------------±------------------+
| mysql-bin.000004 | 1279 | | | |
±-----------------±---------±-------------±-----------------±------------------+
1 row in set (0.00 sec)
故我这边change master to 具体语句为:
change master to
master_host='192.168.1.104',
master_user='virtual_repl',
master_password='virtual_repl&xiaomuxizi',
master_log_file='mysql-bin.000004',
master_log_pos=1279;
在从数据库服务器中执行一遍:
- 启动复制链路
在从数据库服务器上执行
start slave;
可以看到在从数据库服务器上多了两个线程,表示主从复制已建立完成。
主服务器也是
- 主从复制测试
在主数据库服务器上新建一个数据库,并在新建的数据库中新间一个学生表,新增一条测试数据。
create database rep_test default charset = utf8;
use rep_test;
create table student(
id int auto_increment,
`name` varchar(256) not null default '',
age tinyint unsigned not null default 0,
gender tinyint unsigned not null default 0,
primary key(id)
)engine = innodb charset = utf8;
insert into student(id,`name`,age,gender)values(1,'zhang',23,1);
查看从数据库服务器
注:这里并不是说,只有主数据库服务器插入了数据从数据库服务器才能同步,只要是在主数据库服务器上发生的写操作成功写入到了日志文件中,从数据库服务器都会进行同步。