Linux--运维
Mysql主从同步
通过将MySQL的某一台主机(master)的数据复制到其他主机(slaves)上,并重新执行一遍来执行 复制过程中一台服务器充当主服务器,而其他一个或多个其他服务器充当从服务器
为什么要做主从复制
灾备
数据分布
负载平衡
读写分离
提高并发能力
主从复制原理
主要基于MySQL二进制日志 主要包括三个线程(2个I/O线程,1个SQL线程)
1、MySQL将数据变化记录到二进制日志中;
2、Slave将MySQL的二进制日志拷贝到Slave的中继日志中;
3、Slave将中继日志中的事件在做一次,将数据变化,反应到自身(Slave)的数据库
详细步骤:
1、从库通过手工执行change master to 语句连接主库,提供了连接的用户一切条件(user 、password、port、ip),并且让从库知道,二进制日志的起点位置(file名 position 号); start slave
2、从库的IO线程和主库的dump线程建立连接。
3、从库根据change master to 语句提供的file名和position号,IO线程向主库发起binlog的请求。
4、主库dump线程根据从库的请求,将本地binlog以events的方式发给从库IO线程。
5、从库IO线程接收binlog events,并存放到本地relay-log中,传送过来的信息,会记录到master.info中
6、从库SQL线程应用relay-log,并且把应用过的记录到relay-log.info中,默认情况下,已经应用过的relay 会自动被清理purge
实验:
使用binlog技术实现一台服务器与两台客户端的mysql主从同步
1.准备工作(一台终端设备,以及两台客户端)
终端设备:192.168.88.8
客户端1:192.168.88.9
客户端2:192.168.88.10
(1)关闭防火墙与SELinux
[root@localhost ~]# systemctl stop firewalld #关闭防火墙
[root@localhost ~]# setenforce 0 #将SELinux改为宽容模式
(2)下载Mysql,使用在线安装Mysql(节省时间并且linux自带mysql的root用户没有密码)
[root@localhost ~]# yum -y install mysql
2.主库配置
(1)定义服务id,在mysql的配置文件中
[root@localhost ~]# vim /etc/my.cnf
server_id=1 #在[mysqld]配置下添加
(2)重启mysql
[root@localhost ~]# systemctl restart mysqld
(3)备份需要的数据库
先查看有哪些数据库
mysql> show databases;
备份数据库
[root@localhost ~]# mysqldump --opt -B db1 school > db.sql
(4)创建用户并授权
mysql> create user rep@'192.168.88.%' identified with mysql_native_password by '123456'; #创建提供远程登录的用户
mysql> grant replication slave on *.* to rep@'192.168.88.%'; #赋予该账号最高权限
(5)查看master信息
mysql> show master status;
3.从库配置
(1)定义服务id
[root@client ~]# vim /etc/my.cnf
server_id=2 #在[mysqld]配置下添加
[root@client ~]# vim /etc/my.cnf
server_id=3 #在[mysqld]配置下添加
(2)重启MySQL服务
[root@localhost ~]# systemctl restart mysqld
(3)配置从库的服务
mysql> change master to
-> master_host='192.168.88.8',
-> master_user='rep',
-> master_password='123456',
-> master_log_file='binlog.000002',
-> master_log_pos=716;
Query OK, 0 rows affected, 9 warnings (0.00 sec)mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)
(4)检测配置是否成功
mysql> show slave status \G
显示两个yes证明是成功
(5)报错修改
mysql replication 中slave机器上有两个关键的进程,死一个都不行,
一个是slave_sql_running,
一个是Slave_IO_Running,
一个负责与主机的io通信,
一个负责自己的slave mysql进程。
Slave_IO_Running: Connecting / No
检查是否是防火墙未关闭 ,或者是 Master_Log_File的名字不匹配
1.重新关闭防火墙
2. mysql> slave stop;
mysql>CHANGE MASTER TO MASTER_LOG_FILE='binlog.****** '; #修改名称
mysql> slave start;
mysql> show slave status\G
Slave_SQL_Running: No
1.程序可能在slave上进行了写操作
2.也可能是slave机器重起后,事务回滚造成的.
解决办法:
mysql> stop slave ;
mysq1>Set GLOBALE SQL SLAVE SKIP COUNTER=1.
mysql> start slave
4.测试
(1)客户端是否可以登录主数据库
[root@client ~]# mysql -u rep -h 192.168.88.8 -p #-h 远程登录,属于设备ip
Enter password:
(2)测试数据是否同步
mysql> create database db3; #创建一个数据库
Query OK, 1 row affected (0.01 sec)
服务端 192.168.88.8
客户端192.168.88.9
客户端192.168.88.10
原文地址:https://blog.csdn.net/ens33/article/details/145265493
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!