前言:知其然,知其所以然,我一直认为,知其所以然有助于记忆,所以先来介绍一下原理,免得我们只会配置主从,却不知道其原理所在。
单向主从复制原理:主库将外界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;
注意:记录红框的两处,从库配置的时候需要用到!
五、停止对主库一切写入操作,备份主库数据还原到从库:在配置从库复制前,需要保持主库和从库的数据一致!
六、重启从库服务,配置并启动主从:
从库完成重启后,进行如下配置:
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;
Slave_IO_Running: Yes //此处必须是yes
Slave_SQL_Running: Yes //此处必须是yes
这处值为Yes则表示成功了
八、问题排查:有时候配置了,但是却没有看到两个Yes,此时多半是因为从库的master_log_pos和主库不一致了,查询主库的binlog文件的Position然后重新配置一遍就可以了,为了一遍成功,在配置的时候,保持主库没有写入操作是非常重要的,有的也采用锁表操作,这个根据情况而定,怎么方便就怎么办就OK了!
九、结语
本文根据俺的经验所写,难免有不足之处,若发现了不当之处,敬请斧正。另外,关于主从配置中,是否要修改日志记录格式,此处不做说明,谢谢!