基于 Docker 部署 Mysql8.0.27_单机_主从复制

单机部署

  1. 通过 dockerhub 或 docker search 查找镜像。
  2. 拉取 mysql 镜像。
docker pull mysql:8.0.27
  1. 创建挂载目录,并赋予权限。
mkdir -p /var/docker_data/mysql/data
mkdir -p /var/docker_data/mysql/conf
mkdir -p /var/docker_data/mysql/log
mkdir -p  /var/docker_data/mysql/mysql-files

chmod -R 770 /var/docker_data/mysql
  1. 启动容器查看 my.cnf 配置文件位置,并复制到宿主机目录下。
# 运行并进入 mysql 容器
docker run --name mysql8 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.27
docker exec -it mysql8 /bin/bash
# 通常 mysql 配置文件在 /etc/mysql 目录下,不同版本 mysql 有所差异
# 找到 my.cnf 文件后,将其复制到宿主机目录下
docker cp mysql8:/etc/mysql/my.cnf conf/my.cnf
# 编辑 my.cnf 文件
vim /var/docker_data/mysql/conf/my.cnf
# 添加如下内容:
[client]
# 客户端默认字符编码
default_character_set=utf8

[mysqld]
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysqld/mysqld.sock
datadir=/var/lib/mysql
# 设置允许数据导出的目录,8 版本以后可能需要指定
# 若此处为 NULL,则 /var/docker_data/mysql/mysql-files 无需创建与挂载
secure-file-priv=/var/lib/mysql-files
# 服务端设置字符编码与规则
collation_server=utf8_general_ci
character_set_server=utf8
# 传输过程当中允许的最大数据包大小
max_allowed_packet=1024M
# 最大连接数
max_connections=1000
# 服务器关闭非交互(客户端)连接之前等待活动的秒数
wait_timeout=2147483
# 服务器关闭交互式(mysql终端)连接前等待活动的秒数
interactive_timeout=2147483
# 连接超时
connect_timeout=20
# 客户端线程最大数量
thread_cache_size=256
# 表名大小写敏感设置(mysql8之后仅初始化时有效):
# 0 表名存储为给定的大小和比较是区分大小写的
# 1 表名存储为小写的,但是比较的时候是不区分大小写
# 2 表名存储为给定的大小写,但是比较的时候是小写的
# Windows下默认值是 1,Mac OS X下默认值是 2
lower_case_table_names=1
# 设置默认时区
default_time-zone='+08:00'

# Custom config should go here
!includedir /etc/mysql/conf.d/

  1. 启动 mysql 容器。
docker run --name mysql -d \
-p 3306:3306 \
-v /root/docker_data/mysql/data:/var/lib/mysql \
-v /root/docker_data/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-v /root/docker_data/mysql/log:/var/log/mysql \
-v /root/docker_data/mysql/mysql-files:/var/lib/mysql-files \
-e MYSQL_ROOT_PASSWORD=123456 \
--restart always \
--privileged=true \
mysql:8.0.27 
  1. 测试 mysql 是否可用。
# 进入容器内部
docker exec -it mysql8 bash
# 进行 mysql 交互式连接
mysql -uroot -p123456
# 查看 mysql 配置的字符编码
SHOW VARIABLES LIKE 'character%';
# 如下图结果,则安装成功

在这里插入图片描述

集群部署

master 部署
  1. 拉取镜像。
  2. 创建挂载目录并授权。
mkdir -p /var/docker_data/mysql_master/data
mkdir -p /var/docker_data/mysql_master/conf
mkdir -p /var/docker_data/mysql_master/log
mkdir -p  /var/docker_data/mysql_master/mysql-files

chmod -R 770 /var/docker_data/mysql_master
  1. 将容器内的 my.cnf 文件拷贝到宿主机,并修改。
# 在单机部署的 my.cnf 配置文件基础上添加:
[mysqld]
log-bin=mysql-bin   #[必须]启用二进制日志
server-id=101       #[必须]服务器唯一ID(唯一即可)
  1. 创建并启动 mysql 容器。
docker run --name mysql_master -d \
-p 33061:3306 \
-v /root/docker_data/mysql/data:/var/lib/mysql \
-v /root/docker_data/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-v /root/docker_data/mysql/log:/var/log/mysql \
-v /root/docker_data/mysql/mysql-files:/var/lib/mysql-files \
-e MYSQL_ROOT_PASSWORD=123456 \
--restart always \
--privileged=true \
mysql:8.0.27 
  1. 进入容器内部,创建用于主从复制的用户,并赋予权限。
# 进入容器内部
docker exec -it mysql_master bash
# 进行 mysql 交互式连接
mysql -uroot -p123456
# 数据同步的用户
# mysql8 版本默认使用 caching_sha2_password 密码插件。
# 需要添加 with mysql_native_password,否则从机会无法验证密码
# 旧版本不需要
create user 'lxl'@'%' identified with mysql_native_password by 'root';
# 授权(REPLICATION SLAVE为允许从主服务器中读取日志权限)
GRANT REPLICATION SLAVE ON *.* to 'lxl'@'%';
# 刷新权限(低版本的MySQL)
flush privileges;
  1. 查看master同步状态。

在这里插入图片描述

slave 部署
  1. 拉取镜像。
  2. 创建挂载目录并授权。
mkdir -p /var/docker_data/mysql_slave/data
mkdir -p /var/docker_data/mysql_slave/conf
mkdir -p /var/docker_data/mysql_slave/log
mkdir -p  /var/docker_data/mysql_slave/mysql-files

chmod -R 770 /var/docker_data/mysql_slave
  1. 将容器内的 my.cnf 文件拷贝到宿主机,并修改。
# 在单机部署的 my.cnf 配置文件基础上添加:
[mysqld]
server-id=102       #[必须]服务器唯一ID(唯一即可)
  1. 创建并启动 mysql 容器。
docker run --name mysql_slave -d \
-p 33062:3306 \
-v /root/docker_data/mysql/data:/var/lib/mysql \
-v /root/docker_data/mysql/conf/my.cnf:/etc/mysql/my.cnf \
-v /root/docker_data/mysql/log:/var/log/mysql \
-v /root/docker_data/mysql/mysql-files:/var/lib/mysql-files \
-e MYSQL_ROOT_PASSWORD=123456 \
--restart always \
--privileged=true \
mysql:8.0.27 
  1. 进入容器内部,执行绑定主数据库命令。
# 进入容器内部
docker exec -it mysql_slave bash
# 进行 mysql 交互式连接
mysql -uroot -p123456
# 设置主管地址与同步主库的日志位置
# mysql5.7
# change master to master_host='192.168.70.88',source_port=3306,master_user='lxl',master_password='root',master_log_file='mysql-bin.000001',master_log_pos=397;
# mysql8.0.27 版本
change replication source to source_host='192.168.70.88',source_port=3306,master_user='lxl',master_password='root', source_log_file='mysql-bin.000001', source_log_pos=397;
# master_host : 主库的IP地址
# master_user : 访问主库进行主从复制的用户名(上面在主库创建的)
# master_password : 访问主库进行主从复制的用户名对应的密码
# master_log_file : 从哪个日志文件开始同步(上述查询master状态中)
# master_log_pos : 从指定日志文件的哪个位置开始同步(上述查询master状态中)
  1. 启动从机同步机制,并查看同步状态。
# 开启从服务器的2个线程服务
start slave;

show slave status;
# 推荐这种,单例查看
show slave status\G; 
# 若如下图所示,则设置成功!

在这里插入图片描述

错误记录

问题 1:

Error on realpath() on '/var/lib/mysql-files' (Error 2 - No such file or directory)

原因:

MYSQL新特性 secure_file_priv 限制读写文件、输出数据的所在目录。
限制了如 LOAD DATA, SELECT … OUTFILE 等一类操作的操作目录。

解决:

# 在 my.cnf 配置文件中添加 secure-file-priv
# 设置允许数据导出的目录,8 版本以后可能需要指定
secure-file-priv=/var/lib/mysql-files

# 同时在启动 mysql8 版本的容器时,添加挂载目录
-v /root/docker_data/mysql/mysql-files:/var/lib/mysql-files 

问题 2:

error connecting to master: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection. Error_code: MY-002061

原因:

mysql8.0 更新了密码加密方式 caching_sha2_password,而 mysql_native_password 作为 MySQL 5.7 的默认密码插件。在此处进行主从复制时,slave 机还是以旧的加密方式去连接 master 机,故报错!

解决:

# 创建主从同步的用户,设置密码时指定以 mysql_native_password 为使用的密码插件。
# 需要添加 with mysql_native_password
create user 'lxl'@'%' identified with mysql_native_password by `root`;

问题 3:

The slave I/O thread stops because master and slave have equal MySQL s erver UUIDs; these UUIDs must be different for replication to work.

原因:

master 与 slave 使用了共同的 server_id/server_uuid 导致。

解决:

# 解决 server_id 相同
[mysqld]
# master 与 slave 必须不同的 server_id 
server-id=102 

# 解决 server_uuid 相同
# 温和方式:在 mysql 客户端中生成 uuid,修改到 auto.cnf 文件中
select uuid();
# 暴力方式:直接删除容器内 /var/lib/mysql/auto.cnf 文件,重启后自动生成新的
# 温和或暴力方式后,都需要重启 mysql (docker 环境重启容器即可)
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值