mysql的主从复制基于二进制日志和中继日志,所以,日志是复制的关键。
环境:
安装好两台mysql服务器,ip分别为192.168.0.104(slave)、192.168.0.105(master),端口默认为3306,安装路径为/usr/local/mysql,data目录为安装目录下的data目录。两台mysql都是5.5版本的。
master配置:
编辑master服务器的/etc/my.cnf配置文件,在[mysqld]标签下
1、启用二进制日志
打开log-bin和binlog_format选项,默认这两项是开启的
2、配置服务器id,主从复制中,每台服务器的id不能一样,范围为1-2^32-1
这里master服务器的server id使用默认值1
3、创建具有复制权限的用户
配置完后启动主服务器
slave配置:
编辑slave服务器的/etc/my.cnf文件,在[mysqld]标签下
1、禁用二进制日志
2、开启中继日志
3、修改server id
启动从服务器
查看从服务器状态
此时从服务器虽然启动了,但是还没有连接到主服务器,连接至主服务器
MASTER_HOST:主服务器ip
MASTER_USER:主服务器中用于复制的用户(主服务器中使用GRANT命令创建的账号)
MASTER_PASSWORD:主服务器中用于复制的用户密码
MASTER_LOG_FILE:主服务器中正在使用的二进制日志,在主服务器中使用show master status查看
MASTER_LOG_POS:当前event所在位置
再次查看slave服务器状态
其中,Slave_IO_Running和Slave_SQL_Running都显示为No
从服务器上会有IO_THREAD和SQL_THREAD两个线程,IO_THREAD负责从master服务器中复制二进制日志中的事件至slave服务器的中继日志中,SQL_THREAD负责将中继日志中的事件执行
启动这两个线程:
或者分开启动
主要有三个原因
1、网络不通
2、密码不对
3、pos不对
如果这三个都好,就会出现yes了
数据从主服务器写入,然后同步至从服务器,因此,从服务器不能直接写,关闭从服务器写权限
此配置对于具有SUPER权限的用户没限制
修改完配置,需要重启服务
service mysqld restart
配置主服务器二进制日志写方式(二进制日志有缓存,宕机可能会造成日志未同步到从服务器)
编辑my.cnf文件,配置sync-binlog = ON
接下来,在master服务器中修改数据,数据会被同步到slave服务器。
过滤
有时候只想同步某几个数据库,或某几张表,mysql服务端提供了几个变量来过滤
master端:
binlog-do-db:仅将指定数据库的修改记录二进制日志中
binlog-ignore-db:忽略指定数据库的更新
slave端:
replicate-do-db:仅将指定数据库的修改同步
replicate-ignore-db:忽略指定数据库的更新
replicate-do-table:仅将指定表的修改同步
replicate-ignore-table:忽略指定表的更新
replicate-wild-do-table:使用通配符指定表
replicate-wild-ignore-table:使用通配符忽略表
虽然在master和slave端都能过滤,建议只在slave端配置过滤规则
配置slave端仅同步test数据库
编辑my.cnf文件,添加如下配置
查看slave状态