一、主从复制的原理
1 master将改变记录到二进制日志(binary log)。这些记录过程叫做二进制日志事件,binary log events;
2 slave将master的binary log events拷贝到它的中继日志(relay log);
3 slave重做中继日志中的事件,将改变应用到自己的数据库中。 MySQL复制是异步的且串行化的
这里与Redis主从复制的数据复制方式不一样。
每个slave都只有一个master,但每个master都可以由多个slave,每个机器都只能有唯一的服务器ID。
MySQL主从复制最大的问题就是不是实时的,master给slave发送bin-log二进制日志后,slave并不是立刻读取,而是转成Relay log再进行读取。
二、主从复制主机配置
server-id 为一台MySQL主机的唯一标识,不可以重复。
log-bin为指定生成的二进制数据文件的存放位置,默认存放在了mysql的安装目录下(var/lib/mysql)
binlog-ignore-db=mysql 指定哪些数据库不要复制
binlog-do-db=需要复制的主数据库名字
binlog_format=STATEMENT(默认) 指log-bin日志的形式
1.如果指定为STATEMENT方式,那么log-bin中存储的是执行每个能修改数据的的sql语句,如下图。
如果sql中调用了某些实时性函数,如now()或sysdate(),会导致主从机器的数据不一致,因为从机是拿来主机上执行的SQL进行数据复制。
2.ROW方式,不记录每条sql语句的上下文信息,仅需记录哪条数据被修改了,修改成什么样了。而且不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发无法被正确复制的问题。缺点是会产生大量的日志,尤其是alter table的时候会让日志暴涨。
3.MIXED方式,为以上两种方式的混合使用,一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,MySQL会根据执行的SQL语句选择日志保存方式。
但这种方式也避免不了 @@host_name这种全局变量的不一致。
三、主从复制从机配置
从机配置很简单,只需要再mysqld下配置
指定server-id和relay-log文件的存储位置即可,默认为var/lib下的mysql-relay文件。
注意:在配置主从复制之前的数据不会被从机继承,从机只会复制到从开启主从复制之后的数据。
四、开启主从复制
1.关闭两台机器的防火墙,保证互相能够ping通。
2.重启MySQL服务。
3.在主机上建立账户并授权slave权限。
GRANT REPLICATION SLAVE ON *.* TO 'zhangsan'@'从机器数据库IP' IDENTIFIED BY '123456';
4.在主机查看主机状态。show master status
记录下File 与 Position
这时就不要再去操作主机了,防止这两个值变化。
5.在从机
CHANGE MASTER TO MASTER_HOST='192.168.124.3',
MASTER_USER='zhangsan',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.具体数字',MASTER_LOG_POS=position的值;
6.启动从服务器复制功能
start slave
7.查看从机复制状态,show slave status\G
两个参数都为yes 说明配置成功
8.主机新建库、新建表、insert记录,从机复制
9.停止从服务器复制功能
stop slave
10.若想重新配置主从
stop slave;
reset master;
-- 然后再继续从第一步开始配置从服务器即可