主服务器是将数据更新(增删改查语句)写入二进制日志(binary log) 后,master通知存储引擎提交事务。
从服务器有两个线程,I/O线程和SQL线程。从服务器通过I/O线程(工作线程)读取主服务器中的二进制日志后并写入中继日志(relay log),relay log存放数据,保证二进制日志中的事件,数据不会丢失,SQL线程把relay log转换成SQL语句并从relay log中读取事件,同时重放其中的事件更新slave数据,保证slave和master数据一致。
主从复制特点:
1、异步复制
2、主从复制不一致比较常见
主从复制的实战
环境说明:
复制的基本原则
主服务器的配置:
在配置文件/etc/my.cnf [mysqld]部分下插入:
[mysqld]
log-bin=mysql-bin #开启二进制日志
server-id=131 #设置server-id,建议使用ip的最后三位
从服务器slave配置:
在配置文件/etc/my.cnf [mysqld]部分下插入:
[mysqld]
relay-log=mysql-relay #开启中继日志
server-id=135 #设置server-id,建议使用ip的最后三位
最后两台服务器配置完成后要重启MySQL服务 systemctl restart mysqld.server
在主机上建立账户并授权slave
create user 'root'@'%'identified with mysql_native_password by '自己的数据库密码'; #建立复制root用户授权root用户
select host,user from mysql.user; #查看建立的账户
grant replication slave on *.* to 'root'@'%'; #授权slave
flush privileges; #刷新权限
show master status\G; #查询master的状态
记录结果中的file和position的值
注意:执行完此步骤后不要在操作主服务器MySQL,防止主服务器状态值发生变化。
从服务器操作(告知从服务器二进制文件名与位置)
mysql> change master to master_host = '192.168.21.131', #主库的IP地址
-> master_user = 'root', #在主库上创建的复制账号
-> master_password = '你的密码', #在主库上创建的复制账号密码
-> master_log_file = 'mysql-bin.000001', #开始复制的二进制文件名(从主库查询结果中获取)
-> master_log_pos = 534; #开始复制的二进制文件位置(从主库查询结果中获取)
查看从服务器状态
start slave; //开启复制
show slave status\G; //查看主从复制是否配置成功
当显示出图片中的这三个表示状态正常。
学习过程中的错误
错误一: 从服务器Slave_SQL_Running:no 代表salve不同步
解决办法:
stop slave;#先停掉slave
set global sql_slave_skip_counter=1; #跳过错误步数,后面步数可变
start slave; #在启动slave
show slave status\G;#查看同步状态
显示线程都为yes了,可以主从复制了。
错误二:主从root用户授权并改动密码插件为mysql_native_password
因为数据库是8的版本,默认caching_sha2_password,我们连接客户端需要数据插件为mysql_native_password
mysql> update user set authentication_string = '' where user='root';
mysql> alter user 'root'@'%' identified with mysql_native password by '密码';
mysql> flush privileges;
mysql> select user,host,plugin from mysql.user;
错误三:slave_IO_Running:connecting 或no slave_SQL_Running:no 查看自 己的防火墙是否为关闭状态
systemctl start firewalld //启动
systemctl enable firewalld //开机启动
systemctl stop firewalld //关闭
systemctl disable firewalld //取消开机启动
在进入Mysql之后,查看同步状态 show status\G;
slave_IO_Running和slave_SQL_Running都为yes就显示同步成功。
写入数据测试:
使用数据库的命令,在主服务器写入数据。
从服务器查看数据是否同步
在主服务器创建的数据在从服务查询出来就表示成功。
总结:主从复制之前先关闭防火墙,selinux并iptables的规则的注意。