主从复制原理
mysql主从复制原理:首先主库发送更新事件到从库;然后从库读取更新记录,并执行更新记录;最后使得从库的内容与主库保持一致。
为什么要做主从复制
在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运行。
做数据的热备,主库宕机后能够及时替换主库,保证业务可用性。
架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。
实现主从复制的过程:
实验环境:
主数据库 centos7 mysql5.8 ip:172.16.251.38
从数据库 windows server12 mysql5.7 ip:172.16.251.28
准备工作:
1、在两台服务器上分别安装好mysql数据库
开始配置主从:
以下为主库配置:
[mysqld]
##binlog文件名
log_bin = mysql-bin
#MYSQL实例id, 不能重复
server_id = 10
#仅将以下数据库记录binlog, 不记录的则不会同步
binlog_do_db = bd-exam
#以下是推荐配置, 且是默认配置
#sync_binlog = 1
innodb_flush_log_at_trx_commit = 1
#innodb_support_xa = on
#binlog_format = row
1.1、重启mysql服务
systemctl restart mysqld.service;
1.2、主库 创建用作同步数据的用户 slave_ip为从机器的ip
grant replication slave on . to ‘proxycm3’@从数据库ip identified by ‘12345679’;
grant replication slave on *.* to 'proxycm3'@172.16.251.28 identified by '12345679';
1.3、刷新生效
flush privileges;
1.4、锁表,防止表继续写入
flush tables with read lock;
1.5、查看binlog的位置和数值,需要记住,待会要用到
show master status;
1.6、从库配置开启完成,解除锁表
unlock tables;
以下为从库配置:
log_bin = mysql-bin
server_id = 20
# 允许备库将重放事件记录到自身的binlog中
log_slave_updates = 1
# 只读, 也可以不设置
#read_only = 1
# 需要同步的数据库, 逗号分隔(不添加代表同步所有)
replicate-do-db = bd-exam
## 不需要同步的表, 多个需要分别设置
## replicate-ignore-table = dbname.table_name1
## replicate-ignore-table = dbname.table_name2
2.1、重启MySql服务
systemctl restart mysqld.service;
2.2、停止复制
stop slave;
2.3、master_host为主机器ip,msaster_pasword为主机器密码,master_log_file为binlog日志名称,master_log_pos为binlog日志数值
change master to master_host='172.16.251.38',master_user='proxycm3',master_password='12345679',master_log_file='mysql-bin.000005',master_log_pos=657;
2.4、开始复制
start slave;
2.5、判定主从是否配置成功
show slave status\G
查看Slave_IO_Running和Slave_SQL_Running是否为yes
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
关注是否有error信息
Seconds_Behind_Master: 0 #为主从延迟的时间
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
开始在主库创建数据库表,在从库检查是否同步正确完成
登录数据库
mysql -uroot -p****
创建库 create database 库名;
create database mydb11;
进入库 use 库名
use mydb11
创建表
create table user(id int,name varchar(18),sex varchar(5),age int);
插入数据(增数据)
insert into user values(125425,"xm","man",25);
进入从库
登录数据库
mysql -uroot -p****
查现有的数据库
show databases;
如果从库有mydb11库则说明主从同步成功,可进入mydb11库查表