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的重放记录!!

相关推荐
oradh4 分钟前
Oracle数据文件的大小和数量的限制总结
数据库·oracle·数据文件大小限制·数据文件数量限制
刘某的Cloud6 分钟前
Galera Cluster部署 mariadb 节点down机,log sequence number恢复
linux·运维·数据库·负载均衡·mariadb·集群·高可用
xiaohaiAIgeo7 分钟前
【2026年】ASHRAE 110与EN 14175通风柜测试标准对比:进口与国产品牌性能差距
java·前端·数据库·科普知识
SelectDB9 分钟前
Apache Doris 4.1 Spill to Disk:避免运行内存密集型查询发生 OOM
数据库
范什么特西1 小时前
redis题目面渣重点
数据库·redis·缓存
TDengine (老段)2 小时前
TDengine taosAdapter — 多协议网关详解
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
Nturmoils2 小时前
SQL Server 迁移到 KingbaseES:一次复杂 BI 查询的性能实测
数据库
今天AI了吗3 小时前
MCP 协议打通 AI 与国产数据库,SQL 调优全流程一站式闭环
数据库·人工智能·sql
灯澜忆梦3 小时前
【MySQL11】进阶篇 | 索引_#3使用规则
数据库·sql·mysql·性能优化
名字还没想好☜3 小时前
Go 的 sync.Cond 实战:用条件变量做等待/通知,比忙轮询省 CPU
开发语言·数据库·后端·golang·go