mysql 5.7 主从复制搭建及原理
1. 主从复制搭建
1.1 环境准备
1 2 3 | OS: Ubuntu 18.04 master: 192.168.0.3 slave: 192.168.0.6 |
1.2 安装依赖包
1 2 3 4 | # Ubuntu apt-get install -y libaio-dev # CentOS yum install -y libaio-devel |
1.3 下载二进制安装包
1 2 | # https://downloads.mysql.com/archives/community/ wget https: //downloads .mysql.com /archives/get/p/23/file/mysql-5 .7.30-linux-glibc2.12-x86_64. tar .gz |
1.4 解压安装包
1 2 | tar zxf mysql-5.7.30-linux-glibc2.12-x86_64. tar .gz -C /usr/local/ mv /usr/local/mysql-5 .7.30-linux-glibc2.12-x86_64 /usr/local/mysql-5 .7.30 |
1.5 创建 mysql 用户和数据、日志目录
1 2 3 | useradd mysql -s /usr/sbin/nologin mkdir -p /data/mysql/3306 /data/mysql/binlog/3306 chown -R mysql:mysql /data/mysql |
1.6 添加环境变量
1 2 | echo "export PATH=/usr/local/mysql-5.7.30/bin:$PATH" > /etc/profile .d /mysql .sh source /etc/profile .d /mysql .sh |
1.7 初始化数据
1 | mysqld --initialize-insecure --basedir= /usr/local/mysql-5 .7.30 --datadir= /data/mysql/3306 --user=mysql |
1.8 简单配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | # master 节点 # cat /etc/my.cnf [mysqld] user=mysql basedir= /usr/local/mysql-5 .7.30 datadir= /data/mysql/3306 server_id=3 port=3306 socket= /tmp/mysql .sock log_bin= /data/mysql/binlog/3306/logbin binlog_format = ROW character_set_server = utf8mb4 character- set -client-handshake = FALSE collation-server = utf8mb4_unicode_ci init_connect = 'SET NAMES utf8mb4' [mysql] socket= /tmp/mysql .sock # mysqld 启动时加载配置文件的顺序 # mysqld --help --verbose | grep my.cnf # /etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf # 指定配置文件, 启动 mysqld /usr/local/mysql-5 .7.30 /bin/mysqld --daemonize --defaults- file = /etc/my .cnf |
1 2 3 4 5 6 7 8 9 10 11 12 | # slave 节点 # cat /etc/my.cnf [mysqld] user=mysql basedir= /usr/local/mysql-5 .7.30 datadir= /data/mysql/3306 server_id=6 port=3306 socket= /tmp/mysql .sock [mysql] socket= /tmp/mysql .sock |
1.9 拷贝启动脚本
1 2 3 4 | cp /usr/local/mysql-5 .7.30 /support-files/mysql .server /etc/init .d /mysqld # 启动脚本中配置两个目录 basedir= /usr/local/mysql-5 .7.30 datadir= /data/mysql/3306 |
1.10 启动 mysqld
1 2 3 4 5 6 7 8 9 | # 第一次启动需用这个命令 /etc/init .d /mysqld start # 后面可以用 systemctl 命令管理 # 启动/重启/停止 mysqld systemctl start /restart/stop mysqld # 查看 mysqld 状态 systemctl status mysqld |
1.11 设置 root 密码
1 2 3 | # --initialize-insecure 这个参数初始化后的 mysql 默认是没有密码的, 为了安全需要设置 root 用户密码 mysqladmin -uroot password # qq.123 |
以上操作就是搭建mysql服务,主从节点都要做。
1.12 检查主库是否开启 binlog
1 2 | # 在主库上操作 mysql -uroot -pqq.123 -e "select @@log_bin;" |
1.13 主库创建复制用户
1 2 3 | # 在主库上操作 mysql -uroot -pqq.123 -e "grant replication slave on *.* to repl@'192.168.0.%' identified by '123';" mysql -uroot -pqq.123 -e "select user,host from mysql.user;" |
1.14 主库备份并恢复到从库
1 2 3 4 5 6 7 8 | # 由于我们的数据库都是新搭建的,这一步可以不用操作 # 如果生产环境主库开启时间比较早已经有业务数据的情况下这一步是要的 # 在主库上操作 mysqldump -uroot -pqq.123 -A --master-data=2 --single-transaction > /tmp/all .sql scp /tmp/all .sql 192.168.0.6: /tmp/ # 在从库上操作 mysql -uroot -pqq.123 < /tmp/all .sql |
1.15 告知从库复制信息
1 2 3 4 5 | # grep "\-- CHANGE MASTER TO" /tmp/all.sql # -- CHANGE MASTER TO MASTER_LOG_FILE='logbin.000001', MASTER_LOG_POS=154; # help change master to change master to master_host= '192.168.0.3' ,master_user= 'repl' ,master_password= '123' ,master_port=3306,master_log_file= 'logbin.000001' ,master_log_pos=154,master_connect_retry=10; |
1.16 从库开启复制线程
1 2 | # 在从库上操作 mysql -uroot -pqq.123 -e "start slave;" |
1.17 验证主从状态
1 2 3 4 | # 在从库上操作 mysql -uroot -pqq.123 -e "show slave status\G" | grep Running: # Slave_IO_Running: Yes # Slave_SQL_Running: Yes |
1.18 如果以上步骤 12-17 中出现问题,可以执行以下命令重置,然后从新配置 12-17 步。
1 2 | # 在从库上操作 mysql -uroot -pqq.123 -e "stop slave; reset slave all;" |
2. 主从复制原理
2.1 主从复制涉及到的资源
-
2.1.1 文件
-
2.1.1.1 主库
binlog
文件 -
2.1.1.2 从库
relay-log.bin
文件,作用是存储接收的 binlog,默认在从库的数据目录下, 手工定义方法:relay_log_basename=/data/mysql/3306/${hostname}-relay-bin -
2.1.1.3 从库
master.info
文件,作用是存放连接主库的信息,已经接收的 binlog 位置点信息。默认存储在从库的数据目录下。手工定义方法:master_info_repository=FILE/TABLE -
2.1.1.4 从库
relay-log.info
文件,作用是记录回放到的relay-log
的位置点, 默认存储在从库的数据目录下。手工定义方法:relay_log_info_repository=FILE/TABLE -
2.1.2 线程
-
2.1.2.1 主库
Binlog_dump_Thread
作用是用来接收从库请求,并且投递 binlog 给从库show processlist;
命令可以查看 -
2.1.2.2 从库
IO 线程
作用是请求 binlog, 接收 binlogSQL 线程
作用是回放 relay-logshow slave status;
命令可以查看
2.2 主从复制原理说明
-
2.2.1 S: change master to ip,port,user,password,binlog 位置信息写入到 master.info 中, 执行
slave start;
(启动 SQL, IO 线程)。 -
2.2.2 S: 连接主库
-
2.2.3 M: 分配 Dump_Thread, 专门和 S_IO 通信。
-
2.2.4 S: IO 线程请求新日志
-
2.2.5 M: Dump_T 接收请求, 截取日志, 返回给 S_IO
-
2.2.6 S: IO 线程接收 binlog, 日志放在 TCP/IP 缓存, 此时网络层返回 ACK 给主库。主库工作完成。
-
2.2.7 S: IO 线程将 binlog 最终写入到 relay-log 中, 并更新 master.info, IO 线程工作结束。
-
2.2.8 S: SQL 线程读 relay-log.info, 获取上次执行到的位置点。
-
2.2.9 S: SQL 线程向后执行新的 relay-log, 再次更新 relay-log.info
小细节:
-
S: relay-log 参数: relay_log_purge=ON, 定期删除应用过的 relay-log
-
M: Dump 线程实时监控主库的 binlog 变化, 如果有新变化, 发信号给从库。
以上就是 mysql 5.7 主从复制搭建的过程及原理的简单说明。搭建过程也不复杂,感兴趣的话自己也动动小手试一下吧。如有问题可以在评论区留言。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY