MySQL数据库如何实现主从复制

目录

一、概述

二、基础环境设置

网络对时

防火墙与SELinux

三、配置主从复制

主服务配置

从服务器配置

主从复制常见问题

一、概述

1、master开启二进制日志记录

2、slave开启IO进程,从master中读取二进制日志并写入slave的中继日志

3、slave开启SQL进程,从中继日志中读取二进制日志并进行重放

4、最终,达到slave与master中数据一致的状态,我们称作为主从复制的过程。

二、基础环境设置

网络对时

复制代码
MySQL主
[root@localhost ~]# timedatectl
               Local time: 二 2025-10-14 20:30:03 CST
           Universal time: 二 2025-10-14 12:30:03 UTC
                 RTC time: 二 2025-10-14 12:30:03
                Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

MySQL从
[root@localhost ~]# timedatectl
               Local time: 二 2025-10-14 20:30:05 CST
           Universal time: 二 2025-10-14 12:30:05 UTC
                 RTC time: 二 2025-10-14 12:30:05
                Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

防火墙与SELinux

复制代码
[root@localhost ~]# systemctl disable --now firewalld
[root@localhost ~]# setenforce 0

三、配置主从复制

主服务配置

修改配置文件

复制代码
[root@localhost ~]# vim /etc/my.cnf.d/mysql-server.cnf 
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysql/mysqld.log
pid-file=/run/mysqld/mysqld.pid
log-bin=mysql-bin
binlog_format="statement"
server-id=11
log-slave-updates=true

[root@localhost ~]# systemctl restart mysqld

配置完成后生成二进制日志文件

复制代码
[root@localhost ~]# cd /var/lib/mysql
[root@localhost mysql]# ls
 auto.cnf        ca-key.pem           ib_buffer_pool   mydb               mysql.sock.lock      public_key.pem
 binlog.000001   ca.pem               ibdata1          mysql              mysql_upgrade_info   server-cert.pem
 binlog.000002   client-cert.pem      ibtmp1           mysql-bin.000001   mysqlx.sock          server-key.pem
 binlog.000003   client-key.pem      '#innodb_redo'    mysql-bin.index    mysqlx.sock.lock     sys
 binlog.000004  '#ib_16384_0.dblwr'  '#innodb_temp'    mysql.ibd          performance_schema   undo_001
 binlog.index   '#ib_16384_1.dblwr'   jx               mysql.sock         private_key.pem      undo_002

创建主从同步用户

复制代码
mysql> create user slave@'192.168.150.%' identified by '123.com';
Query OK, 0 rows affected (0.03 sec)

赋予权限

复制代码
mysql> grant all on *.* to 'slave'@'192.168.150.%';
Query OK, 0 rows affected (0.00 sec)

密码插件修改

复制代码
mysql> alter user 'slave'@'192.168.150.%' identified with mysql_native_password by '123.com';
Query OK, 0 rows affected (0.00 sec)

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |      157 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

从服务器配置

修改配置文件

复制代码
[root@localhost ~]# vim /etc/my.cnf.d/mysql-server.cnf 
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysql/mysqld.log
pid-file=/run/mysqld/mysqld.pid
relay-log-index=slave-bin.index
server-id=22

[root@localhost ~]# systemctl restart mysqld

配置从服务器的所属主服务器

复制代码
mysql> change master to master_host='192.168.150.3',master_user='slave',master_password='123.com',master_log_file='mysql-bin.000003',master_log_pos=157;
Query OK, 0 rows affected, 8 warnings (0.01 sec)

启动slave,查看slave状态信息

复制代码
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.15 sec)

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 192.168.150.3
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 157
               Relay_Log_File: localhost-relay-bin.000002
                Relay_Log_Pos: 326
        Relay_Master_Log_File: mysql-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

验证

MySQL主

复制代码
mysql> create database jx1;
Query OK, 1 row affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| jx                 |
| jx1                |
| mydb               |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

MySQL从

复制代码
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| jx1                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

主从复制常见问题

一般情况下,都与网络通信异常有关系。排查防火墙、物理网络连接等。二进制日志文件名或位置错误也会引起IO线程异常。

reset replica;

##用于重置SQL线程对relay log的重放记录!!

相关推荐
wespaul1 小时前
VeapAI 自然语言操作实战|第 05 篇:向量与召回——从知识条目到可检索资产
大数据·数据库·人工智能·milvus
一只鹿鹿鹿6 小时前
政务外网整体设计方案(PPT)
大数据·数据库·web安全·系统安全·流程图·政务
2603_965148116 小时前
社区与学习资源:从入门到精通的API选品学习路径
数据库·人工智能·python·学习·数据挖掘
for_ever_love__6 小时前
MySQL ORDER BY 排序优化:从 Using filesort 到索引有序扫描(含双路 / 单路排序原理)
java·mysql·优化·存储·by·order·filesort
AI砖家6 小时前
安全进入 Agent Loop:2027 年 Coding Agent 的决胜点
数据库·安全·codex·vibecoding
wangqiaowq7 小时前
SQL server C盘空间占满的处理
数据库·sql
文人sec7 小时前
SQL基础入门笔记 | 从零基础到掌握核心查询语句
数据库·笔记·sql
数字新视界7 小时前
机房动环监控提升运维效率
大数据·服务器·数据库·动环监控系统·动力与环境监控系统
SelectDB技术团队7 小时前
冷热分层从建到验:Storage Policy 创建、表级与分区级绑定、SHOW TABLETS 验证的完整命令
大数据·数据库·elasticsearch·搜索引擎·数据分析·apache doris·冷热分层
lambo mercy9 小时前
Day3:结构化输出
java·数据库·oracle