MySQL-----主从复制 Slave_SQL_Running:no

      主从复制的原理图: MySQL-----主从复制 Slave_SQL_Running:no_第1张图片

        主服务器是将数据更新(增删改查语句)写入二进制日志(binary log) 后,master通知存储引擎提交事务。

从服务器有两个线程,I/O线程和SQL线程。从服务器通过I/O线程(工作线程)读取主服务器中的二进制日志后并写入中继日志(relay log),relay log存放数据,保证二进制日志中的事件,数据不会丢失,SQL线程把relay log转换成SQL语句并从relay log中读取事件,同时重放其中的事件更新slave数据,保证slave和master数据一致。

主从复制特点:

        1、异步复制

        2、主从复制不一致比较常见

       主从复制的实战

环境说明: 

  • 两台CentOS7虚拟机(Master,Slave)这儿是作为我自己的虚拟机的IP
  • Master_IP:192.168.21.131
  • Slave_IP:192.168.21.135
  • 注意:UUID不相同,防火墙要关闭

复制的基本原则

  • 每个Slave只有一个Master
  • 每个Slave只能有一个唯一的服务ID
  • 每个Master可以有多个Slave

主服务器的配置:

在配置文件/etc/my.cnf [mysqld]部分下插入:

[mysqld]

log-bin=mysql-bin   #开启二进制日志

server-id=131   #设置server-id,建议使用ip的最后三位

MySQL-----主从复制 Slave_SQL_Running:no_第2张图片

       从服务器slave配置:

在配置文件/etc/my.cnf [mysqld]部分下插入:

[mysqld]

relay-log=mysql-relay   #开启中继日志

server-id=135  #设置server-id,建议使用ip的最后三位

MySQL-----主从复制 Slave_SQL_Running:no_第3张图片

最后两台服务器配置完成后要重启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;   //查看主从复制是否配置成功

MySQL-----主从复制 Slave_SQL_Running:no_第4张图片

当显示出图片中的这三个表示状态正常。

学习过程中的错误

错误一: 从服务器Slave_SQL_Running:no 代表salve不同步

MySQL-----主从复制 Slave_SQL_Running:no_第5张图片

解决办法:

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就显示同步成功。

写入数据测试:

使用数据库的命令,在主服务器写入数据。

MySQL-----主从复制 Slave_SQL_Running:no_第6张图片

从服务器查看数据是否同步 

MySQL-----主从复制 Slave_SQL_Running:no_第7张图片

 在主服务器创建的数据在从服务查询出来就表示成功。

总结:主从复制之前先关闭防火墙,selinux并iptables的规则的注意。

你可能感兴趣的:(MySQL,mysql,服务器,sql)