基于日志的主从复制(binlog)的原理:

1、Master将数据改变记录到二进制日志(binary log)中,也就是配置文件log-bin指定的文件,这些记录叫做二进制日志事件(binary log events);

2、slave通过I/O线程读取Master中的binary log events并写入到它的中继日志(relay log);

3、slave重做中继日志中的事件,把中继日志中的事件信息一条条的在本地执行一次,完成数据在本地的存储,从而实现将改变反映到它自己的数据(数据重放);

spring mysql数据库主从 mysql主从binlog原理_mysql

主从配置注意点:

1、主从服务器操作系统版本和位数要一致。

2、master和slave数据库的版本要一致。

3、master和slave数据库中的数据要一致。

4、master开启二进制日志,master和slave的server_id在局域网内必须唯一。

主从配置的简要步骤:

1、master上的配置:

修改数据库配置文件,指明server_id,开启二进制日志(log-bin)-> 启动数据库,查看当前是哪个日志,position号是多少 -> 登录数据库,授权数据复制用户(IP地址为从机IP地址,如果是双向主从,这里还需要授权本机的IP地址) -> 备份数据库(加锁和解锁) -> 将备份数据传到slave上 -> 启动数据库

2、slave上的配置:

修改数据库配置文件,指明server_id(如果是双向主从,也要开启二进制日志log-bin) -> 启动数据库还原备份 -> 查看当前是哪个日志,position号是多少(单向主从不需要,双向主从需要) -> 指明master的地址、用户、密码等信息 -> 开启同步,查看状态

单向主从环境的搭建:

修改master的配置文件 /usr/local/mysql/my.cnf

[root@localhost ~]# vim /usr/local/mysql/my.cnf
# 在[mysqld]中添加一下配置项
# 设置server_id,局域网内必须唯一
server_id=128
# 复制过滤,需要备份的数据库
binlog-do-db=demo
# 复制过滤,不需要备份的数据库
binlog-ignore-db=mysql
# 开启二进制日志功能,名字自取,slave基于此log-bin做replication
log-bin=mysql-bin
# 为每个session分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
# 主从复制格式(mixed、statement、row)
binlog_format=mixed
# 二进制日志自动删除/过期的天数,默认为0,表示不自动删除
expire_logs_days=7
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断(如1062错误时指一些主键重复)
slave_skip_errors=1062

重启master数据库服务,登录数据库,创建专门用于数据同步用户,并授予相应的权限

[root@localhost ~]# service mysql restart 
# 进入mysql,创建数据同步用户,并授予相应的权限( 用户为repl,密码为123456,host为网段为192.168.189.x内的IP地址 )
mysql > grant replication slave , replication client on *.* to 'repl'@'192.168.189.%' identified by '123456';
# 刷新授权表信息
mysql > flush privileges;
# 查看position号(从机上需要用到这个position号和现在的日志文件)
mysql > show master status;

修改slave的配置文件 /usr/local/mysql/my.cnf

[root@localhost ~]# vim /usr/local/mysql/my.cnf
# 在[ mysqld ]中添加如下配置项:
server_id=129
# 配置slave端的中继日志
relay_log=mysql-relay-bin
# 防止改变数据
read_only=1
# 重启MySQL服务
[root@localhost ~]# service mysql restart

# 登录slave数据库,添加master的IP、端口、同步用户、密码、position号、读取哪一个日志文件等信息

mysql > change master to master_host='192.168.189.128',  // master服务器IP
master_user='repl',    // 用于同步数据的用户,在master中授权的用户
master_password='123456',     //  同步数据用户的密码
master_port=3306,     // master数据库端口
master_log_file='mysql-bin.000001',      // master产生的日志文件
master_log_pos=596,    // 前面查看master信息获取的position号,表示从哪个位置开始读
master_connect_retry=30;    // 重试建立连接的时间间隔
(注意master_log_file和master_log_pos是通过在master服务器上show master status查出来的)
# 开启主从同步,查看主从同步状态。
mysql > start slave;
mysql > show slave status \G
# 主要看到以下两个参数,如果同时为yes表示主从同步正常
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
# 可以查看Last_IO_Error或Last_SQL_Error查看同步失败的原因。
# 可以查看master和slave上线程的状态:
# 在master上看到slave的I/O线程创建的连接:
master : mysql > show processlist \G
slave:mysql > show processlist \G