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

相关推荐
爱学习的阿磊9 分钟前
使用Fabric自动化你的部署流程
jvm·数据库·python
枷锁—sha15 分钟前
【SRC】SQL注入快速判定与应对策略(一)
网络·数据库·sql·安全·网络安全·系统安全
惜分飞27 分钟前
ORA-600 kcratr_nab_less_than_odr和ORA-600 4193故障处理--惜分飞
数据库·oracle
chian-ocean28 分钟前
CANN 生态进阶:利用 `profiling-tools` 优化模型性能
数据库·mysql
m0_5500246331 分钟前
持续集成/持续部署(CI/CD) for Python
jvm·数据库·python
AC赳赳老秦32 分钟前
代码生成超越 GPT-4:DeepSeek-V4 编程任务实战与 2026 开发者效率提升指南
数据库·数据仓库·人工智能·科技·rabbitmq·memcache·deepseek
啦啦啦_99991 小时前
Redis-2-queryFormat()方法
数据库·redis·缓存
玄同7652 小时前
SQLite + LLM:大模型应用落地的轻量级数据存储方案
jvm·数据库·人工智能·python·语言模型·sqlite·知识图谱
吾日三省吾码2 小时前
别只会“加索引”了!这 3 个 PostgreSQL 反常识优化,能把性能和成本一起打下来
数据库·postgresql
chian-ocean2 小时前
百万级图文检索实战:`ops-transformer` + 向量数据库构建语义搜索引擎
数据库·搜索引擎·transformer