1、Master将数据改变记录到binlog。
2、Slave将master的binlog拷贝到本地的relaylog。
3、Slave回放relaylog。
二、测试环境:
操作系统:Win7
数据库节点信息:
主 localhost 3308 5.5.17
从 localhost 3306 5.5.25
注:Master的版本不能高于Slave版本(版本向下兼容),最好主从使用相同版本的MySQL。
三、主库配置
1、编辑配置文件my.ini,在[mysqld]部分添加下面内容:
server-id=1 #设置服务器id,1表示Master节点,其他正整数表示slave节点。 log-bin=mysql-bin #开启binlog日志,因为MySQL的主从是通过从数据库读取主数据库的binary log来实现的 #不需要记录binlog的数据库,多个数据库时,可配置多个binlog-ignore-db。 binlog-ignore-db=mysql #需要记录binlog的数据库,多个数据库时,可配置多个binlog-do-db。 #binlog-do-db=test
2、启动mysql
3、查看主库的binlog是否成功开启
show variables like ‘log_bin’;
ON 已开启
OFF 未开启
4、主库创建拥有replication slave权限的账号,从库使用该账号连接主库
grant replication slave on *.* to slave@'%' identified by '123456' ; grant replication slave on *.* to slave@'localhost' identified by '123456' ;
5、查看主库状态
show master status;
记下当前File和Position的值,后面为从库指定master时会用到。
四、从库配置
1、编辑配置文件my.ini:
在[mysqld]部分,添加如下配置:
server-id=2 #配置需要复制的数据库,如果有多个db,可以配置多个replicate-do-db。 #replicate-do-db=test #指定不需要同步的数据库,如果有多个,可以配置多个replicate-ignore-db。 replicate-ignore-db=mysql
2、启动从库
3、查看server-id是否配置成功(未配置成功时值为0)
show variables like ‘serv%’;
4、为slave指定master,通过change master命令指定:
change master to master_host='127.0.0.1', master_user='slave', master_password='123456', master_log_file='mysql-bin.000009', master_log_pos=107, master_port=3308;
change master 命令执行成功后,在从节点的mysql\data\master.info文件中可以查看新设置的master信息。
5、启动同步线程
start slave;
注:停止同步线程命令为:stop slave;
6、通过 show slave status命令查看slave同步状态信息
Slave_IO_Running=Yes
Slave_SQL_Running=Yes
说明slave同步用的的IO和SQL线程都已经开始运行。
7、通过 show processlist 也可以查看slave的IO和SQL进程:
五、测试主从同步
1、在主库上执行:create database db01;然后分别查看主库、从库,则主库、从库节点上应该都成功创建了db01数据库。
2、在主库上 use db01,然后create table创建表,然后分别查看主库、从库,则二者应该都成功创建了新表。
3、继续往新建的表中insert、update、delete 记录,则主库、从库应该同步发生相同变化。
六、查看主库binlog
SHOW BINLOG EVENTS
[IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
-- limit与select查询中的limit使用方法相同
--from pos 类似于select查询中的 where pos>pos值
如:show binlog events in 'mysql-bin.000003';
复制过滤可以让你只复制服务器中的一部分数据,有两种复制过滤:在master上过滤二进制日志中的事件;在slave上过滤中继日志中的事件,如下图:
说明:
(1)binlog-ignore-db 与 binlog-do-db 数据库过滤,是根据当前使用的数据库( use db01 则当前使用的数据库就是db01)进行过滤的,比如:
如果主库ignore配置了db01,并且当前use的数据库是db01,如果执行update db02.table01 set.......,则该sql是不会记录到binlog的。
如果主库ignore配置了db01,并且当前use的数据库是db02,如果执行update db01.table01 set.......,则该sql仍然会记录到binlog的。
(2)如果未配置binlog-do-db和binlog-ignore-db,则默认所有db变更都会记录到binlog; 如果未配置binlog-do-db,但是配置了binlog-ignore-db,则除了binlog-ignore-db之外的db的变更都会记录binlog。
如果同时配置了binlog-do-db和binlog-ignore-db,则只会记录binlog-do-db的变更。
八、补充说明
1、当主数据库挂掉的时候,其实默认情况下从数据库会每60秒去访问主数据库进行同步,直到主数据库开启。
2、当从数据库挂掉,直接使用命令start slave开始同步功能即可。
3、mysql主从同步的速度虽然很快,但是还是存在时间的差异,所以,实时性要求高时,应使用主库查询。
4、从数据库对外暴露的账号,应该是拥有只读权限的账号,以防止误操作导致主从不一致。
5、所有节点的server-id不允许重复,并且Master节点的server-id必须配置为1.