详细介绍MySQL如何开启主从复制实现数据同步
发表于:2025-11-09 作者:千家信息网编辑
千家信息网最后更新 2025年11月09日,主从复制原理主从复制线程主节点 dump Thread:为每个Slave的I/O Thread启动一个dump线程,用于向其发送binary log events从节点 I/O Thread:
千家信息网最后更新 2025年11月09日详细介绍MySQL如何开启主从复制实现数据同步
主从复制原理

主从复制线程
主节点
dump Thread:为每个Slave的I/O Thread启动一个dump线程,用于向其发送binary log events
从节点
I/O Thread:向Master请求二进制日志事件,并保存于中继日志中
SQL Thread:从中继日志中读取日志事件,在本地完成重放
跟复制功能相关的文件
master.info:用于保存slave连接至master时的相关信息,例如账号、密码、服务器地址等
relay-log.info:保存在当前slave节点上已经复制的当前二进制日志和本地replay log日志的对应关系
主从复制特点
异步复制
主从数据不一致比较常见
复制架构
Master/Slave,Master/Master,环状复制
一主多从
从服务器还可以再有从服务器
一从多主:适用于多个不同数据库
复制需要考虑二进制日志时间记录格式
STATEMENT(5.0之前)
ROW(5.1之后,推荐)
MIXED
搭建环境准备
| 主机 | IP地址 | 类型 |
|---|---|---|
| CentOS7.6 | 192.168.36.101 | Master |
| CentOS7.6 | 192.168.36.103 | Slave |
| CentOS7.6 | 192.168.36.104 | Slave |
搭建之前请先确保MySQL软件包已经安装
一主一从
Master节点修改数据库配置文件
[root@Master ~]#cat /etc/my.cnf[mysqld]server_id=1 # 为Master节点设置一个全局唯一的ID号binlog_format=row # 基于行复制的数据库语句log-bin=/data/bin/mysql-bin # 启用二进制日志重新启动数据库服务
[root@Master ~]#service mysqld restartRestarting mysqld (via systemctl): [ OK ]Master节点上创建带有复制权限的用户账号
MariaDB [(none)]> grant replication slave on *.* to repluser@'192.168.36.%' identified by 'centos';Query OK, 0 rows affected (0.00 sec)查看Master的日志位置信息
MariaDB [mysql]> show master logs;+------------------+-----------+| Log_name | File_size |+------------------+-----------+| mysql-bin.000001 | 912372 |+------------------+-----------+1 row in set (0.00 sec)Slave节点修改配置文件
[root@Slave-1 ~]#cat /etc/my.cnf[mysqld]server_id=2 # Slave节点设置全局唯一的ID号read_only # 只读重新启动数据库服务
[root@Slave-1 ~]#systemctl restart mariadb使用Master创建的复制权限的用户账号进行同步
MariaDB [(none)]> CHANGE MASTER TO -> MASTER_HOST='192.168.36.101', -> MASTER_USER='repluser', -> MASTER_PASSWORD='centos', -> MASTER_PORT=3306, -> MASTER_LOG_FILE='mysql-bin.000001', -> MASTER_LOG_POS=245;Query OK, 0 rows affected (0.01 sec)启动Slave线程
MariaDB [(none)]> slave start;Query OK, 0 rows affected (0.00 sec)查看线程是否启动
*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.36.101 Master_User: repluser Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 7389 Relay_Log_File: mariadb-relay-bin.000002 Relay_Log_Pos: 7673 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes # 从节点的IO线程 Slave_SQL_Running: Yes # 从节点的SQL线程.... Seconds_Behind_Master: 0 # Master与SLave服务器差别延迟..... Master_Server_Id: 11 row in set (0.00 sec)检查数据同步情况
MariaDB [(none)]> show databases;+--------------------+| Database |+--------------------+| information_schema || hellodb || mysql || performance_schema || test |+--------------------+5 rows in set (0.00 sec)主节点中查看数据库的线程
MariaDB [hellodb]> show processlist;+----+----------+----------------------+---------+-------------+------+------------------------------------------------------------------| Id | User | Host | db | Command | Time | State+----+----------+----------------------+---------+-------------+------+------------------------------------------------------------------| 3 | root | localhost | hellodb | Query | 0 | NULL| 6 | repluser | 192.168.36.103:51516 | NULL | Binlog Dump | 115 | Master has sent all binlog to slave; waiting for binlog to be upd+----+----------+----------------------+---------+-------------+------+------------------------------------------------------------------2 rows in set (0.00 sec)从节点中查看数据库的线程
MariaDB [(none)]> show processlist;+----+-------------+-----------+------+---------+-------+-----------------------------------------------------------------------------+--| Id | User | Host | db | Command | Time | State | I+----+-------------+-----------+------+---------+-------+-----------------------------------------------------------------------------+--| 4 | root | localhost | NULL | Query | 0 | NULL | s| 5 | system user | | NULL | Connect | 159 | Waiting for master to send event | N| 6 | system user | | NULL | Connect | 29259 | Slave has read all relay log; waiting for the slave I/O thread to update it | N+----+-------------+-----------+------+---------+-------+-----------------------------------------------------------------------------+--3 rows in set (0.00 sec)一主多从:新添加一个从节点
Slave-2 节点安装数据库服务
[root@Slave-2 ~]#yum install -y mariadb-server修改 Slave-2 节点配置文件
[root@Slave-2 ~]#cat /etc/my.cnf[mysqld]server_id=3read_only....重新启动 Slave-2 节点数据库服务
[root@Slave-2 ~]#systemctl restart mariadbSlave-2 节点配置同步信息
MariaDB [(none)]> CHANGE MASTER TO -> MASTER_HOST='192.168.36.101', -> MASTER_USER='repluser', -> MASTER_PASSWORD='centos', -> MASTER_PORT=3306, -> MASTER_LOG_FILE='mysql-bin.000001', -> MASTER_LOG_POS=245;Query OK, 0 rows affected (0.00 sec)启用线程
MariaDB [(none)]> slave start;Query OK, 0 rows affected (0.00 sec)检查同步情况
MariaDB [(none)]> show databases;+--------------------+| Database |+--------------------+| information_schema || hellodb || mysql || performance_schema || test |+--------------------+6 rows in set (0.00 sec)主主复制:两台服务器互为主从
| 主机 | IP地址 | 类型 |
|---|---|---|
| CentOS7.6 | 192.168.36.101 | Master-1 |
| CentOS7.6 | 192.168.36.103 | Master-2 |
Master-1 修改配置文件
[root@Master-1 data]#cat /etc/my.cnf[mysqld]server_id=1log_bin # 启用日志# 为避免ID冲突问题,需要添加下面两行配置:Master-1 为奇数增长,Master-2 为偶数增长auto_increment_offset=1 # 开始点auto_increment_increment=2 # 增长幅度....Master-2 修改配置文件
[root@Master-2 data]#cat /etc/my.cnf[mysqld]server_id=2log_binauto_increment_offset=2auto_increment_increment=2重新启动服务
[root@Master-1 ~]#systemctl restart mariadb[root@Master-2 ~]#systemctl restart mariadbMaster-1 创建权限用户,Master-2 先设置为从服务器进行同步 Master-1 的数据库
MariaDB [(none)]> grant replication slave on *.* to repluser@'192.168.36.%' identified by 'centos';Query OK, 0 rows affected (0.00 sec)Master-2 同步Master-1
MariaDB [(none)]> CHANGE MASTER TO -> MASTER_HOST='192.168.36.101', -> MASTER_USER='repluser', -> MASTER_PASSWORD='centos', -> MASTER_PORT=3306, -> MASTER_LOG_FILE='mysql-bin.000001', -> MASTER_LOG_POS=245;Query OK, 0 rows affected (0.00 sec)启用线程
MariaDB [(none)]> slave start;Query OK, 0 rows affected (0.00 sec)检查同步情况
MariaDB [(none)]> use mysql;Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -ADatabase changedMariaDB [mysql]> select user,password,host from user;+----------+-------------------------------------------+--------------+| user | password | host |+----------+-------------------------------------------+--------------+| root | | localhost || root | | 127.0.0.1 || root | | ::1 || repluser | *128977E278358FF80A246B5046F51043A2B1FCED | 192.168.36.% |+----------+-------------------------------------------+--------------+7 rows in set (0.00 sec)Master-1 向 Master-2 进行同步
MariaDB [mysql]> CHANGE MASTER TO -> MASTER_HOST='192.168.36.103', -> MASTER_USER='repluser', -> MASTER_PASSWORD='centos', -> MASTER_PORT=3306, -> MASTER_LOG_FILE='mysql-bin.000001', -> MASTER_LOG_POS=245;Query OK, 0 rows affected (0.05 sec)Master-1 同步状态
MariaDB [(none)]> show slave status\G;*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.36.103 Master_User: repluser Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 245 Relay_Log_File: mariadb-relay-bin.000003 Relay_Log_Pos: 529 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes.... Master_SSL_Allowed: No.... Master_Server_Id: 21 row in set (0.01 sec)此时Master-1、Master-2 实现主主复制功能
半同步复制
半同步复制的作用是:主服务器宕机后,所有备份服务器主动向同步数据最多的服务器进行数据的同步,以确保数据损失降到最低。
半同步是通过插件功能达成的
Master节点安装semisync_master.so插件
MariaDB [db1]> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';Query OK, 0 rows affected (0.07 sec)启用插件功能
MariaDB [db1]> SET GLOBAL rpl_semi_sync_master_enabled=1;Query OK, 0 rows affected (0.00 sec)设置超时时长
MariaDB [db1]> SET GLOBAL rpl_semi_sync_master_timeout=6000;Query OK, 0 rows affected (0.00 sec)查看Master插件状态
MariaDB [db1]> show variables like '%semi%';+------------------------------------+-------+| Variable_name | Value |+------------------------------------+-------+| rpl_semi_sync_master_enabled | ON || rpl_semi_sync_master_timeout | 6000 || rpl_semi_sync_master_trace_level | 32 || rpl_semi_sync_master_wait_no_slave | ON |+------------------------------------+-------+4 rows in set (0.00 sec)Master修改配置文件并重启数据库服务
[root@Master data]#cat /etc/my.cnf[mysqld]...rpl_semi_sync_master_enabled # 启用插件功能...[root@Master data]#systemctl restart mariadbSlave节点安装semisync_slave.so插件
MariaDB [db1]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';Query OK, 0 rows affected (0.00 sec)启用slave插件功能
MariaDB [db1]> SET GLOBAL rpl_semi_sync_slave_enabled=1;Query OK, 0 rows affected (0.00 sec)Slave修改配置文件并重启数据库服务
[root@Slave data]#cat /etc/my.cnf[mysqld]...rpl_semi_sync_slave_enabled # 启用插件功能...[root@Slave data]#systemctl restart mariadb停止Slave 数据库服务进行测试
MariaDB [(none)]> create database db3;Query OK, 1 row affected (6.00 sec) # 由等待时长可以看出,半同步插件已经起到效果
节点
数据
服务
同步
数据库
日志
线程
插件
服务器
配置
文件
功能
主从
二进制
信息
地址
情况
权限
用户
账号
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全与通信技术学什么
远程服务器批量管理
移动网络安全 ppt
网络安全是属于硬件组吗
互联网时代的科技记者
深圳网络安全法律法规
我的世界时空服务器
互联网网络安全承诺书公司
网络安全员考核证书
怎么连接到远程SQL数据库
用友软件开发好跳槽吗
珠宝软件开发维护
软件开发工作年龄
净网网络安全防范
天谕服务器不一样能加好友吗
网络安全保密检测的内容是什么
电商项目有几个数据库
浦东新区网络技术服务价格查询
网络安全 暗网
网络安全公益漫画
奇幻英雄世界怎么更换服务器
nasa在线数据库
专家指导软件开发
北京汉兴互联网科技
长江师范学院网络安全答题答案
软件开发方案标准模板
图存储模式数据库
tdd数据库安装
网络安全管理员技能大赛决赛
保护网络安全可靠运行的综合技术