Mysql主从同步的配置

准备阶段:

软件----mysql-5.7.17.tar    网上或者官网找
解压之后:
mysql-community-client-5.7.17-1.el7.x86_64.rpm
mysql-community-common-5.7.17-1.el7.x86_64.rpm
mysql-community-devel-5.7.17-1.el7.x86_64.rpm
mysql-community-embedded-5.7.17-1.el7.x86_64.rpm
mysql-community-embedded-compat-5.7.17-1.el7.x86_64.rpm
mysql-community-embedded-devel-5.7.17-1.el7.x86_64.rpm
mysql-community-libs-5.7.17-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.17-1.el7.x86_64.rpm
mysql-community-minimal-debuginfo-5.7.17-1.el7.x86_64.rpm
mysql-community-server-5.7.17-1.el7.x86_64.rpm
mysql-community-test-5.7.17-1.el7.x86_64.rpm

系统:centos7  2台最小安装
yum源正常
可以yum repolist检查下

原理以及概念:

1) MYSQL主从同步是异步复制的过程,整个同步需要开启3线程,master上开启bin-log日志(记录数据库增、删除、修改、更新操作);

2) Slave开启I/O线程来请求master服务器,请求指定bin-log中position点之后的内容;

3) Master端收到请求,Master端I/O线程响应请求,bin-log、position之后内容返给salve;

4) Slave将收到的内容存入relay-log中继日志中,生成master.info(记录master ip、bin-log、position、用户名密码);

5) Slave端SQL实时监测relay-log日志有更新,解析更新的sql内容,解析成sql语句,在salve库中执行;

6) 执行完毕之后,Slave端跟master端数据保持一致

bin-log的用途:

 bin-log日志最大的功能记录数据库增、删、改、插入等操作,记录用户操作的SQL语句;
 bin-log日志可以用数据增量备份、完整备份;
 bin-log还可以主要主从复制+读写分离;

主从深入剖析:

1.Master 数据库只要发生变化,立马记录到Bin log 日志文件中
2.Slave数据库启动一个I/O 线程连接Master数据库,请求Master变化的二进制日志
3.Slave I/O获取到的二进制日志,保存到自己的中继日志文件中。
4.Slave 有一个 SQL 线程定时检查中继日志是否变化,变化那么就更新数据

总结:我们要保证Slave机的SQL和I/O线程是yes

为什么要做主从?

1.实现服务器负载均衡

2.通过复制达到数据的异步备份

3.提高数据库的可用性

4.防止出现主宕机,服务停止或出现问题

开始实验

1.主从步骤一样初级部署

msater(主) slave(从):
tar  xf  mysql-5.7.17.tar  解压
yum  -y install  mysql-community*   将mysql的包全部安装
systemctl start mysqld   开启服务
systemctl  enable  mysqld   开机自启
grep -i  password  /var/log/mysqld.log   不开启服务是不会生成日志文件的
输出:
2021-12-16T17:33:40.239450Z 1 [Note] A temporary password is generated for root@localhost: !9HIsf?(=oOD   后面这段就是初始密码

mysqladmin -uroot -p'!9HIsf?(=oOD' password  zzz2021@qqqq.cn

mysqladmin: [Warning] Using a password on the command line interface can be insecure.
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.     #成功

mysql -uroot -pzzz2021@qqqq.cn   进入数据库

2.配置主

主!!!!
vim  /etc/my.cnf    #配置文件
[mysqld]
server_id=10         #启用binlog日志文件
log_bin=master10    #日志默认存储在数据库目录下
:wq保存退出

systemctl  restart  mysqld   #重启服务

用户授权
mysql  -uroot  -p密码        replication  slave  让用户有复制权限

mysql>  grant replication  slave  on *.*  to  repluser@"%"  identified  by  "密码";

先exit退出,systemctl  restart  mysqld  重启下
进入数据库
查看日志名信息和偏移量
!!!很重要,查到的给从服务器用
show  master  status;
mysql> show master status\G
*************************** 1. row ***************************
             File: master10.000001     #日志名
         Position: 154                #偏移量
     Binlog_Do_DB:
 Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)

3.配置从

从!!!!配置从了,兄弟们   主192.168.242.10  从192.168.242.11
vim  /etc/my.cnf


[mysqld]
server_id=11
:wq   #保存退出

systemctl   start  mysqld   #重启
进入数据库
指定主服务器信息
mysql>  change  master to
        master_host="192.168.242.10",
        master_user="repluser",
        master_password="密码”,
        master_log_file="master10.000001",
        master_log_pos=154;

启动slave进程
mysql>  start  slave;

mysql>  show  slave  status\G       最关键!!!!要出现2个yes

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

注意注意

systemctl stop firewalld
setenforce 0                #关闭防火墙,selinux
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 2003
                Last_IO_Error: error connecting to master 'repluser@192.168.242.10:3306' - retry-time: 60  retries: 1
!!!!!!!!!!!!出现该报错的时候,先检查防火墙和selinux关了没
再                       #博主就是因为网关防火墙和selinux排了一个半小时错,各种排查....
mysql>  stop slave;
mysql>  重新指定master信息
change  master to  master_host="ip",
master_user="用户名",
master_password="密码",
master_log_file="日志文件",
master_log_pos=偏移量;
mysql>  start slave;
mysql>  show slave status\G    

*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.242.10
                  Master_User: repluser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master10.000002
          Read_Master_Log_Pos: 441
               Relay_Log_File: mysql2-relay-bin.000002
                Relay_Log_Pos: 319
        Relay_Master_Log_File: master10.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
#成功


4.验证

进入数据库建库建表

主:
mysql>  create database DB1;
mysql>  use DB1;
mysql>  create table DB1.tt(name char(2));
Query OK, 0 rows affected (0.06 sec)



从验证:
mysql>  show  databases;
mysql>  use DB1;
mysql>  show  tables;
#可以查看到库和表

到这里就成功了

5.常见报错

常见1:
Last_IO_Error: Got fatal error 1236 from master
 when reading data from binary log: 'Could not find first log file name in binary log index file'

    在从服务器执行如下操作:
	mysql> stop slave;
	
	在主服务器查看日志名和偏移量
	host51  show  master status;
	
	在从服务器 重新指定日志名和偏移量
	mysql> change  master to  master_log_file="日志名" , master_log_pos=偏移量;
	mysql> start slave;
	mysql> show  slave status \G
常见2:
Last_IO_Error: Fatal error: 
The slave I/O thread stops because 
master and slave have equal MySQL server UUIDs; 
these UUIDs must be different for replication to work

在从服务器做如下操作:
vim /var/lib/mysql/auto.cnf
[auto]
server-uuid=2dac4865-4770-11ec-9103-6462be92a06e   修改一个字母(字母个数不能少)
:wq
systemctl   restart  mysqld
常见3:
 Last_IO_Error: error connecting to master 'repluser@192.168.242.10:3306' - 
 retry-time: 60  retries: 2
 在从服务器做如下操作:
		MySQl> stop  slave;
		mysql> change master to  master_host="ip" master_user="用户名",master_password="密码" master_log_file="日志名",  master_log_pos=偏移量;
		MySQL>  start slave;
		mysql> show slave status \G

公共解决方案:

把slave角色的服务器恢复为独立的数据库服务器,重新配置为从服务器。
在从服务器执行如下操作:
 systemctl  stop   mysqld 
 cd  /var/lib/mysql/
 rm  -rf master.info
 rm -rf   *-relay-bin.*
 rm -rf relay-log.info
 systemctl   start  mysqld

最后,如果还是解决不了,或者我的方法解决不了

看这个大佬的


mysql主从同步问题梳理 - 小雨淅淅o0 - 博客园


看这个大佬的


版权声明:本文为weixin_54150681原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。