10 06 2025

mysql主从同步的存在意义


(1) 读写分离,主库负责写数据,从库负责读取数据,这样在主库执行update或其他的写操作导致锁表,程序在从库照样能读出数据来. 同样能减轻主库的负载压力,提升效率


(2) 做数据的热备,主库挂掉后,可以及时切换至从库


(3) 解决了单点问题,防止数据永久丢失


主从同步的流程


(1) 主库db的更新事件(update、insert、delete)被写到binlog


(2)主库创建一个binlog dump thread,把binlog的内容发送到从库


(3)从库启动并发起连接,连接到主库


(4)从库启动之后,创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log


(5)从库启动之后,创建一个sql线程,从relay log里面读取内容,从Exec_Master_Log_Pos位置开始执行读取到的更新事件,将更新内容写入到slave的db


配置


主服务器:


1:编辑 /etc/my.cf 文件


在 [mysqld]
log-bin=mysql-bin  #表示启用二进制日志
server-id=3308     #表示server编号,编号要唯一 从库必须设置为不同的值
binlog-ignore-db=information_schema   #表示同步的时候忽略的数据库
binlog-ignore-db=performance_schema   #表示同步的时候忽略的数据库
binlog-ignore-db=mysql    #表示同步的时候忽略的数据库
binlog-ignore-db=xxx    #表示同步的时候忽略的数据库
binlog-ignore-db=xxx    #表示同步的时候忽略的数据库
#binlog-do-db=test   #指定需要同步的数据库
binlog-do-db=xxxx  #指定需要同步的数据库


2:登陆mysql创建从账户和赋权


mysql -u root -p

#赋予Slave机器有File权限 ip为slave服务器ip slave为用户名 123456为密码
grant FILE on *.* to 'slave'@'127.0.0.1' identified by '123456'; 

#创建slave用户并赋权  slave为用户名 123456为密码
grant replication slave on *.* to 'slave'@'127.0.0.1' identified by '123456'; 

#刷新
flush privileges;  

 

#备注

all privileges:表示将全部权限授予给用户。也可指定具体的权限,如:SELECT、CREATE、DROP等。

on:表示这些权限对哪些数据库和表生效,格式:数据库名.表名,这里写“*”表示全部数据库,全部表。若是我要指定将权限应用到test库的user表

中,能够这么写:test.user

to:将权限授予哪一个用户。格式:”用户名”@”登陆IP或域名”。%表示没有限制,在任何主机均可以登陆。

好比:”yangxin”@”192.168.0.%”,表示yangxin这个用户只能在192.168.0 IP段登陆

identified by:指定用户的登陆密码

with grant option:表示容许用户将本身的权限受权给其它用户linux


#查看主服务器状态
show master status;    #此命令执行后 不要在操作主库数据.

#重启mysql服务
systemctl restart mysqld.service


PS:在上面查看主服务器状态时候,如果显示为空,如下所示:

mysql> show master status;
Empty set (0.00 sec)

原因是因为没有开启日志服务,此时可通过下面的命令查看log_bin选项

show variables like '%log_bin%';

可以看到log_bin是OFF。

解决方法:

在mysql 配置文件 /etc/my.cnf中

[mysqld]下添加:

log-bin=mysql-bin



从服务器


1:文件配置(文件路径地址同 主服务器文件路径地址)

在[mysqld]添加一下数据
[mysqld]
log-bin=mysql-bin
server-id=3309
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
binlog-ignore-db=mysql
replicate-do-db=test
replicate-ignore-db=mysql
log-slave-updates
slave-skip-errors=all
slave-net-timeout=60

 

2:进入从库数据库


#需要更改对应数据,master_log_file为mysql_master中show master status命令后看到的file值, master_log_pos为Position值

change master to master_host='127.0.0.1',master_port=3308,master_user='slave',master_password='123456',master_log_file='mysql-bin.000001', master_log_pos=27509;    


#备注:

#master_host对应主服务器的IP地址。

#master_port对应主服务器的端口(数据库端口)。

#master_log_file对应show master status显示的File列。

#master_log_pos对应show master status显示的Position列。

 

3:重启从服务器


4:查看从服务器状态


show slave status\G;

#结果中 只有 Slave_IO_Running 和 Slave_SQL_Running 都为 YES的时候,才标识同步链接成功


此时,在主库上进行的写操作,都会同步到从数据库上。