主从复制是指一台服务器充当主数据库服务器,另外一台或多台服务器充当从数据库服务器,主服务器中的数据自动复制到从服务器之中。对于多级复制,数据库服务器便可充当主机,也可充当从机。MySQL主从复制的基础是主服务器对数据库修改记录二进制日志,从服务器经过主服务器的二进制日志自动执行更新。mysql
主服务器上面执行的语句在从服务器上面再执行一遍,在MySQL-3.23版本之后支持。linux
存在的问题:时间上可能不彻底同步形成误差,执行语句的用户也多是不一样一个用户。sql
把主服务器上面改变后的内容直接复制过去,而不关心到底改变该内容是由哪条语句引起的,在MySQL-5.0版本之后引入。数据库
存在的问题:若是修改的行数过多,形成的开销比较大。bash
MySQL默认使用基于语句的复制,当基于语句的复制会引起问题的时候就会使用基于行的复制,MySQL会自动进行选择。服务器
在MySQL主从复制架构中,读操做能够在全部的服务器上面进行,而写操做只能在主服务器上面进行。主从复制架构虽然给读操做提供了扩展,可若是写操做也比较多的话(多台从服务器还要从主服务器上面同步数据),单主模型的复制中主服务器势必会成为性能瓶颈。网络
如上图所示,主服务器上面的任何修改都会保存在二进制日志Binary log里面,从服务器上面启动一个I/O thread(实际上就是一个主服务器的客户端进程),链接到主服务器上面请求读取二进制日志,而后把读取到的二进制日志写到本地的一个Realy log里面。从服务器上面开启一个SQL thread定时检查Realy log,若是发现有更改当即把更改的内容在本机上面执行一遍。架构
若是一主多从的话,这时主库既要负责写又要负责为几个从库提供二进制日志。此时能够稍作调整,将二进制日志只给某一从,这一从再开启二进制日志并将本身的二进制日志再发给其它从。或者是干脆这个从不记录只负责将二进制日志转发给其它从,这样架构起来性能可能要好得多,并且数据之间的延时应该也稍微要好一些。性能
准备服务器Server1和Server2,若是在同一个服务器的话则安装mysql时须要改变其端口。ui
在安装以前必须先检查主机上有没有安装过mysql,若是安装过的话必须先卸载。
下载软件包:
wget https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm
本地安装:
yum localinstall mysql80-community-release-el7-1.noarch.rpm
安装mysql:
yum install mysql-community-server
设为开机启动:
systemctl enable mysqld
systemctl daemon-reload
启动mysql:
systemctl start mysqld
以上步骤就安装好mysql8了。
获取mysql的临时密码:
grep 'temporary password' /var/log/mysqld.log
登陆mysql:
mysql -uroot -p
会提示输入密码,输入以前获取的临时密码便可登陆。
此时须要修改mysql的密码,要否则以后的步骤也会强制提示你须要修改密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY '121b33dAj934J1^Sj9ag';
mysql8默认对密码的强度有要求,须要设置复杂一点,要否则也会提示错误。
刷新配置:
FLUSH PRIVILEGES;
在主从配置以前须要确保两台mysql须要同步的库状态一致。
配置文件默认在/etc/my.cnf
下。
在配置文件中新增配置:
[mysqld]
## 同一局域网内注意要惟一
server-id=100
## 开启二进制日志功能,能够随便取(关键)
log-bin=mysql-bin
复制代码
修改配置后须要重启才能生效:
service mysql restart
重启以后进入mysql:
mysql -uroot -p
在master数据库建立数据同步用户,授予用户 slave REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据。
CREATE USER 'slave'@'%' IDENTIFIED BY '@#$Rfg345634523rft4fa';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
语句中的%
表明全部服务器均可以使用这个用户,若是想指定特定的ip,将%
改为ip便可。
查看主mysql的状态:
show master status;
记录下File
和Position
的值,而且不进行其余操做以避免引发Position
的变化。
在从my.cnf
配置中新增:
mysqld]
## 设置server_id,注意要惟一
server-id=101
## 开启二进制日志功能,以备Slave做为其它Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
复制代码
修改配置后须要重启才能生效:
service mysql restart
重启以后进入mysql:
mysql -uroot -p
change master to master_host='172.17.0.2', master_user='slave', master_password='@#$Rfg345634523rft4fa', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 2830, master_connect_retry=30;
master_host :Master的地址
master_port:Master的端口号
master_user:用于数据同步的用户
master_password:用于同步的用户的密码
master_log_file:指定 Slave 从哪一个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos:从哪一个 Position 开始读,即上文中提到的 Position 字段的值
master_connect_retry:若是链接失败,重试的时间间隔,单位是秒,默认是60秒
在从mysql中查看主从同步状态:
show slave status \G;
此时的SlaveIORunning 和 SlaveSQLRunning 都是No,由于咱们尚未开启主从复制过程。
开启主从复制:
start slave;
再次查看同步状态:
show slave status \G;
SlaveIORunning 和 SlaveSQLRunning 都是Yes说明主从复制已经开启。
若SlaveIORunning一直是Connecting,有下面4种缘由:
一、网络不通,检查ip端口
二、密码不对,检查用于同步的用户名和密码
三、pos不对,检查Master的Position
四、mysql8特有的密码规则问题引发:
ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '@#$Rfg345634523rft4fa';
将密码规则修改成:mysql_native_password
若是须要指定想要主从同步哪一个数据库,能够在master的my.cnf
添加配置:
binlog-do-db:指定mysql的binlog日志记录哪一个db
或者在slave的my.cnf
添加配置:
replicate-do-db=须要复制的数据库名,若是复制多个数据库,重复设置这个选项便可 replicate-ignore-db=须要复制的数据库名,若是复制多个数据库,重复设置这个选项便可
若是想要同步全部库和表,在从mysql执行:
STOP SLAVE SQL_THREAD;
CHANGE REPLICATION FILTER REPLICATE_DO_DB = ();
start SLAVE SQL_THREAD;
若是以上步骤出现问题,能够查看日志:
/etc/log/mysqld.log
至此完成了mysql8主从同步搭建工做。