MySQL内建的复制功能是构建大型、高性能应用程序的基础。将MySQL的数据分布到多个系统上去,这种分布式的机制,是通过将MySQL的某一台主机的数据,复制到其他的主机slaves上,并重新执行一边来实现。
复制过程中,一个服务器充当主服务器,而一个或多个其他服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引,以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接到主服务器时,它通知主服务器,从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时发生的任何更新,然后封锁并等待主服务器通知更新。
操作环境:
linux7.3
主服务器master:172.25.3.1/24
从服务器slave:172.25.3.2/24
安装数据库(可从官网下载)
mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
解压后只需安装一部分
yum install -y
mysql-community-client-5.7.24-1.el7.x86_64.rpm
mysql-community-common-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm
mysql-community-server-5.7.24-1.el7.x86_64.rpm
二进制文件主从复制
主服务器Master配置
修改/etc/my.conf文件
在mysqld段下添加配置
vim /etc/my.cnf
[mysqld]
log-bin=mysql-bin ## [必须]启用二进制日志
server-id=1 ## [必须]服务器唯一ID,默认是1,一般取IP最后一段
从服务器Slave配置
vi /etc/my.cnf
[mysqld]
log-bin=mysql-bin ## [非必须]启用二进制日志
server-id=2 ##[必须]服务器唯一ID,默认是1,一般取IP最后一段
配置之后master和slave都需要重启mysqld
systemctl restart mysqld
分别在mster和slave安全初始化数据库
mysql的原密码在日志内
grep password /var/log/mysqld.log
安全初始化修改为自己方便记得密码
mysql_secure_installation
初始化之后使用修改后的密码登陆检验
mysql -uroot -pQwer+1234df
## -p 后面的字符串就是密码
在master建立帐户并授权slave:
mysql>GRANT REPLICATION SLAVE ON *.* to 'mysync'@'%' identified by 'Qwer+1234df';
一般不用root帐号,“%”表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP代替,如192.168.145.226,加强安全。
查询master的状态
mysql>show master status;
注:执行完此步骤后不要再操作主服务器,防止主服务器状态值变化。
配置从服务器Slave:
mysql>change master to master_host='172.25.3.1',master_user='mysync',master_password='Qwer+1234df',
master_log_file='mysql-bin.000002',master_log_pos=683;
master_host 的ip是master的ip
master_user 是刚刚master创建的用户名
master_password 是刚刚创建用户时的密码
master_log_file 是查看master状态表内显示的文件名,必须表内显示的
master_log_pos 是填写的文件名在表内对应的position
mysql>start slave; ## 启动从服务器复制功能
检查从服务器复制功能状态:
mysql> show slave status\G;
Slave_IO_State: Waiting for master to send event
Master_Host: 172.25.3.1 ## master的ip
Master_User: mysync ## 授权帐户名,尽量避免使用root
Master_Port: 3306 ## 数据库端口,部分版本没有此行
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 683 ## 同步读取二进制日志的位置,大于等于Exec_Master_Log_Pos
Relay_Log_File: server2-relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
IO和SQL的状态必须为 YES
测试:主master建立一个库
create database westos;
从slave上也能看到westos库
Gtid主从复制
在主master:
vim /etc/my.cnf
gtid_mode=ON
enforce-gtid-consistency=true
systemctl restart mysqld
在从slave
vim /etc/my.cnf
gtid_mode=ON
enforce-gtid-consistency=true
systemctl restart mysqld
mysql -uroot -pQwer+1234df
mysql> stop slave;
mysql> change master to master_host='172.25.3.1' , master_user='mysync' , master_password='Qwer+1234df' , MASTER_AUTO_POSITION=1;
mysql> start slave;
mysql> show slave status\G;
测试:
在master,之前的westos库内添加一条新的信息
在slave