首页 > 数据库 > MySQL > Mysql5.7 主从搭建实战

Replication的原理
简单的说就是master将数据库的改变写入二进制日志,slave同步这些二进制日志,并根据这些二进制日志进行数据操作
DML:SQL操作语句,update, insert,delete
Relay log :中继日志
1、Fail Over 故障切换
2、Backup Server 备份服务,无法对SQL语句执行产生的故障恢复,有限的备份
3、High Performance高性能,可以多台slave,实现读写分离
整体上来说,复制有3个步骤:
(1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
(2) slave将master的binary log events拷贝到它的中继日志(relay log);
(3) slave重做中继日志中的事件,修改salve上的数据。

mysql主从复制中:
第一步:master记录二进制日志。在每个事务更新数据完成之前,master在二进制日志记录这些改变。MySQL将事务写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。第二步:slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经执行完master产生的所有文件,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。 第三步:SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重新执行其中的事件而更新slave的数据,使其与master中的数据一致。
|
主机名 |
IP |
系统/MySQL版本 |
角色 |
|
xuegod63 |
192.168.1.63 |
CentOS7.4/5.7.20 |
Master |
|
xuegod64 |
192.168.1.64 |
CentOS7.4/5.7.20 |
slave |
模式:C/S
端口:3306
mysql> create database HA;
mysql> use HA;
mysql> create table T1(id int,name varchar(20));
vim /etc/my.cnf
log-bin=mysql-bin-master #启用二进制日志
server-id=1 #本机数据库ID 标示
binlog-do-db=HA #可以被从服务器复制的库, 二进制需要同步的数据库名
binlog-ignore-db=mysql #不可以被从服务器复制的库
( 如果重启卡死现象,kill掉再启动)
systemctl restart mysqld
主服务器上为从服务器设置一个连接账户并授予REPLICATION SLAVE权限。:
mysql> grant replication slave on *.* to slave@192.168.1.64 identified by "123456";
mysql> show master status;
+-------------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------------+----------+--------------+------------------+
| mysql-bin-master.000001 | 259 | HA | mysql |
+-------------------------+----------+--------------+------------------+
ls /var/lib/mysql
mysql> show binlog events\G
备份master上一份完整的数据复制前要保证同步的数据库一致
mysqldump -uroot -p123456 HA >HA.sql #可以导出数据库
方法:scp HA.sql 192.168.1.64:/root

mysql> show variables like '%version%';
mysql -uslave -p123456 -h 192.168.1.63
只有复制的权限, 是看不到其他库的。正常
导入数据库,和主数据库服务器保持一致,登陆到从机的服务器,创建数据库并导入
mysql –uroot –p123456
mysql> create database HA;
mysql -uroot -p123456 HA<ha.sql </ha.sql
从服务器没必要开启bin-log日志
service mysqld stop
vim /etc/my.cnf
server-id = 2 #从服务器ID号,不要和主ID相同 ,如果设置多个从服务器,每个从服务器必须有一个唯一的server-id值,必须与主服务器的以及其它从服务器的不相同。可以认为server-id值类似于IP地址:这些ID值能唯一识别复制服务器群集中的每个服务器实例。
文本框是mysql 5.1的配置
( 如果重启卡死现象,kill掉再启动)
systemctl restart mysqld
mysql>stop slave; #停止slave
mysql> change master to master_host='192.168.1.63',master_user='slave',master_password='123456';
mysql> start slave; #启动slave
mysql> show slave status\G 查看状态
Slave_IO_Running :一个负责与主机的io通信
Slave_SQL_Running:负责自己的slave mysql进程
两个为YES 就成功了!
master Binlog Dump线程:
mysql> show processlist \G
slave IO/SQL线程:
mysql> insert into T1 values (1,'man');
从数据库上查看:
如果遇到主从不同步,看一下主从bin-log的位置,然后再同步。
在主服务器上看二进制日志事件列表
mysql> show binlog events \G
从服务器执行MySQL命令下:
mysql> stop slave; #先停止slave服务
mysql> change master to master_log_file='mysql-bin-master.000001',master_log_pos=1164;
#根据上面主服务器的show master status的结果,进行从服务器的二进制数据库记录回归,达到同步的效果
mysql>slave start; #启动从服务器同步服务
mysql> show slave status\G; #用show slave status\G;看一下从服务器的同步情况
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果都是yes,那代表已经在同步
重启从服务器,再查看状态:
停止从服务器slave stop;
开启从服务器slave start;
排错思路:
1、二进制日志没有开启
2、IPTABLES 没有放开端口
3、对应的主机 IP地址写错了
SQL线程出错
1、主从服务器数据库结构不统一
出错后,数据少,可以手动解决创建插入,再更新slave状态。
注:如果主上误删除了。那么从上也就误删除了。 #因此主上要定期做mysqldump备份。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31485142/viewspace-2157295/ ,如需转载,请注明出处,否则将追究法律责任。