文章目录
- Docker安装MySQL
- 新建容器
- 配置,记得 重启加载配置!
- 测试
- MySQL 主从复制
- 原理
- 新增两个mysql,一主一从
- 在主机上
- 在从机上
- MySQL双主双从
- 必看!
- 创建容器
- 在两个主机上
- 在两个从机上
- 问题
- 解决Navicat无法连接MySQL的问题
- WARNING: IPv4 forwarding is disabled. Networking will not work
- 主从复制不同步
- 不建议使用Docker跑MySQL
- Host '10.244.0.0' is not allowed to connect to this MySQL server
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的问题
Navicat
中ERROR 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 主从同步
最主要的依据就是 binlog
,master 将自己的 binlog 发给 slave,slave重放之后获取和 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服务或者容器-->加载配置