一、环境准备
- 安装 Docker(已装跳过)
- 规划 IP/端口:
- 主库(Master):端口 3307
- 从库(Slave):端口 3308
- 创建数据目录(持久化)
bash
# 创建主从数据&配置目录
mkdir -p /data/mysql/master/conf
mkdir -p /data/mysql/master/data
mkdir -p /data/mysql/slave/conf
mkdir -p /data/mysql/slave/data
二、配置主库 Master
1. 创建主库配置文件
bash
vi /data/mysql/master/conf/my.cnf
写入以下内容:
ini
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-format=ROW
binlog-do-db=testdb # 需要同步的库(可改)
binlog-ignore-db=mysql # 不同步的库
binlog-ignore-db=sys
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
character-set-server=utf8mb4
default-authentication-plugin=mysql_native_password
2. 启动主库容器
bash
docker run -d \
--name mysql-master \
--restart=always \
-p 3307:3306 \
-v /data/mysql/master/conf/my.cnf:/etc/my.cnf \
-v /data/mysql/master/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0
三、配置从库 Slave
1. 创建从库配置文件
bash
vi /data/mysql/slave/conf/my.cnf
写入:
ini
[mysqld]
server-id=2
relay-log=mysql-relay-bin
read_only=1
character-set-server=utf8mb4
default-authentication-plugin=mysql_native_password
2. 启动从库容器
bash
docker run -d \
--name mysql-slave \
--restart=always \
-p 3308:3306 \
-v /data/mysql/slave/conf/my.cnf:/etc/my.cnf \
-v /data/mysql/slave/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql:8.0
四、主库创建同步账号
进入主库
bash
docker exec -it mysql-master mysql -uroot -p123456
执行SQL(创建同步用户)
sql
CREATE USER 'repl'@'%' IDENTIFIED BY 'Repl@123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
-- 查看主库状态(记录 File 和 Position,后面要用!)
SHOW MASTER STATUS;
示例结果
File: mysql-bin.000003
Position: 669
这两个值必须记下来!
五、从库配置连接主库
进入从库
bash
docker exec -it mysql-slave mysql -uroot -p123456
执行SQL(修改为你自己的信息)
sql
CHANGE MASTER TO
MASTER_HOST='xxxx', # 宿主机IP / 主库容器IP
MASTER_PORT=3306, # 容器内部端口,不是宿主机3307
MASTER_USER='repl',
MASTER_PASSWORD='Repl@123456',
MASTER_LOG_FILE='mysql-bin.000003', # 刚才记录的值
MASTER_LOG_POS=669; # 刚才记录的值
-- 启动同步
START SLAVE;
-- 查看同步状态
SHOW SLAVE STATUS\G
六、验证是否成功
看状态:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
两个都是 Yes 就成功了!
测试同步:
- 主库创建库/表/插入数据
- 从库自动同步
1. 先在主库创建要同步的库
你主库现在 Binlog_Do_DB=testdb,但库里还没有 testdb,所以先建库:
进入主库 MySQL:
bash
docker exec -it mysql-master mysql -uroot -p123456
执行:
sql
CREATE DATABASE testdb;
USE testdb;
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20)
);
INSERT INTO user (name) VALUES ('zhangsan');
INSERT INTO user (name) VALUES ('lisi');
2. 去从库查看是否同步
进入从库 MySQL:
bash
docker exec -it mysql-slave mysql -uroot -p123456
执行:
sql
SHOW DATABASES;
能看到 testdb 就说明库同步了。
再查表数据:
sql
USE testdb;
SELECT * FROM user;
3. 看一眼主从状态(确保正常)
sql
SHOW SLAVE STATUS\G
只要:
Slave_IO_Running: YesSlave_SQL_Running: Yes
就说明主从正常,数据会自动同步。
如果你想同步多个库(比如 testdb、orderdb)
主库 my.cnf 改成这样:
ini
binlog-do-db=testdb
binlog-do-db=orderdb
binlog-ignore-db=mysql
binlog-ignore-db=sys
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
然后重启主库:
bash
docker restart mysql-master
再去主库建 orderdb 测试同步即可。
七、常用命令
bash
# 重启主从
docker restart mysql-master mysql-slave
# 从库停止同步
STOP SLAVE;
RESET SLAVE;
# 查看主库状态
SHOW MASTER STATUS;
# 查看从库状态
SHOW SLAVE STATUS\G;