MySQL 主从同步(复制)实战

MySQL 2025-09-15 已阅 13 次

首先得有2台服务器,其中一台上的MySQL为主库,另外一台上的MySQL为从库

主库操作

1、修改配置

# Master - 主从同步设置,需要开记binlog
server-id = 1 # 要唯一
# bin log 位置
log_bin = /var/lib/mysql/mysql-bin

重启 MySQL 让配置生效

2、创建用于从库登陆的用户

# 创建用户
CREATE USER 'slave1'@'x.x.x.x' IDENTIFIED BY 'password';
# 赋予用户slave1复制权限
GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'x.x.x.x';

x.x.x.x 是从库服务器IP
slave1 可以改成自己喜欢的名称
password 设置你喜欢的登陆密码

3、将数据导出

  • 锁表-只读

    FLUSH TABLES WITH READ LOCK; 
  • 显示 master 信息

    SHOW MASTER STATUS; 

    status.png

记住红色位置的内容,从库需要用到

  • 将数据导出

    mysqldump -u root -p --all-databases --master-data > dbdump.sql
  • 解开表(可读可写)

    UNLOCK TABLES; 

4、将 dbdump.sql 文件发送到从库的主机上

以你喜欢的方式就行,能传到从库的主机就行

从库操作

1、修改配置

# slave - 主从同步设置,需要开记binlog
server-id = 2 # 要唯一
# binlog 位置
log_bin = /var/lib/mysql/mysql-bin

重启 MySQL 让配置生效

2、导入从主库第三步导出的数据

mysql -u root -p < /home/ubuntu/dbdump.sql

3、建立与主库的连接

  • 停止复制状态

    STOP SLAVE; 
  • 与主库建立连接,从而同步

    CHANGE MASTER TO
    MASTER_HOST='b.b.b.b',
    MASTER_PORT=8036,
    MASTER_USER='slave1',
    MASTER_PASSWORD='sync900966',
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=3784;
    

MASTER_HOST - 主库服务器IP
MASTER_USER - 主库操作第二步设置的用户
MASTER_PASSWORD - 主库操作第二步设置的密码
MASTER_LOG_FILE - 主库操作第三步 master 信息 - File
MASTER_LOG_POS - 主库操作第三步 master 信息 - Position

至此不出意数据应该可以同步了

主从复制有三种同步方式

  • 异步复制:主库执行完事务后,不等待从同库确认,这是默认的
  • 半异步复制:主库执行完事务后,至少等到有一个从同库确认
  • 同步复制:主库执行完事务后,等到所有从同库确认

问题排查

  1. 不要使用域名,我刚开始使用域名,结果同步不了
  2. 在主库授予登陆IP要和从库IP一致
  3. server-id 从库与主库不能相同且要唯一

可能用到命令

  • 查看从服务器(Slave)复制状态

    SHOW SLAVE STATUS;

如果正常的话
Slave_IO_State: Waiting for master to send event,如果有错误,也会在这个字段提示
xxx_xx_Running 这几个字段正常是 Yes

  • 查看主服务器(Master)状态

    SHOW MASTER STATUS;
  • 停止复制线程

    STOP SLAVE;
  • 启动复制线程

    START SLAVE;
  • 显示线程列表

    SHOW PROCESSLIST;

本文由 Harvey 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论