主从复制
一、复制概述
复制是指将主数据库的 DDL 和 DML 操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行,从而使得从库和主库的数据保持同步。
MySQL支持一台主库同时向多台从库进行复制, 从库同时也可以作为其他从服务器的主库,实现链状复制。
二、复制原理
MySQL的主从复制原理如下:
- Master主库在事务提交时,会把数据变更记录在二进制日志文件
Binlog
中保存 - 主库推送二进制日志文件中的日志事件到从库的中继日志
Relay Log
中 - slave从库重新执行中继日志中的事件,将数据同步到自己的服务器

三、复制优势
MySQL主从复制的优点主要包含以下三个方面:
-
主库出现问题,可以快速切换到从库提供服务
-
在从库上执行查询操作,在主库上执行更新操作,实现读写分离,降低主库的访问压力
-
在从库上执行备份,以避免备份期间影响主库的服务
四、搭建步骤
首先关闭主从结构中的防火墙:

1. master
1) 在master 的配置文件 /usr/my.cnf
中,配置如下内容:
#服务ID,保证整个集群环境中唯一
server-id=1
#binlog日志的存储路径和文件名
log-bin=/var/lib/mysql/mysqlbin
#是否只读,1代表只读, 0代表读写
read-only=0
#忽略的数据, 指不需要同步的数据库(系统库无需同步)
binlog-ignore-db=mysql
2) 执行完毕之后,需要重启MySQL:
service mysql restart;
3) 创建同步数据的账户,并且进行授权操作:
#授予jaychou用户在所有数据库的所有表上主从复制的权限
grant replication slave on *.* to 'jaychou'@'192.168.192.131' identified by '密码';
#刷新权限列表
flush privileges;
4) 查看master状态:
show master status;

字段含义:
File : 从哪个日志文件开始推送日志文件
Position : 从该日志文件的哪个位置开始推送日志
Binlog_Ignore_DB : 指定不需要同步的数据库
2. slave
1) 在 slave 端配置文件中,配置如下内容:
#mysql服务端ID,唯一
server-id=2
#指定binlog日志
log-bin=/var/lib/mysql/mysqlbin
2) 执行完毕之后,需要重启MySQL:
service mysql restart;
3) 执行如下指令 :
#指定当前从库对应的主库的IP地址,用户名,密码,从哪个日志文件开始的哪个位置开始同步推送日志
change master to master_host= '192.168.192.130', master_user='jaychou', master_password='密码', master_log_file='mysqlbin.000001', master_log_pos=413;
4) 开启同步操作:
start slave; #开启同步
show slave status; #查看状态

5) 如果想要停止同步,执行停止同步操作:
stop slave;
3. 验证同步操作
1) 在主库中创建数据库,创建表,并插入数据 :
create database db01;
user db01;
create table user(
id int(11) not null auto_increment,
name varchar(50) not null,
sex varchar(1),
primary key (id)
)engine=innodb default charset=utf8;
insert into user(id,name,sex) values(null,'Tom','1');
insert into user(id,name,sex) values(null,'Trigger','0');
insert into user(id,name,sex) values(null,'Dawn','1');
2) 在从库中查询数据,进行验证 :
在从库中,可以查看到刚才创建的数据库:

在该数据库中,查询user表中的数据:

也就是说,此时主节点的内容一旦有变更,就会同步到从节点。