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

相关推荐
大白的编程日记.4 小时前
【MySQL】数据库表的CURD(二)
android·数据库·mysql
友善的鸡蛋4 小时前
项目中执行SQL报错oracle.jdbc.OracleDatabaseException: ORA-00942: 表或视图不存在
数据库·sql·oracle
The best are water4 小时前
jeesite mybatis添加拦截器,推送指定表的变更数据到其他数据库
数据库·mybatis
api_180079054604 小时前
异步数据采集实践:用 Python/Node.js 构建高并发淘宝商品 API 调用引擎
大数据·开发语言·数据库·数据挖掘·node.js
怕什么真理无穷5 小时前
mysql server 9.4 windows安装教程(sqlyog 下载)
数据库
Olrookie5 小时前
MySQL运维常用SQL
运维·数据库·sql·mysql·dba
数据库生产实战5 小时前
ORACLE 19C ADG环境 如何快速删除1.8TB的分区表?有哪些注意事项?
数据库·oracle
blackorbird5 小时前
使用 Overpass Turbo 查找监控摄像头
运维·服务器·数据库·windows
IT永勇5 小时前
SQLite数据库基本操作
数据库·sqlite·嵌入式开发·增删改查·关系型数据库