当前位置:首页 > 技术 > 正文内容

MySQL主从复制配置与原理

访客 技术 2026年9月3日 1

MySQL主从复制是一种实现数据冗余和读写分离的技术,通过将主数据库的数据变更同步到从数据库,可以提高系统的可用性和性能。

一、主从复制工作机制

主服务器会将所有的数据修改操作记录在其二进制日志文件(例如 mysql-bin.xxx)中。从服务器上的 I/O 线程会连接到主服务器,并使用指定的账户下载这些二进制日志。下载的内容会被写入从服务器本地的中继日志(relay-log)文件中。随后,从服务器上的 SQL 线程会读取中继日志,并执行其中的 SQL 语句,从而实现数据同步。

二、主从复制的目的

  • 提高系统可用性: 当主服务器发生故障时,可以将从服务器提升为主服务器,减少服务中断时间。
  • 提升读性能: 将读请求分发到从服务器,可以减轻主服务器的压力,并可能获得更快的响应时间。

三、主从复制的主要作用

  1. 作为数据备份的一种手段,类似于热备份。
  2. 实现读写分离,平衡数据库的负载。

四、环境准备

假设主从服务器的 IP 地址如下:

  • 主服务器:192.168.1.35 (已安装 MySQL)
  • 从服务器:192.168.1.36 (已安装 MySQL)

五、配置步骤

1. 主从服务器配置文件修改

编辑主从服务器的 /etc/my.cnf 文件:

# 主服务器配置
[mysqld]
log-bin=mysql-bin        # 启用二进制日志
server-id=35             # 服务器唯一ID,通常取IP的最后一段

# 从服务器配置
[mysqld]
log-bin=mysql-bin        # 启用二进制日志
server-id=36             # 服务器唯一ID,通常取IP的最后一段

修改完成后,需要重启主从服务器的 MySQL 服务:

# 在主从服务器上执行
/etc/init.d/mysqld restart

六、主服务器操作

1. 创建同步用户并授权

在主服务器上执行以下 MySQL 命令:

-- 登录 MySQL
mysql -uroot -p

-- 创建用于复制的用户并授权
-- 替换 '123456' 为您期望的密码
grant replication slave on *.* to 'repl_user'@'192.168.1.36' identified by '123456';
flush privileges;
exit;

2. 获取主库状态信息

在主服务器上执行以下命令,记录下 FilePosition 的值,这些信息在配置从服务器时需要用到:

mysql -uroot -p

show master status;
-- 示例输出:
-- +------------------+----------+--------------+------------------+-------------------+
-- | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
-- +------------------+----------+--------------+------------------+-------------------+
-- | mysql-bin.000002 |      550 |              |                  |                   |
-- +------------------+----------+--------------+------------------+-------------------+

七、从服务器操作

1. 配置主库连接信息并启动复制

在从服务器上执行以下 MySQL 命令,替换相应的主库信息和记录下的日志文件及位置:

-- 登录 MySQL
mysql -uroot -p

-- 配置主库信息
-- 'repl_user' 和 '123456' 需与主服务器上创建的用户和密码一致
-- 'mysql-bin.000002' 和 550 需替换为从主服务器获取的值
change master to 
    master_host='192.168.1.35',
    master_user='repl_user',
    master_password='123456',
    master_log_file='mysql-bin.000002',
    master_log_pos=550;

-- 启动 Slave 线程
start slave;
exit;

2. 检查复制状态

在从服务器上执行以下命令,检查主从复制是否正常运行:

mysql -uroot -p

show slave status\G

检查输出结果中的 Slave_IO_RunningSlave_SQL_Running 状态。两者都应显示为 YesSeconds_Behind_Master 应尽量接近 0。

如果出现错误,请仔细检查日志和配置。例如,以下是正常状态的部分输出:

...
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
            ...
                Seconds_Behind_Master: 0
...

八、处理已有数据的主从复制

如果主服务器已有数据,在配置主从复制时,需要确保数据的一致性:

  1. 主服务器锁定表: 在主服务器上执行 flush tables with read lock; 以阻止新的写入操作。
  2. 获取主库状态: 再次执行 show master status;,记录下当前的 FilePosition
  3. 数据迁移: 将主服务器的数据文件(建议先使用 tar 压缩)备份并迁移到从服务器。
  4. 主服务器解锁: 在主服务器上执行 unlock tables;
  5. 从服务器配置: 按照前面的步骤配置从服务器,使用记录下的主库状态信息。

九、验证主从复制

在主服务器上执行数据操作,然后检查从服务器是否同步了这些变更:

1. 主服务器上的测试操作

-- 在主服务器上创建数据库和表
mysql -uroot -p
mysql> create database test_replication;
mysql> use test_replication;
mysql> CREATE TABLE IF NOT EXISTS `sample_data`(
    ->    `id` INT UNSIGNED AUTO_INCREMENT,
    ->    `name` VARCHAR(100) NOT NULL,
    ->    `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    ->    PRIMARY KEY (`id`)
    -> )ENGINE=InnoDB DEFAULT CHARSET=utf8;
mysql> INSERT INTO `sample_data` (name) VALUES ('Test Record 1');

2. 从服务器上的验证

登录到从服务器,检查 test_replication 数据库、sample_data 表以及插入的数据是否存在。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。