MySQL的主从复制是一个异步的复制过程(虽然一般情况下感觉是实时的),数据将从一个Mysql数据库(我们称之为Master)复制到另一个Mysql数据库(我们称之为Slave),在Master与Slave之间实现整个主从复制的过程是由三个线程参与完成的。其中有两个线程(SQL线程和IO线程)在Slave端,另一个线程(I/O线程)在Master端。
要实现MySQL的主从复制,首先必须打开Master端的binlog记录功能,否则就无法实现。因为整个复制过程实际上就是Slave从Master端获取binlog日志,然后再在Slave上以相同顺序执行获取的binlog日志中的记录的各种SQL操作。打开 MySQL 的 Binary Log 可以通过在启动 MySQL Server 的过程中使用 “—log-bin” 参数选项,或者在 my.cnf 配置文件中的 mysqld 参数组([mysqld]标识后的参数部分)增加 “log-bin” 参数项。
1)在Slave 服务器上执行start slave命令开启主从复制开关,开始进行主从复制。
2)此时,Slave服务器的IO线程会通过在master上已经授权的复制用户权限请求连接master服务器,并请求从执行binlog日志文件的指定位置(日志文件名和位置是在配置主从复制服务时执行change master命令指定的)之后开始发送binlog日志内容。
3)Master服务器接收到来自Slave服务器的IO线程的请求后,其上负责复制的IO线程会根据Slave服务器的IO线程请求的信息分批读取指定binlog日志文件指定位置之后的binlog日志信息,然后返回给Slave端的IO线程。返回的信息中除了binlog日志内容外,还有在Master服务器端记录的IO线程。返回的信息中除了binlog中的下一个指定更新位置。
4)当Slave服务器的IO线程获取到Master服务器上IO线程发送的日志内容、日志文件及位置点后,会将binlog日志内容依次写到Slave端自身的Relay Log(即中继日志)文件(Mysql-relay-bin.xxx)的最末端,并将新的binlog文件名和位置记录到master-info文件中,以便下一次读取master端新binlog日志时能告诉Master服务器从新binlog日志的指定文件及位置开始读取新的binlog日志内容。
5)Slave服务器端的SQL线程会实时检测本地Relay Log中IO线程新增的日志内容,然后及时把Relay LOG 文件中的内容解析成sql语句,并在自身Slave服务器上按解析SQL语句的位置顺序执行应用这样sql语句,并在relay-log.info中记录当前应用中继日志的文件名和位置点。
Linux系统版本:Redhat 6.5版本
系统防火墙关闭:selinux=disabled
server5:172.25.51.5(Master)
server6:172.25.51.6(Slave)
mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar
[root@server5 ~]# tar xf mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar
[root@server5 ~]# yum install mysql-community-client-5.7.17-1.el6.x86_64.rpm mysql-community-common-5.7.17-1.el6.x86_64.rpm mysql-community-libs-5.7.17-1.el6.x86_64.rpm mysql-community-libs-compat-5.7.17-1.el6.x86_64.rpm mysql-community-server-5.7.17-1.el6.x86_64.rpm -y
[root@server5 ~]# /etc/init.d/mysqld start
[root@server5 ~]# grep password /var/log/mysqld.log
[root@server5 ~]# mysql_secure_installation
mysql数据库安全初始化过程中,首先输入原密码,再设定新密码,新密码设定要求:字母大小写+特殊字符+数字,此处密码设定为WESTOS.com123。
[root@server5 ~]# vim /etc/my.cnf
29 server-id=1 ##服务器标识,主从id取值不能相同
30 log-bin=mysql-bin ##二进制日志
[root@server5 ~]# /etc/init.d/mysqld restart
[root@server5 ~]# mysql -p
授权slave以repl身份从172.25.51.0/24网段登陆,对任何数据库的任何表进行操作,密码‘WESTOS.com123‘
mysql> grant replication slave on *.* to repl@'172.25.51.%' identified by 'WESTOS.com123';
mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar
[root@server6 ~]# vim /etc/my.cnf
29 server-id=2 ##服务器默认id,不能与mater相同
[root@server5 ~]# /etc/init.d/mysqld restart
mysql> change master to master_host='172.25.51.5',master_user='repl',master_password='WESTOS.com123',master_log_file='mysql-bin.000001',master_log_pos=447;
mysql> start slave;
mysql> show slave status\G;
示图:查看IO线程和sql线程开启即可
Slave的IO线程以repl身份拷贝(多线程)Master的log-bin到自己的relay-log,Slave的sql线程(单线程)读取relay-log,并在自身Slave服务器上按解析SQL语句的位置顺序执行sql语句,完成与Master同样的操作从而达到复制。
mysql> create database westos;
mysql> use westos
mysql> create table usertb (
-> username varchar(20) not null,
-> password varchar(25) not null);
mysql> insert into usertb values('user1',123);
mysql> insert into usertb values('user2',456);
[root@server5 ~]# vim /etc/my.cnf
29 server-id=1
30 log-bin=mysql-bin
31
32 gtid_mode=ON ##开启gtid模块
33 enforce-gtid-consistency=true
[root@server5 ~]# /etc/init.d/mysqld restart
[root@server6 ~]# vim /etc/my.cnf
29 server-id=2
31 gtid_mode=ON
32 enforce-gtid-consistency=true
[root@server5 ~]# /etc/init.d/mysqld restart
mysql> stop slave; ##停止slave
mysql> change master to master_host='172.25.51.5',master_user='repl',master_password='WESTOS.com123',MASTER_AUTO_POSITION = 1;
mysql> start slave;
mysql> show slave status\G;