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的时候,才标识同步链接成功
此时,在主库上进行的写操作,都会同步到从数据库上。