Skip to content

MySQL主从同步

准备 docker-compose-mysql.yml

yml
version: "3"
services:
  mysql1:
    container_name: mysql1
    image: mysql:latest
    ports:
      - 3301:3306
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 123456

  mysql2:
    container_name: mysql2
    image: mysql:latest
    ports:
      - 3302:3306
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 123456

修改 MySQL 主从配置,并重启

# 默认目录: /etc/mysql/my.cnf
# mysql1 主库
server-id=1               # 服务器ID
log-bin=mysql-bin         # 二进制日志
expire_logs_days=7        # 日志过期清理时间
binlog_format=mixed       # 日志格式 statement、mixed、row
binlog-do-db=notify       # 需要同步的数据库,如果有多个,则再添加一条配置
binlog-do-db=notify1      # 需要同步的数据库,如果有多个,则再添加一条配置
binlog-ignore-db=mysql    # 不同步 mysql 系统数据库

# mysql2 从库
server-id=2
log-bin=mysql-bin
binlog_format=mixed
binlog-do-db=notify
binlog-do-db=notify1
binlog-ignore-db=mysql

登录主库,创建主从同步的用户

# 创建用户
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
# 授权
GRANT ALL PRIVILEGES ON *.* TO 'slave'@'%' WITH GRANT OPTION;
# 更新权限
flush privileges;

查看主库状态

show master status; # 记录 File,如:mysql-bin.000001

进入从库,配置主库

change master to master_host='mysql1',      # 主库地址
master_user='slave',                        # 连接主库的用户名
master_password='123456',                   # 连接主库的密码
master_port=3306,                           # 连接主库的端口
master_log_file='mysql-bin.000001',         # 主库的 binlog (第四步可以查看)
master_log_pos=1;                           # 从XX开始同步主库

开启 slave,查看状态

start slave;

show slave status \G                      # 查看是否有错误,正常情况 lave_IO_Running: Yes,             Slave_SQL_Running: Yes

在主库建表,查看从库是否同步创建

CREATE TABLE `users` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;