Docker安装MySQL、MySQL主从复制、双主双从

Docker安装MySQL

新建容器

docker run -d  -p 3306:3306 --privileged=true  -v  /app/mysql/log:/var/log/mysql   -v  /app/mysql/data:/var/lib/mysql   -v  /app/mysql/conf:/etc/mysql/conf.d   -e MYSQL_ROOT_PASSWORD=123456  --name=mysql   mysql:8.0

#查看是否启动
docker ps 

配置,记得 重启加载配置

#  my.cnf配置
cd /app/mysql/conf
vim my.cnf #主机的my.cnf

my.cnf文件

[client]
default_character_set=utf8mb4
[mysqld]
collation_server = utf8mb4_general_ci
character_set_server = utf8mb4
[mysql]
#设置mysql客户端默认字符集
default_character_set=utf8mb4

记得重启加载配置

docker restart mysql  # 重启容器加载配置

docker exec -it mysql /bin/bash
mysql -uroot -p123456
show variables like '%character%'; #查看字符集编码

在这里插入图片描述

测试

在这里插入图片描述
在这里插入图片描述

完成配置

MySQL 主从复制

原理

复制三步骤

  • 步骤1 Master 将写操作记录到二进制日志 binlog 。
  • 步骤2 Slave 将 Master 的binary log events拷贝到它的中继日志 relay log
  • 步骤3 Slave 重做中继日志中的事件将改变应用到自己的数据库中。 MySQL复制是异步的且串行化
    的而且重启后从 接入点 开始复制

新增两个mysql,一主一从

#主机
docker run -d  -p 3307:3306 --privileged=true  -v  /app/mysql/mysql-master/log:/var/log/mysql   -v  /app/mysql/mysql-master/data:/var/lib/mysql   -v  /app/mysql/mysql-master/conf:/etc/mysql/conf.d   -e MYSQL_ROOT_PASSWORD=123456  --name=mysql-master   mysql:8.0
#从机
docker run -d  -p 3308:3306 --privileged=true  -v  /app/mysql/mysql-slave/log:/var/log/mysql   -v  /app/mysql/mysql-slave/data:/var/lib/mysql   -v  /app/mysql/mysql-slave/conf:/etc/mysql/conf.d   -e MYSQL_ROOT_PASSWORD=123456  --name=mysql-slave   mysql:8.0
#查看是否启动
docker ps 

在主机上

#  my.cnf配置
cd /app/mysql/mysql-master/conf/
vim my.cnf #主机的my.cnf

my.cnf文件

#主机
[mysqld]
## 设置 server_id同一局域网中需要唯一
server_id=101
binlog-ignore-db=mysql 
log-bin=mysql-master-bin 
binlog_format=mixed 
expire_logs_days=7 
slave_skip_errors=1062
[mysql]
#设置mysql客户端默认字符集
default_character_set=utf8mb4

授权、改密码,记得重启容器加载配置

docker restart mysql-master #重启容器一定要

docker exec -it mysql-master /bin/bash #进入主机
mysql -uroot -p #登陆不了就用 mysql -uroot
#密码123456
use mysql #先进入这个库
CREATE USER  'slave'@'%'  IDENTIFIED WITH mysql_native_password BY '123456';#创建一个slave用户用于主从复制

# ALTER USER 'root'@'%'  IDENTIFIED WITH mysql_native_password BY '123456'; 修改root用户密码
# 若修改密码报错执行以下两条命令再进行修改
use mysql;
select user,host from user; #查看主机和用户,看看是否有两个root有的话删掉一个host='localhost'的root
delete from  user where user='root' and host='localhost';
update user set host='%' where user='root';

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%'; #为这个用户授权:主从复制权限
show master status;

docker inspect mysql-master | grep IPA # mysql-master为容器名容器Id也可以

docker restart mysql-master #重启容器一定要

在这里插入图片描述
在这里插入图片描述

在从机上

# my.cnf配置
cd /app/mysql/mysql-slave/conf/
vim my.cnf #从机的my.cnf

my.cnf文件

#从机
[mysqld]
## 设置 server_id同一局域网中需要唯一
server_id=102
binlog-ignore-db=mysql 
log-bin=mysql-slave-bin 
binlog_format=mixed 
## 二进制日志过期清理时间。默认值为 0表示不自动清理。
expire_logs_days=7 
## 跳过主从复制中遇到的所有错误或指定类型的错误避免 slave 端复制中断。
## 如1062 错误是指一些主键重复1032 错误是因为主从数据库数据不一致
slave_skip_errors=1062 
read_only=1 #设为只读
relay_log=relay-bin-log #中继日志名称从机必须要配置
[mysql]
#设置mysql客户端默认字符集
default_character_set=utf8mb4

开启主从复制,先重启容器加载配置

docker restart mysql-slave  # 重启加载配置一定要

docker exec  -it mysql-slave  /bin/bash #进入主机
# 如果 之前设置过主从,进行重置
stop slave;
stop slave; #先stop slave; 再 stop slave;

# host也可以是ip端口也可以是容器暴露的端口
change master to master_host='172.17.0.2', 
master_user='slave', 
master_password='123456', master_port=3306, 
master_log_file='mysql-master-bin.000002', 
master_log_pos=1371, master_connect_retry=30;

在这里插入图片描述

mysql -uroot -p123456 #登录从机的mysql
reset slave; # 重置主从复制应该先stop slave;
start slave; #开启主从复制
stop slave; #停止主从
show slave status\G; #查看状态

在这里插入图片描述

完成

MySQL双主双从

必看

在这里插入图片描述

主主 复制也是一样等同于 主从复制在两个master都配置主从互相复制

创建容器

docker run -d  -p 3301:3306 --privileged=true  -v  /app/mysql/mysql-master1/log:/var/log/mysql   -v  /app/mysql/mysql-master1/data:/var/lib/mysql   -v  /app/mysql/mysql-master1/conf:/etc/mysql/conf.d   -e MYSQL_ROOT_PASSWORD=123456  --name=mysql-master1   mysql:8.0

docker run -d  -p 3302:3306 --privileged=true  -v  /app/mysql/mysql-master2/log:/var/log/mysql   -v  /app/mysql/mysql-master2/data:/var/lib/mysql   -v  /app/mysql/mysql-master2/conf:/etc/mysql/conf.d   -e MYSQL_ROOT_PASSWORD=123456  --name=mysql-master2   mysql:8.0

docker run -d  -p 3303:3306 --privileged=true  -v  /app/mysql/mysql-slave1/log:/var/log/mysql   -v  /app/mysql/mysql-slave1/data:/var/lib/mysql   -v  /app/mysql/mysql-slave1/conf:/etc/mysql/conf.d   -e MYSQL_ROOT_PASSWORD=123456  --name=mysql-slave1   mysql:8.0

docker run -d  -p 3304:3306 --privileged=true  -v  /app/mysql/mysql-slave2/log:/var/log/mysql   -v  /app/mysql/mysql-slave2/data:/var/lib/mysql   -v  /app/mysql/mysql-slave2/conf:/etc/mysql/conf.d   -e MYSQL_ROOT_PASSWORD=123456  --name=mysql-slave2   mysql:8.0

#查看是否启动
docker ps 

在两个主机上

主机1

cd /app/mysql/mysql-master1/conf/
vim my.cnf

my.cnf文件

[mysqld]
## 设置 server_id同一局域网中需要唯一
server_id=1
binlog-ignore-db=mysql 
log-bin=mysql-master1-bin 
binlog_format=mixed 
expire_logs_days=7 
slave_skip_errors=1062
[mysql]
#设置mysql客户端默认字符集
default_character_set=utf8mb4

主机2

cd /app/mysql/mysql-master2/conf/
vim my.cnf

my.cnf文件

[mysqld]
## 设置 server_id同一局域网中需要唯一
server_id=2
binlog-ignore-db=mysql 
log-bin=mysql-master2-bin 
binlog_format=mixed 
expire_logs_days=7 
slave_skip_errors=1062
[mysql]
#设置mysql客户端默认字符集
default_character_set=utf8mb4

两个主机都要授权、改密码,记得重启容器加载配置

docker restart mysql-master1 #重启容器一定要

docker exec  -it  mysql-master1  /bin/bash #进入主机
mysql -uroot -p #登陆不了就用 mysql -uroot
#密码123456
use mysql #先进入这个库
CREATE USER  'slave'@'%'  IDENTIFIED WITH mysql_native_password BY '123456';#创建一个slave用户用于主从复制

# ALTER USER 'root'@'%'  IDENTIFIED WITH mysql_native_password BY '123456'; 修改root用户密码
# 若修改密码报错执行以下两条命令再进行修改
use mysql;
select user,host from user; #查看主机和用户,看看 是否有 两个root有的话删掉一个host='localhost'的root
delete from  user where user='root' and host='localhost';
update user set host='%' where user='root';

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%'; #为这个用户授权:主从复制权限
show master status;

docker inspect mysql-master | grep IPA # mysql-master为容器名容器Id也可以

docker restart mysql-master1 #重启容器一定要

在这里插入图片描述
在这里插入图片描述

在两个从机上

从机1

cd /app/mysql/mysql-slave1/conf
vim my.cnf

my.cnf文件

[mysqld]
server_id=3
binlog-ignore-db=mysql 
log-bin=mysql-slave1-bin 
binlog_format=mixed 
expire_logs_days=7 
slave_skip_errors=1062 
read_only=1 
relay_log=relay-bin-log1 
[mysql]
#设置mysql客户端默认字符集
default_character_set=utf8mb4

从机2

cd /app/mysql/mysql-slave2/conf
vim my.cnf

my.cnf文件

[mysqld]
server_id=4
binlog-ignore-db=mysql 
log-bin=mysql-slave2-bin 
binlog_format=mixed 
expire_logs_days=7 
slave_skip_errors=1062 
read_only=1 
relay_log=relay-bin-log2 
[mysql]
#设置mysql客户端默认字符集
default_character_set=utf8mb4

开启主从复制,先重启容器加载配置

docker restart mysql-slave1 # 重启加载配置一定要

# host也可以是ip端口也可以是容器暴露的端口
# 如果之前设置过主从,进行重置
stop   slave;
reset  slave; # 重置主从复制应该先stop slave;
# host 也可以是ip端口也可以是 容器暴露的端口

change master to master_host='172.17.0.2', 
master_user='slave', 
master_password='123456', master_port=3306, 
master_log_file='mysql-master-bin.000002', 
master_log_pos=1371, master_connect_retry=30;

在这里插入图片描述

mysql -uroot -p123456 #登录从机的mysql
reset slave; #重置主从复制应该先stop slave;
start slave; #开启主从复制
stop slave; #停止主从
show slave status\G; #查看状态

在这里插入图片描述

完成配置!

问题

解决Navicat无法连接MySQL的问题

NavicatERROR 2003

报错提示
第一种 2003 - Can’t connect to MySQL server on ‘localhost’(10061 “Unknown error”)本地连接数据库出错
或者第二种2003-cant connection to mysql server on ‘IP’10061 unknown error服务器远程连接出错未知错误
或者第三种Can’t connect to MySQL server on "IP地址’(10038)服务器远程连接数据库出错防火墙出错

检查配置
在这里插入图片描述

use mysql;
select user,host from user; # 查看主机

在这里插入图片描述

如果出现以下情况,需要删除host='localhost'的root用户

否则报错

ERROR 1062 (23000): Duplicate entry ‘%-root’ for key 'user.PRIMARY’select user,host from user;

在这里插入图片描述

delete from  user where user='root' and host='localhost';

将root的主机改为%

use mysql;
update user set  host='%' where user='root';
flush privileges; #刷新权限
select user,host from user;

在这里插入图片描述

解决问题
在这里插入图片描述

WARNING: IPv4 forwarding is disabled. Networking will not work

启动docker容器后提示 WARNING: IPv4 forwarding is disabled. Networking will not work.
在这里插入图片描述

此错误虽然不影响主从同步的搭建但是如果想从远程客户端通过以下方式连接docker中的MySQL则没法连接

C:\Users\administrator>mysql -h 192.168.111.101 -P 3306 -u root -p

解决方案

#修改配置文件
vim /usr/lib/sysctl.d/00-system.conf
#追加
net.ipv4.ip_forward=1
#接着重启网络
systemctl restart network

解决方案

stop slave; #停止
reset slave; # 重置主从复制应该先stop slave;
show master status; #在主机查看一边 
#在从机再次执行一次有变化的需要修改
change master to master_host='172.17.0.2', 
				master_user='slave', 
				master_password='123456', master_port=3306, 
				master_log_file='mysql-master-bin.000002', 
				master_log_pos=1371, master_connect_retry=30;
				
start slave; #开启主从复制
show slave status \G;

在这里插入图片描述

主从复制不同步

我们知道MySQL 主从同步最主要的依据就是 binlogmaster 将自己的 binlog 发给 slaveslave重放之后获取和 master 一致的数据。

那我们就来看看 master 生成的 binlog 是啥样子。

我们按照事件的方式来看一下 binlog命令格式如下

show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];

这个表示 以事件的方式来查看 binlog这里涉及到几个参数

  • log_name可以指定要查看的 binlog 日志文件名如果不指定的话表示查看最早的 binlog 文件。
  • pos从哪个 pos 点开始查看凡是 binlog 记录下来的操作都有一个 pos 点这个其实就是相当于我们可以指定从哪个操作开始查看日志如果不指定的话就是从该 binlog 的开头开始查看。
  • offset这是是偏移量不指定默认就是 0
  • row_count查看多少行记录不指定就是查看所有

问题解决
binlog_format 设置为 ROW 来解决这个问题
在这里插入图片描述
之后重新配置主从完成

不建议使用Docker跑MySQL

Host ‘10.244.0.0’ is not allowed to connect to this MySQL server

# 编辑 my.cnf
# 在 [mysqld]下添加 skip-grant-tables -->跳过密码-->保存即可
mysql -u root -p 
    # 不用输入密码直接回车出现Enter Password 也一样直接回车即可登陆成功
update user set authentication_string=password('xxxxx') where user='root';
# ALTER USER 'root'@'%'  IDENTIFIED WITH mysql_native_password BY '123456'; mysql8.0-->修改root用户密码
# 若修改密码报错执行以下两条命令再进行修改
use mysql;
select user,host from user; #查看主机和用户,看看是否有两个root有的话 删掉一个host='localhost'的root
delete from  user where user='root' and host='localhost';
update user set host='%' where user='root';
flush privileges;
# 登陆成功-->就删除skip-grant-tables,重启 mysql服务或者容器-->加载配置
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: mysqlDocker