概述
主从复制是指将主数据库的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)
总结
