分享技术 · 探索极限 · Code is Art
数据库 发布 2016-07-28 1.1k 阅读 约 4 分钟阅读

MySQL 主从复制原理与配置笔记

整理 MySQL/MariaDB 主从复制的核心概念,包括复制类型、binary log、relay log、主从节点配置、复制过滤和常见验证方式。

这篇整理 MySQL/MariaDB 主从复制的核心概念和基础配置。原文是早期收集的长资料,这里保留关键流程和命令,方便后续查阅。

复制概述

MySQL 复制通常由一台主库和一台或多台从库组成。主库将数据变更写入 binary log,从库通过 I/O 线程拉取 binlog 到 relay log,再由 SQL 线程重放 relay log,使从库数据追上主库。

复制类型

  • Statement-Based Replication:基于 SQL 语句复制。
  • Row-Based Replication:基于行变化复制。
  • Mixed Replication:混合模式,按场景自动选择。

主库配置

主库需要开启 binlog,并设置唯一的 server-id

[mysqld]
log-bin=mysql-bin
binlog_format=mixed
server-id=1

从库配置

从库同样需要唯一的 server-id。如果该从库还要继续作为其它从库的上游,可以开启 binlog 和 log_slave_updates

[mysqld]
server-id=10
relay-log=relay-bin
log-bin=mysql-bin
log_slave_updates=1
read_only=on

创建复制账号

CREATE USER 'repl'@'%' IDENTIFIED BY 'strong_password';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;

查看主库 binlog 位置

SHOW MASTER STATUS;

需要记录返回结果里的 FilePosition,从库初始化复制时会用到。

从库启动复制

STOP SLAVE;
CHANGE MASTER TO
    MASTER_HOST = '172.16.31.20',
    MASTER_USER = 'repl',
    MASTER_PASSWORD = 'strong_password',
    MASTER_PORT = 3306,
    MASTER_LOG_FILE = 'mysql-bin.000001',
    MASTER_LOG_POS = 98;
START SLAVE;

检查复制状态

SHOW SLAVE STATUS;

重点关注以下字段:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0
Master_Log_File: mysql-bin.000001
Relay_Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 98
Exec_Master_Log_Pos: 98

复制过滤

可以通过库级或表级过滤限制同步范围,但不建议同时混用白名单和黑名单。

STOP SLAVE;
SET GLOBAL replicate_do_db = 'testdb';
START SLAVE;

SHOW GLOBAL VARIABLES LIKE '%replicat%';

注意事项

  • 主从服务器版本最好一致;版本不一致时,从库版本应高于主库。
  • 生产环境优先考虑 row 或 mixed binlog 格式。
  • 从库建议设置 read_only=on,避免业务误写。
  • 复制账号密码会记录在复制元数据里,要注意权限隔离。

发表回复