MySQL主从复制之单向主从

前言:知其然,知其所以然,我一直认为,知其所以然有助于记忆,所以先来介绍一下原理,免得我们只会配置主从,却不知道其原理所在。

单向主从复制原理:主库将外界SQL事件记录到自身的binlog日志中,从库请求主库的binlog日志并将其写入中继日志,而后从库重做中继日志中的SQL事件,说的通俗点,就是从库去看看主库都干了些啥,然后照着样子自己也干一遍,用这样的方式来保证自己的数据和主库一致,OK,此处只是简单说明,需要详细了解的朋友可以自行查阅相关资料。废话不多说,这就开搞吧!

一、实践环境:windows平台,两数据库,一作为主,一作为从(均为MySQL5.7版本):

          A:192.168.1.1  (主库)

          B:192.168.1.2  (从库)

二、准备工作:


  (1)  开启binlog(主从均需要):开始说到,主从同步需要使用到binlog日志,但是默认是未开启的,所以我们先要开启MySQL的日志,编辑MySQL的配置文件my.ini(linux下叫my.cnf)添加一行:

log-bin=mysql-bin  #开启binlog


(2)server-id(主从均需要):这个玩意儿是用来判定是否接收binlog的,为正整数,要求主库比从库大,怎么才为大?数值小的为大,比如从库为2,那主库应该为1,如果配置成一样会如何?从库会丢弃binlog,从而没有数据!这个也是修改配置文件,默认为1,从库的话修改为2就好了。


(3)replicate_do_db(从库或需要):这个在从库配置,注意,不是必须的,该项未配置时,默认为所有库,当你有针对性的同步某一个库时,你可指定该属性,如:

replicate_do_db=test   # 同步test库


三、在主库创建同步账户并授权:同步账户是用于控制谁能连接主库并进行同步的。语法格式如下:

create user 'repl'@'%' identified by '123';     #创建账户,repl为用户名,123为密码,%表示允许所有网段的主机可使用该账户,也可以指定某一具体ip,或者某一网段

grant replication slave on *.* to 'repl'@'%';  #对该用户进行授权

flush privileges; #刷新权限


四、重启主库服务,查看主库状态:第三步做完,就可以重启主库服务了,重启完成后,查看其状态:

show master status;

image.png

注意:记录红框的两处,从库配置的时候需要用到!


五、停止对主库一切写入操作,备份主库数据还原到从库:在配置从库复制前,需要保持主库和从库的数据一致!


六、重启从库服务,配置并启动主从:

从库完成重启后,进行如下配置:

mysql> change master to

    -> master_host='192.168.1.1', #主库IP地址

    -> master_user='repl',   #同步账户名

    -> master_password='bvt',  #同步账户密码

    -> master_log_file='mysql-bin.000002',  #主库二进制日志文件名称,与上图红框处保持一致

    -> master_log_pos=47434368;  #主库二进制日志的pos,与上图红框处保持一致

然后执行:

start slave;  #启动主从复制


七、查看从库状态,关注两个YES

show slave status\G;

image.png

image.png

Slave_IO_Running: Yes                                     //此处必须是yes

Slave_SQL_Running: Yes                                    //此处必须是yes

这处值为Yes则表示成功了


八、问题排查:有时候配置了,但是却没有看到两个Yes,此时多半是因为从库的master_log_pos和主库不一致了,查询主库的binlog文件的Position然后重新配置一遍就可以了,为了一遍成功,在配置的时候,保持主库没有写入操作是非常重要的,有的也采用锁表操作,这个根据情况而定,怎么方便就怎么办就OK了!


九、结语

本文根据俺的经验所写,难免有不足之处,若发现了不当之处,敬请斧正。另外,关于主从配置中,是否要修改日志记录格式,此处不做说明,谢谢!

猜你喜欢

转载自blog.51cto.com/9605182/2480418