mysql 5.7 主从复制

1、原理mysql

    该过程的第一部分就是master记录二进制日志。在每一个事务更新数据完成以前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即便事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。 git

下一步就是slave将master的binary log拷贝到它本身的中继日志。首先,slave开始一个工做线程——I/O线程。I/O线程在master上打开一个普通的链接,而后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,若是已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。 sql

SQLslave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志一般会位于OS的缓存中,因此中继日志的开销很小。 数据库

此外,在master中也有一个工做线程:和其它MySQL的链接同样,slave在master中打开一个链接也会使得master开始一个线程。复制 过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操做不能在slave上并行操做。centos

(简短描述:主从数据库同步工做原理(流程):缓存

但主库的数据发生修改时,数据更改的记录将写入到主库的二进制文件中,从库此时将会调用一个IO线程读取主库的二进制文件,并与中继日志做对比,并将存在差别的事件写入到中继日志中(当两日志内容事件一致时,IO线程将处于睡眠状态),而后从库再调用SQL线程去读取中继日志,并将刚写入的事件数据放入到从库中以保持主从数据库数据同步。)服务器

2、要求mysql主从的环境要求网络

    一、互相同步的两台mysql的版本必须保证大版本号一致。好比5.5+和5.6+之间同步数据,5.6的数据同步到5.5就会出现问题。保证大版本号一致很重要。tcp

    二、每台服务器必须开启binlog,不开启binlog则根本没法开始数据同步。ide

    三、每台服务器必须配置不一样的server-id,范围在1到(2^32-1)之间。

        四、要保证防火墙对3306端口的开启,为了学习数据库的主从配置。

     五、保证网络畅通

 

主从系统要保持一致:包括数据库版本,操做系统版本,磁盘IO磁盘容量,网络带宽等。

[root@data02 ~]# cat /etc/redhat-release

CentOS release 6.2 (Final)

[root@data02 ~]#

 

主库master

从库slave

OS系统版本

CentOS release 6.2 (Final)

CentOS release 6.2 (Final)

数据库版本

5.6.12-log

5.6.12-log

磁盘容量

50G

30G

主机ip地址

192.168.52.129

192.168.52.130

端口

3306

3306

内存

1G

1G

服务器类型

虚拟机

虚拟机

3、主服务配置

 1. MySQL的配置文件的位置是在 /etc/my.cnf

     添加

    server_id=

    #指定binlog的生成目录,不少人不是这么写的

    log-bin=/var/lib/mysql-log/mastera

    gtid_mode=on

    enforce_gtid_consistency=1

2.建立binlog目录并受权mysql用户

mkdir /var/lib/mysql-log/mastera

chown mysql . /var/lib/mysql-log/mastera

3.重启mysql服务

service mysqld restart

4.查看binlog是否生成

ls /var/lib/mysql-log/mastera

5.导出主数据库(注:若是两个数据库状态一致即表及数据记录都同样,就不用作5,6这两步了)

mysqldump -uroot -p'密码' -A --single-transaction > /tmp/mysql.all.sql

这个过程会发生报警,由于用了明码。不用担忧

6.将mysql.all.sql 拷贝到slave上,能够用scp命令

7.在slave服务器上将导出的mysql.all.sql脚本,导入mysql服务器

mysql -uroot -p'密码'  <  sql备份文件

8.查看slave上是否导入

 

四.从服务器操做

修改my.cnf

1.#设置和master不一样的server-id

server-id= 

gtid_mod=on

enforce_git_consistency=1

2.重启mysql服务

service mysqld restart

 

防火墙开启master 服务器的3306端口

centos6.* 开启方式

 

centos7.*的开启方式

[root@localhost ~]# firewall-cmd –add-port=3306/tcp 

[root@localhost ~]# firewall-cmd –permanent –add-port=3306/tcp 

[root@localhost ~]# firewall-cmd –reload success 

五.最后两步

1.登陆master受权slave

grant replication slave on  *.*  to ‘用户名’@'slaveip' identified by '密码';

flush privileges;

2.登陆slave修改master

change master to master_host='192.168.0.103',master_user='slave1',master_password='123456',master_auto_position=1;

3.slave 上打开复制线程

start slave(中止slave 命令:stop slave)

4.查看slave状态

 show slave status;

查看返回状态找到一下两个字段,

1) Slave_IO_Running: Yes

IO线程状态,必须YES

2) Slave_SQL_Running: Yes

SQL线程状态,必须YES

 

六.这时候就完成了主从复制

相关文章
相关标签/搜索