docker mysql5.7 设置_基于docker的mysql5.7主从配置及 一键安装&设置脚本

这篇博客介绍了如何在Docker环境下设置MySQL5.7的主从配置,包括主库的配置文件设置、数据目录映射、启动主库,以及从库的配置文件、启动和数据同步过程。还提供了一键安装和设置脚本,简化操作流程。
摘要由CSDN通过智能技术生成

建立主库

准备主库的配置文件

docker下的mysql5.7数据库配置文件存在在多个文件下,入口文件是/etc/mysql/my.cnf,其他文件是通过include方式进来。

为了能更直观的查看配置文件,所以主库的配置文件放在/etc/mysql/mysql.conf.d/master.cnf

# vi $PWD/master.cnf

[mysqld]

server-id=100

log-bin=mysql-bin

# vi $PWD/master.sql

CREATE 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

逐行解释:

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

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

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

设置root密码

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

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

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

使用image为mysql的5.7版本

配置主库

进入主库数据库内部

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

docker run --rm -it --name mysql-client mysql:5.7 mysql -h10.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 -h10.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查询容器的ip

master_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 -h127.0.0.1 --port=3339 -uroot -p

一键脚本

这个脚本需要基于docker的环境,请先配置好docker

仅需修改#-------------------------------上面的那部分内容

master_ip= 主库所在主机的真实ip

master_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.97

master_port=5010

master_MYSQL_ROOT_PASSWORD=111111

master_docker_name=mymaster_new

master_root_path=/home/wayne/newnew

# 从库相关设置

slave_ip=10.2.11.97

slave_port=5011

slave_MYSQL_ROOT_PASSWORD=111111

slave_docker_name=myslave_new

slave_root_path=$master_root_path

# 从库使用以下用户去连接主库同步

sync_user=slave

sync_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.sql

CREATE USER '${sync_user}'@'%' IDENTIFIED BY '${sync_pass}';

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO '${sync_user}'@'%';

EOF

cat << EOF > master.cnf

[mysqld]

server-id=100

log-bin=mysql-bin

EOF

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.sql

stop 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-bin

EOF

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

}

master

slave

#reset

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值