mysql5.7主从复制配置与备份

一、主从复制架构

mysql5.7主从复制配置与备份_第1张图片

  • mysql 主从至少需要2台服务器

  • 首先 master上开启了bin-log日志功能,将master上的增删改更新等操作的sql语句记录下来
  • master开启IO线程吗,供slave节点获取
  • slave开启IO线程获取master上的bin-log日志,并写入relay-log中;开启sql线程读取relay-log中的sql语句

所以主从复制的流程为

  1. slave通过IO线程连接master,并请求master从指定位置发送bin-log日志内容
  2. master接收到slave的IO线程请求,根据bin-log中的position点的位置发送给salve的IO,同时告知最新的bin-log文件名和更新position点
  3. slave IO线程接收到信息后,将接收的日志内容添加到relay-log日志文件的最末端
  4. slave sql线程检测到relay-log内容有更新,会解析并执行relay-log内的sql语句
  5. 执行完成,master和slave库保持数据一致

二、mysql主从源码编译安装

详见

mysql5.7编译安装

注意关闭SELINUX和防火墙

setenforce 0        #临时关闭SELinux

sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config  #永久关闭SELinux(重启生效)

systemctl stop firewalld.service    #临时关闭防火墙

systemctl disable firewalld.service    #永久关闭防火墙

三、配置master

1.配置/etc/my.cnf

server-id=1
log-bin=mysql-bin

mysql5.7主从复制配置与备份

2.进入mysql 添加 复制权限给从库

mysql -uroot -pHuawei12#$ -e "grant replication slave on *.* to 'mysql_copy'@'%' identified by 'Huawei12#$';flush privileges;"

3.重启mysql

systemctl restart mysql

4.查看master的bin-log和pos点

show master status;

mysql5.7主从复制配置与备份_第2张图片

四、配置从库

1.配置/etc/my.cnf

server-id=2

2.重启数据库

systemctl restart mysql

3.指定主库位置

mysql -uroot -pHuawei12#$

mysql -uroot -pHuawei12#$

change master to master_host='192.168.197.129',master_user='mysql_copy',master_password='Huawei12#$',master_log_file='mysql-bin.000008',master_log_pos=154;

flush privileges;

4.开启slave同步

start slave;

mysql5.7主从复制配置与备份_第3张图片

5.查看slave的状态

show slave status\G

mysql5.7主从复制配置与备份_第4张图片

五、测试主从复制

1.在master创建一个数据库

mysql5.7主从复制配置与备份_第5张图片

2.在slave查看是否有test数据库

mysql5.7主从复制配置与备份_第6张图片

六、主从复制故障恢复

如果主从复制的两台服务器中一台宕机或者网络中断导致主从复制失效,需要重新手动同步

1.方法一:跳过此次错误,此方法使用时可能会丢失少许数据,适用于数据要求不高场景

# master主库设置读锁,不允许写数据
flush tables with read lock; 

# slave从库恢复同步状态
stop slave;                                                      
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE;            
start slave;                                                      
show slave status\G  

# 主库开启读
unlock tables;

2.方法二:mysqlbinlog通过relaylog日志导出导入(增量备份)

#slave从库将relay-bin日志导出
mysqlbinlog /var/lib/mysql/mariadb-relay-bin.000002> /home/mysql_bak.sql # 导出
#手动同步里面的数据
mysql
source /home/mysql_bak.sql;    # 导入
mysql 数据库名 < /home/mysql_bak.sql   # 导入

3.方法三:mysqldump通过将数据库导出导入(全量备份)

mysqldump -uroot -pHuawei2#$ test -l -F > /tmp/test.sql    #全量导出
mysql -uroot -pHuawei2#$ test  -v -f < /tmp/test.sql        #全量导入