创建主库
docker run \--name=mysql_1 \-e MYSQL_ROOT_PASSWORD=123456 \-p 3306:3306 \-v mysql_main_data:/var/lib/mysql \--restart unless-stopped \-d \mysql:8.0
进入容器内部
docker exec -it mysql_1 bash
查找配置文件
find / -name my.cnf
复制出主机
docker cp mysql_1:/etc/my.cnf /opt/local/mysql/main
修改配置文件
[mysqld]
server-id = 1 # 主库的 server-id, 确保主从不同
expire_logs_days = 10 # 设置二进制日志过期时间
max_binlog_size = 100M # 二进制日志的最大文件大小
# 允许从库连接主库时进行复制操作
bind-address = 0.0.0.0 # 允许所有地址连接,确保从库可以连接到主库
复制回容器
docker cp /opt/local/mysql/main/my.cnf mysql_1:/etc/my.cnf
创建用户(主从同步)
-- 创建名为 'replication_user' 的新用户,允许从任意主机连接,并设置密码为 'password'
CREATE USER 'replication_user'@'%' IDENTIFIED BY 'password';-- 授予该用户 REPLICATION SLAVE 权限,允许其读取主服务器的二进制日志
-- 该权限对于配置主从复制是必需的
GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%';-- 刷新权限表,使得新用户和权限立即生效
FLUSH PRIVILEGES;
获取主库的二进制日志文件和位置
SHOW MASTER STATUS;
创建从库
docker run \--name=mysql_2 \-e MYSQL_ROOT_PASSWORD=123456 \-p 3307:3306 \-v mysql_slave_data:/var/lib/mysql \--restart unless-stopped \-d \mysql:8.0
进入容器内部
docker exec -it mysql_2 bash
查找配置文件
find / -name my.cnf
复制出主机
docker cp mysql_2:/etc/my.cnf /opt/local/mysql/slave
修改配置文件
[mysqld]
server-id = 2 # 从库的 server-id,确保唯一
复制回容器
docker cp /opt/local/mysql/slave/my.cnf mysql_2:/etc/my.cnf
配置完成
重启两台服务器
docker restart mysql_1
docker restart mysql_2
从库指定主库
根据主库的日志文件配置同步
CHANGE MASTER TOMASTER_HOST = '172.23.4.128', # 主库的 IP 地址MASTER_USER = 'replication_user', # 主库上创建的复制用户MASTER_PORT=3306, #端口MASTER_PASSWORD = 'password', # 复制用户的密码MASTER_LOG_FILE = 'binlog.000004', # 主库的二进制日志文件名MASTER_LOG_POS = 874; # 主库的二进制日志位置
启动从库复制进程
START SLAVE;
检查从库复制状态
SHOW SLAVE STATUS
Slave_IO_Running:指示从服务器是否成功从主服务器读取二进制日志。
Slave_SQL_Running:指示从服务器是否成功应用二进制日志中的事件。
这样就完成了主从同步,主库的任何操作都会被同步到从库