【基于Docker安装Mysql主从复制(一主一从)详细步骤】

一、前期准备工作

1.1 创建mysql数据映射目录

  • mnt
    • mysql
      • master
        • data
        • conf
        • log
      • slave
        • data
        • conf
        • log

1.2 分别配置主库和从库的my.cnf文件

主库:
进入/mnt/mysql/master/conf目录下新建my.cnf文件
vim my.cnf 内容

[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mysql-master-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
#设置字符编码
collation_server=utf8mb4_unicode_ci
character_set_server=utf8mb4

从库:
进入/mnt/mysql/slave/conf目录下新建my.cnf文件
vim my.cnf 内容

[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mysql-slave1-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1
#设置字符编码
collation_server=utf8mb4_unicode_ci
character_set_server=utf8mb4

二、Docker安装Mysql5.7(一主一从)

2.1 拉取mysql5.7镜像

#拉取镜像
docker pull mysql:5.7
#查看镜像
docker images

在这里插入图片描述

2.2 启动master主数据库容器

docker run -d -p 3301:3306 --name mysql-master \
-v /mnt/mysql/master/log:/var/log/mysql \
-v /mnt/mysql/master/data:/var/lib/mysql \
-v /mnt/mysql/master/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=root  \
--privileged=true mysql:5.7

进入mysql-master容器

#进入容器命令
docker exec -it mysql-master /bin/bash
#登录mysql
mysql -uroot -p
(输入root用户密码:root)
#创建数据同步用户
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
#赋予slave用户权限
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
#查看主数据库中主从同步状态
show master status;

在这里插入图片描述

2.3 启动slave从数据库容器

docker run -d -p 3302:3306 --name mysql-slave \
-v /mnt/mysql/slave/log:/var/log/mysql \
-v /mnt/mysql/slave/data:/var/lib/mysql \
-v /mnt/mysql/slave/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=root  \
--privileged=true mysql:5.7

进入mysql-slave容器

#进入容器命令
docker exec -it mysql-slave /bin/bash
#登录mysql
mysql -uroot -p
(输入root用户密码:root)
#在从数据库中配置主从复制
change master to master_host='192.168.0.128', master_user='slave', master_password='123456', master_port=3301, master_log_file='mysql-master-bin.000003', master_log_pos=617, master_connect_retry=30;
#查看从数据库中主从同步状态
show slave status \G;

配置参数说明:
master_host:主数据库的IP地址;
master_port:主数据库的运行端口;
master_user:在主数据库创建的用于同步数据的用户账号;
master_password:在主数据库创建的用于同步数据的用户密码;
master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
master_connect_retry:连接失败重试的时间间隔,单位为秒。

在这里插入图片描述
slave从数据库开启主从复制

#开启主从复制
start slave;
#查看主从同步状态
show slave status \G;

在这里插入图片描述

三、主从复制测试

3.1 进入master主数据库

#进入容器命令
docker exec -it mysql-master /bin/bash
#登录mysql
mysql -uroot -p
(输入root用户密码:root)
#创建测试数据库test
create database test;
use test;
#创建用户表
create table user(id int,name varchar(20));
#插入数据
insert into user values(1,'zhangsan');
#查询数据
select * from user;

在这里插入图片描述

3.2 通过Navicat查看slave从数据库情况

测试连接成功~
在这里插入图片描述
查询test数据库user表情况(明显刚才在主数据库插入的数据已经同步过来了)
在这里插入图片描述
测试一下在从库中插入数据,主库会有啥情况(明显可以看出从库中自行操作的数据是不会同步到主库中的)
从库数据
在这里插入图片描述
主库数据
在这里插入图片描述
测试删除主库的某表的所有记录,观察从库数据情况(明显看出从库的表数据也一并被删除完了)
在这里插入图片描述
在这里插入图片描述

四 、总结

mysql数据库主从复制的原来是:主数据库通过生成binlog操作日志,创建一个数据同步用户账号,从数据库通过登录该数据同步账号读取主数据库的binlog操作日志来更新自身的数据记录,从而实现主从复制同步数据的操作。

猜你喜欢

转载自blog.csdn.net/weixin_43755251/article/details/127531582