mysql主从复制
Mysql主从复制
MySQL内建的复制功能是构建大型,高性能应用程序的基础。将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的。复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。
请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突。
复制的原理:
(1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
(2) slave将master的binary log events拷贝到它的中继日志(relay log);
(3) slave重做中继日志中的事件,将更改应用到自己的数据上。
看到了吧. 一台主的. n个从的. 一主多从,而不能一从多主.注意了哈. 那咱们就以 1从1主为例. 下面先配主机
复制配置:
有两台MySQL数据库服务器Master和slave,Master为主服务器,slave为从服务器,初始状态时,Master和slave中的数据信息相同,当Master中的数据发生变化时,slave也跟着发生相应的变化,使得master和slave的数据信息同步,达到备份的目的。
步骤
1:俩台机器都关闭防火墙
service iptables stop
2、修改主服务器
先查找my.cnf的位置 whereis my.cnf
#vi /etc/my.cnf
[mysqld]
#log-bin是指开启二进制操作日志
log-bin=mysql-bin //[必须]启用二进制日志
server-id=222 (不能一样) //[必须]服务器唯一ID,默认是1,可以理解为IP.所以说以ip的最后三位为id比较合适
#需要同步的库. 不写同步所有
binlog-do-db = 需要同步的数据库,多个用逗号隔开
3.修改从服务器
#vi /etc/my.cnf
[mysqld]
server-id=222
relay_log=mysql-relay-bin //## 开启中继日志
log_slave_updates=1 //开启中继日志的复制事件
4、重启两台服务器的mysql
service mysqld restart
5、在主服务器上给从服务器建立帐户
GRANT ALL PRIVILEGES ON *.* TO zhangsan@"%" IDENTIFIED BY "lisi";
6、登录主服务器的mysql,查询master的状态
mysql>show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 | 308 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
注:执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化
7、配置从服务器Slave:
首先先找到从服务器的位置然后:
mysql -uroot -p
mysql>change master to master_host='101.201.239.158',(linux的ip)
master_user='zhangsan',(新建的用户名)
master_password='lisi',(新建的列表)
master_log_file='mysql-bin.000011',(此数为:上边的mysql-bin.000004)
master_log_pos=319; //注意不要断开,308数字前
8、开启主从
Mysql>start slave;
9、检查从服务器复制功能状态:
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.2.222 //主服务器地址
Master_User: mysync //授权帐户名,尽量避免使用root
Master_Port: 3306 //数据库端口,部分版本没有此行
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 600 //#同步读取二进制日志的位置,大于等于Exec_Master_Log_Pos
Relay_Log_File: ddte-relay-bin.000003
Relay_Log_Pos: 251
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes //此状态必须YES
Slave_SQL_Running: Yes //此状态必须YES
......
注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)。
面试题
1主从mysql版本不一致的时候应该怎么办?
答:在高版本的mysql配置文件加
binlog-checksum = none
2 主从延迟的问题
答
1 提高从数据库配置的处理能力
2 mysql-proxy代理中间件
3 修改配置文件 sync-binlog = 1
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现