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

相关推荐
e***09613 小时前
SQL 中UPDATE 和 DELETE 语句的深入理解与应用
数据库·sql
程序员小白条14 小时前
你面试时吹过最大的牛是什么?
java·开发语言·数据库·阿里云·面试·职场和发展·毕设
老华带你飞14 小时前
社区养老保障|智慧养老|基于springboot+小程序社区养老保障系统设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·小程序·毕设·社区养老保障
q***697714 小时前
Y20030018基于Java+Springboot+mysql+jsp+layui的家政服务系统的设计与实现 源代码 文档
java·spring boot·mysql
Coding_Doggy14 小时前
链盾shieldchiain | 团队功能、邀请成员、权限修改、移除成员、SpringSecurity、RBAC权限控制
java·开发语言·数据库
凯子坚持 c14 小时前
不用复杂配置!本地 Chat2DB 秒变远程可用,跨网操作数据库就这么简单
数据库
q***656914 小时前
Windows环境下安装Redis并设置Redis开机自启
数据库·windows·redis
q***965814 小时前
Windows版Redis本地后台启动
数据库·windows·redis
q***816414 小时前
【Redis】centos7 systemctl 启动 Redis 失败
数据库·redis·缓存