1.拉取MySQL镜像
docker pull mysql:5.7
2.master主服务器的搭建
# 1. 创建 /mydata/mysql-master/conf 卷目录
mkdir -p /mydata/mysql-master/conf
# 2.新建主服务器容器实例3307
docker run -d -p 3307:3306 --privileged=true -v /mydata/mysql-master/log:/var/log/mysql -v /mydata/mysql-master/data:/var/lib/mysql -v /mydata/mysql-master/conf:/etc/mysql/conf.d -v /mydata/mysql-master/mysql-files:/var/lib/mysql-files -e MYSQL_ROOT_PASSWORD=root --name mysql-master mysql:5.7
# 3.并新建my.cnf
cd /mydata/mysql-master/conf
touch my.cnf
vim my.cnf (配置文件内容在下面)
# 2.3修改完配置后重启master实例
docker restart mysql-master
# 2.4 进去mysql-master容器
docker exec -it mysql-master /bin/bash
对mysql的一些操作如下:
use mysql;
update user set host='%' where user='root';
Grant all privileges on root.* to 'root'@'%'; //执行两次
alter user root identified with mysql_native_password by '123456';
FLUSH PRIVILEGES;
show variables like 'character%'; // 查看字符编码
# 2.5 master容器实例内创建数据同步用户
// 创建用户名为 slave,后面从库需要连接到这个用户上,后面的密码和数据库密码没有关系
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
// 授权表示可以从任意 ip 使用此用户名和密码连接到主数据库
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* to 'slave'@'%';
// 刷新配置
flush privileges;
// 查看日志文件 这个可以不执行
show master status;
my.cnf文件内容如下:
[client]
default_character_set=utf8
[mysql]
default-character-set=utf8mb4
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall-mysql-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 = utf8_general_ci
character_set_server = utf8
##解决 mysql 2059 错误,没有此问题的不加
default_authentication_plugin=mysql_native_password
3. slave从服务器的搭建
# 1. 创建 /mydata/mysql-slave/conf 卷目录
mkdir -p /mydata/mysql-slave/conf
# 2.新建主服务器容器实例3308
docker run -d -p 3308:3306 --privileged=true -v /mydata/mysql-slave/log:/var/log/mysql -v /mydata/mysql-slave/data:/var/lib/mysql -v /mydata/mysql-slave/conf:/etc/mysql/conf.d -v /mydata/mysql-slave/mysql-files:/var/lib/mysql-files -e MYSQL_ROOT_PASSWORD=root --name mysql-slave mysql:5.7
# 3.并新建my.cnf
cd /mydata/mysql-slave/conf
touch my.cnf
vim my.cnf (配置文件内容在下面)
# 2.3修改完配置后重启slave实例
docker restart mysql-slave
# 2.4 进去mysql-slave容器
docker exec -it mysql-slave /bin/bash
mysql-slave的my.cn配置文件内容如下:
[client]
default_character_set=utf8
[mysql]
default-character-set=utf8mb4
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-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=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1
## 设置编码
collation_server = utf8_general_ci
character_set_server = utf8
##解决 mysql 2059 错误,没有此问题的不加
default_authentication_plugin=mysql_native_password
4.配置主从复制
Master :
//进入主服务器查看状态
docker exec -it mysql-master /bin/bash
mysql -uroot -p
show master status;
//查看端口
show global variables like 'port';
//查看容器内IP地址
cat /etc/hosts
//查看容器外IP地址
docker ps -a
docker inspect 容器名
SLAVE:
#从服务器操作:配置主从连接关系
change master to master_host='主机ip', master_user='slave', master_password='root', master_port=3307, master_log_file='主机信息获取', master_log_pos= 820, master_connect_retry=30;
其中:
CHANGE MASTER TO MASTER_HOST=’主机的IP地址’,
MASTER_USER=’slave'(刚刚配置的用户名),
MASTER_PASSWORD=’123456′(刚刚授权的密码),
Master_port=3310 (Master主机开放的端口,)
MASTER_LOG_FILE=’mysql-bin.具体数字’,MASTER_LOG_POS=具体值(之前的Position);
eg:
change master to master_host='192.168.101.65', master_user='slave', master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.000001', master_log_pos= 934, master_connect_retry=30;
//开启主从复制,查看从数据库状态
show slave status \G;
// 开启主从同步
start slave;
//停止主从同步
stop slave;
主从复制验证:
master:
docker exec -it mysql-master /bin/bash
mysql -uroot -p
create database testdb;
slave:
docker exec -it mysql-slave /bin/bash
mysql -uroot -p
show databases;如果存在testdb,说明成功了