千家信息网

基于docker的mysql5.7主从配置

发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,本篇内容介绍了"基于docker的mysql5.7主从配置"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所
千家信息网最后更新 2025年12月03日基于docker的mysql5.7主从配置

本篇内容介绍了"基于docker的mysql5.7主从配置"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

建立主库

准备主库的配置文件

docker下的mysql5.7数据库配置文件存在在多个文件下,入口文件是/etc/mysql/my.cnf,其他文件是通过include方式进来。
为了能更直观的查看配置文件,所以主库的配置文件放在/etc/mysql/mysql.conf.d/master.cnf

# vi $PWD/master.cnf[mysqld]server-id=100log-bin=mysql-bin# vi $PWD/master.sqlCREATE USER 'slave'@'%' IDENTIFIED BY '123456';GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

准备主库的存放目录(可省略)

不难理解的是mysql数据库里记录的一笔笔数据,最终还是以文件形式存在硬盘中的某几个文件里的
在docker镜像里的mysql5.7环境下,那些重要的数据文件是存在/var/lib/mysql目录下,当然是在容器环境中
所以建议将这些文件从容器内部映射到容器外部,以便更方便的对其进行备份保存。 本列中,我将容器内部的/var/lib/mysql映射到自己主机的master/db目录,这个目录可以不建立,只要说明路径,docker会帮我们建立 ps:自己主机可以使用网盘路径,这样数据库的文件其实是存在远端的。

使用docker运行mysql主库

docker run -p 5001:3306 \--name mymaster \-v $PWD/master.cnf:/etc/mysql/mysql.conf.d/master.cnf \-v $PWD/masterdb:/var/lib/mysql \-v $PWD/master.sql:/docker-entrypoint-initdb.d/master.sql \-e MYSQL_ROOT_PASSWORD=111111 \-e MYSQL_DATABASE=waynedb \-e MYSQL_USER=wayne \-e MYSQL_PASSWORD=wayne \-d mysql:5.7

逐行解释:

  1. 将docker中的3306端口映射到外面的5001端口

  2. 将外面的配置文件映射到内部

  3. 将数据库文件映射到外面某个目录下(可以省略)

  4. 设置root密码

  5. 设置一个初始数据库(可以省略)

  6. 设置用户,默认该用户对上述初始数据库有完全权限(可以省略)

  7. 设置上述用户密码(可以省略)

  8. 使用image为mysql的5.7版本

配置主库

进入主库数据库内部

使用强大的docker,来模拟一个mysql客户端,直接连接已经运行的主库,注意填写真实的主库ip和端口号

docker run --rm -it --name mysql-client mysql:5.7 mysql -h20.2.11.97 --port=5001 -uroot -p

配置同步账号和查看同步信息(废弃)

进入后先创建一个用于同步的账号slave,密码为123456,并赋予可同步权限

CREATE USER 'slave'@'%' IDENTIFIED BY '123456';GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

然后查询状态,为从库同步做准备

show master status\G;

建立从库

准备从库配置文件

# vi $PWD/slave.cnf[mysqld]server-id=101## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用log-bin=mysql-slave-bin## relay_log配置中继日志relay_log=edu-mysql-relay-bin

使用docker运行mysql从库

docker run -p 5002:3306 \--name myslave \-v $PWD/slave.cnf:/etc/mysql/mysql.conf.d/slave.cnf \-v $PWD/slavedb:/var/lib/mysql \-v $PWD/a.sql:/docker-entrypoint-initdb.d/a.sql \-e MYSQL_ROOT_PASSWORD=111111 \-e MYSQL_DATABASE=waynedb \-e MYSQL_USER=wayne \-e MYSQL_PASSWORD=wayne \-d mysql:5.7

配置从库

进入从库数据库内部

使用强大的docker,来模拟一个mysql客户端,直接连接已经运行的主库,注意填写真实的从库ip和端口号

docker run --rm -it --name mysql-client mysql:5.7 mysql -h20.2.11.97 --port=5002 -uroot -p

配置同步

配置从库去连接主库
请注意填写真实的主库ip和端口号
请注意填写真实的master_log_file和master_log_pos,这个是从主库上使用show master status\G;获得

mysql> change master to master_host='10.2.11.97', master_user='slave', master_password='123456', master_port=5001, master_log_file='mysql-bin.000001', master_log_pos= 2830, master_connect_retry=30;解释:master_host :Master的地址,指的是容器的独立ip,可以通过docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称|容器id查询容器的ipmaster_port:Master的端口号,指的是容器的端口号master_user:用于数据同步的用户master_password:用于同步的用户的密码master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒

启动从的复制功能

start slave;

使用docker的mysql来充当客户端

使用docker的mysql来充当客户端,运行一次就退出(--rm),进入交互模式(-it),黑体是mysql连接命令 docker run --rm -it --name mysql-client mysql:5.7 mysql -h227.0.0.1 --port=3339 -uroot -p

一键脚本

这个脚本需要基于docker的环境,请先配置好docker
仅需修改#-------------------------------上面的那部分内容

master_ip= 主库所在主机的真实ipmaster_port= 主库所在主机的监听端口master_MYSQL_ROOT_PASSWORD=主库的root账号密码master_docker_name=主库在docker下的名字master_root_path=主库的数据文件映射到主机的目录

脚本如下:

#!/bin/bash# master_ip和slave_ip如果相同的话,则master_port and slave_port不能相同,master_docker_name and slave_docker_name也不能相同# 设置端口前,注意端口有没有被占用# master_ip和slave_ip要能互相访问# 主库相关设置master_ip=10.2.11.97master_port=5010master_MYSQL_ROOT_PASSWORD=111111master_docker_name=mymaster_newmaster_root_path=/home/wayne/newnew# 从库相关设置slave_ip=10.2.11.97slave_port=5011slave_MYSQL_ROOT_PASSWORD=111111slave_docker_name=myslave_newslave_root_path=$master_root_path# 从库使用以下用户去连接主库同步sync_user=slavesync_pass=123456#-----------------------------------------------------------reset() {        docker rm -f $master_docker_name        docker rm -f $slave_docker_name}master() {        if [ ! -d $master_root_path ]; then                mkdir -p $master_root_path        fi              cd $master_root_path        cat << EOF > master.sqlCREATE USER '${sync_user}'@'%' IDENTIFIED BY '${sync_pass}';GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO '${sync_user}'@'%';EOF        cat << EOF > master.cnf[mysqld]server-id=100log-bin=mysql-binEOF                        docker run -p ${master_port}:3306 \        --name ${master_docker_name} \        -v $PWD/master.cnf:/etc/mysql/mysql.conf.d/master.cnf \        -v $PWD/masterdb:/var/lib/mysql \        -v $PWD/master.sql:/docker-entrypoint-initdb.d/master.sql \        -e MYSQL_ROOT_PASSWORD=${master_MYSQL_ROOT_PASSWORD} \        -e MYSQL_DATABASE=waynedb \        -e MYSQL_USER=wayne \        -e MYSQL_PASSWORD=wayne \        -d mysql:5.7#       rm master.sql#       rm master.cnf}slave() {        i=1        file=`docker run --rm -it --name mysql-client mysql:5.7 mysql -h ${master_ip} --port=${master_port} -uroot -p${master_MYSQL_ROOT_PASSWORD} -e "show master status\G;" 2>/dev/null|grep File |cut -f2 -d : | awk '$1=$1'`        while [ -z $file ]        do                echo $i times sleep 5                sleep 5                i=`expr ${i} + 1`                if [ $i -gt 10 ]; then                        echo "连接主库失败,从库不建立并退出"                        exit 0                fi                file=`docker run --rm -it --name mysql-client mysql:5.7 mysql -h ${master_ip} --port=${master_port} -uroot -p${master_MYSQL_ROOT_PASSWORD} -e "show master status\G;" 2>/dev/null|grep File |cut -f2 -d : | awk '$1=$1'`        done        pos=`docker run --rm -it --name mysql-client mysql:5.7 mysql -h ${master_ip} --port=${master_port} -uroot -p${master_MYSQL_ROOT_PASSWORD} -e "show master status\G;" 2>/dev/null|grep Pos |cut -f2 -d : | awk '$1=$1'`        echo $pos        if [ ! -d $slave_root_path ]; then                mkdir -p $slave_root_path        fi              cd $slave_root_path        cat << EOF > slavetmp.sqlstop slave;change master to master_host='${master_ip}', master_user='${sync_user}', master_password='${sync_pass}', master_port=${master_port}, master_log_file='$file', master_log_pos= $pos, master_connect_retry=30;start slave;EOF        cat -v slavetmp.sql |tr -d "^M" > slave.sql        cat << EOF > slave.cnf[mysqld]server-id=101## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用log-bin=mysql-slave-bin## relay_log配置中继日志relay_log=edu-mysql-relay-binEOF        docker run -p ${slave_port}:3306 \        --name ${slave_docker_name} \        -v $PWD/slave.cnf:/etc/mysql/mysql.conf.d/slave.cnf \        -v $PWD/slavedb:/var/lib/mysql \        -v $PWD/slave.sql:/docker-entrypoint-initdb.d/slave.sql \        -e MYSQL_ROOT_PASSWORD=${slave_MYSQL_ROOT_PASSWORD} \        -e MYSQL_DATABASE=waynedb \        -e MYSQL_USER=wayne \        -e MYSQL_PASSWORD=wayne \        -d mysql:5.7#       rm slave.sql#       rm slavetmp.sql#       rm slave.cnf}masterslave#reset

"基于docker的mysql5.7主从配置"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

文件 配置 数据 容器 同步 数据库 用户 目录 主机 口号 密码 日志 端口 运行 客户 客户端 准备 相同 内容 功能 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 十堰市校园网络安全宣传答题 sqlserver数据库还原 数据库系统及应用第三版视频 连接数据库文件在哪里 可来软件开发有限公司怎么样 河南对口升学计算机网络技术试卷 我的世界服务器第二季 网络安全终端用户应该做哪些 服务器不引导能不能安装系统 艾尔登法环服务器无法连接 山西v5服务器多少钱 数据库报表设计结论 极速智能破解连接服务器 深圳微信扫码点餐软件开发 文件服务器管理器 魅族网络安全法 如何自己搭建ss服务器 沈阳众盟网络技术有限公司 深圳培训软件开发 靠软件开发客户 贵州大数据服务器虚拟主机 考试网网络安全 圆的面积用数据库怎么算 手机自动化控制软件开发 视频监控软件开发公司有哪些 服务器后台没有运行请重新启动 软件开发的六个模型 珍爱网络安全知识 魔兽大脚更新提示找不到服务器 mc服务器中设置管理员
0