数据库主从复制学习笔记

发布于:2025-04-11 ⋅ 阅读:(32) ⋅ 点赞:(0)

目录

一、Binlog(Binary Log)

核心特性

核心用途

Binlog 格式(3种类型)

二、主从复制

核心原理

主库(Master)

从库(Slave)

配置步骤(以 MySQL 为例)

1. 主库配置

2. 创建复制账号

3. 从库配置

4. 启动复制

三、GTID

GTID 核心组成

GTID 核心优势

GTID 启用配置

修改 my.cnf

重启 MySQL 生效


一、Binlog(Binary Log)

Binlog(Binary Log)是 MySQL 数据库的核心日志之一,用于记录数据库的逻辑操作。简单来说,它像一台摄像机,忠实记录所有对数据库进行修改的 SQL 语句(如 INSERT/UPDATE/DELETE)或表结构变更(如 CREATE/ALTER)等操作。

核心特性
  1. 逻辑日志

记录的是 SQL 语句的原始逻辑(例如:UPDATE users SET age=20 WHERE id=1;),而非底层数据页的物理修改细节(这是 redo log 的特性)。

  1. 持久化存储

Binlog 以文件形式存储在磁盘中,不会随数据库重启而丢失,生命周期由配置决定(可长期保存)。

  1. 可追溯性

通过解析 binlog 文件,可以精确还原数据库的历史变更过程。

核心用途
  1. 主从复制(Replication)

主库将 binlog 发送给从库,从库重放这些日志以实现数据同步,是 MySQL 高可用架构的基础。

  1. 数据恢复

当误删数据或数据库故障时,可通过 binlog + 定期备份实现时间点恢复(Point-in-Time Recovery)。

Binlog 格式(3种类型)

格式

特点

示例

STATEMENT

记录原始 SQL 语句

UPDATE orders SET create_time = NOW() WHERE status = 'unpaid';

ROW

记录每行数据的变化细节(如修改前后的整行数据

记录每行数据修改前后的完整值(例如:id=1 的用户 balance 从 500 → 400)

MIXED

混合模式,根据 SQL 语句自动选择 STATEMENT 或 ROW 格式

对于 INSERT INTO payments VALUES (UUID(), 100); MIXED 模式会自动切到 ROW 格式,避免主键冲突。

二、主从复制

是数据库系统中实现数据高可用、读写分离、负载均衡的核心技术。其核心思想是通过将主库(Master)的数据变更异步/同步复制到从库(Slave),使从库与主库保持数据一致。

核心原理
主库(Master)
  • 记录所有数据变更到 Binlog(二进制日志)
  • 通过 Binlog Dump 线程 向从库发送日志事件
从库(Slave)
  • I/O 线程:连接主库,接收 Binlog 并写入本地 Relay Log(中继日志)
  • SQL 线程:读取 Relay Log,重放 SQL 事件,实现数据同步
配置步骤(以 MySQL 为例)
1. 主库配置

# my.cnf
[mysqld]
server_id = 1               # 唯一ID
log_bin = mysql-bin         # 开启Binlog
binlog_format = ROW         # 推荐ROW模式
2. 创建复制账号
CREATE USER 'repl'@'%' IDENTIFIED BY 'your_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
3. 从库配置
# my.cnf
[mysqld]
server_id = 2               # 唯一ID,不能与主库冲突
relay_log = mysql-relay-bin # 开启Relay Log
read_only = ON              # 从库设为只读(防误操作)
4. 启动复制
-- 从库执行
CHANGE MASTER TO
  MASTER_HOST = '主库IP',
  MASTER_USER = 'repl',
  MASTER_PASSWORD = 'your_password',
  MASTER_LOG_FILE = 'mysql-bin.000001', -- 主库当前Binlog文件名
  MASTER_LOG_POS = 154;                 -- 主库当前Binlog位置

START SLAVE;  -- 启动复制

三、GTID

GTID(全局事务标识符)是 MySQL 主从复制中用于唯一标识事务的机制,它解决了传统复制依赖 binlog 文件名和位置的痛点。

GTID 核心组成

每个 GTID 格式为: GTID = source_id:transaction_id

    • source_id:产生事务的服务器唯一标识(通常是 server_uuid)
    • transaction_id:事务序列号,单调递增(如 1-100 表示第1到第100个事务)

示例: 3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5 表示该事务来自 server_uuid 为 3E11FA47... 的服务器,事务序列号为1到5。

GTID 核心优势

传统复制痛点

GTID 解决方案

主从切换需手动指定 binlog 位置

自动追踪事务,无需关心文件位置

难以确定事务是否在所有从库执行

通过 GTID 集合全局唯一标识事务状态

级联复制拓扑管理复杂

事务路径清晰,支持任意拓扑结构

GTID 启用配置
修改 my.cnf
   [mysqld]
   gtid_mode = ON                 # 启用 GTID
   enforce_gtid_consistency = ON  # 强制 GTID 一致性
   log_bin = mysql-bin            # 必须开启 binlog
   server_id = 1                  # 服务器唯一 ID
重启 MySQL 生效
   systemctl restart mysqld