概述

主从复制是指将主数据库的DDL和DML操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。

MySQL支持一台主库同时向多台从库进行复制,从库同时也可以作为其他从服务器的主库,实现链状复制。

原理

搭建

我的两台服务器:master:192.168.92.13 ,slave:192.168.92.12

从库的docker安装Mysql语句

[root@localhost ~]# docker run -d \
  --name mysql-slave \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -v /opt/mysql-slave/data:/var/lib/mysql \
  -v /opt/mysql-slave/conf:/etc/mysql/conf.d \
  mysql:8.0  

这里视频博主是 Linux 宿主机上用 yum/apt 安装的 MySQL,我是docker安装的,要修改一些配置

[root@localhost ~]# sudo vi /etc/my.cnf
[root@localhost docker-compose]# cat /etc/my.cnf
[mysqld]
server-id = 1 #为 MySQL 实例指定一个唯一的标识符,用于主从复制环境中区分不同的服务器。
log-bin = mysql-bin #开启二进制日志(binary log),并指定日志文件的基础名称。
bind-address = 0.0.0.0 #指定 MySQL 服务监听的网络地址。0.0.0.0 表示监听所有可用的网络接口(IPv4)
read-only=0
[root@localhost ~]# cd /data/docker-compose/
[root@localhost docker-compose]# vi docker-compose.yml
  # MySQL 数据库服务
  mysql:
    image: mysql:8.0
    container_name: mysql
    restart: always
    environment:
      TZ: Asia/Shanghai
      LANG: en_US.UTF-8
      MYSQL_ROOT_PASSWORD: "123456"
      MYSQL_DATABASE: big_event  # ✅ 已正确添加
    command:
      - --default-authentication-plugin=mysql_native_password
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_general_ci
      - --lower-case-table-names=1
      - --performance-schema=1
      - --slow-query-log=ON           # 开启慢查询日志
      - --long-query-time=1.0         # 慢查询阈值(秒)
      - --log-output=FILE             # 将日志输出到文件
      - --slow-query-log-file=/var/log/mysql/slow.log   # 慢查询日志文件名
    volumes:
      - /data/mysql/data:/var/lib/mysql
      - /data/mysql/init:/docker-entrypoint-initdb.d:ro  #SQL 初始化
      - /data/mysql/logs:/var/log/mysql   # 新增:挂载日志目录,以便宿主机读取 slow.log
      - /etc/my.cnf:/etc/my.cnf:ro
    networks:
      - app-network
    ports:
      - "3306:3306"  # 保留,方便本地数据库工具连接  

#验证配置是否生效
[root@localhost docker-compose]# docker exec mysql mysql -uroot -p123456 -e "SHOW VARIABLES LIKE 'server_id';"
mysql: [Warning] Using a password on the command line interface can be insecure.
Variable_name   Value
server_id       1

我的是docker安装,从库配置:

#1. 创建从库配置文件 /etc/my.cnf
[root@localhost ~]# vi /etc/my.cnf
[mysqld]
server-id = 2
read_only = 1
#2. 启动从库容器并挂载 /etc/my.cnf
docker run -d \
  --name mysql-slave \
  -p 3306:3306 \
  -v /etc/my.cnf:/etc/my.cnf:ro \
  -v /opt/mysql-slave/data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=123456 \
  mysql:8.0

#从库当中执行,登录到mysql:docker exec -it mysql-slave mysql -uroot -p123456
CHANGE REPLICATION SOURCE TO
  SOURCE_HOST='192.168.92.13',
  SOURCE_USER='itcast',
  SOURCE_PASSWORD='123456',
  SOURCE_LOG_FILE='mysql-bin.000001',
  SOURCE_LOG_POS=157;

是按照192.168.92.13的mysql内运行结果来填写的

测试

主库:

mysql> create database db01;
)engine=innodb default charset=utf8mb4;
insert into tb_user(id,name,sex) values(null, 'Tom', '1'),(null, 'Trigger','0'),(null,'Dawn','1');Query OK, 1 row affected (0.02 sec)

mysql> use db01;
Database changed
mysql> create table tb_user(
    -> id int(11) primary key not null auto_increment,
    -> name varchar(50) not null,
    -> sex varchar(1)
    -> )engine=innodb default charset=utf8mb4;
Query OK, 0 rows affected, 1 warning (0.04 sec)

mysql> insert into tb_user(id,name,sex) values(null, 'Tom', '1'),(null, 'Trigger','0'),(null,'Dawn','1');
Query OK, 3 rows affected (0.05 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> show tables
    -> ;
+----------------+
| Tables_in_db01 |
+----------------+
| tb_user        |
+----------------+
1 row in set (0.01 sec)

mysql> select * from tb_user
    -> ;
+----+---------+------+
| id | name    | sex  |
+----+---------+------+
|  1 | Tom     | 1    |
|  2 | Trigger | 0    |
|  3 | Dawn    | 1    |
+----+---------+------+
3 rows in set (0.00 sec)

mysql>

从库为自动刷新:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.04 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| db01               |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

总结

更多推荐