docker下的mysql5.7数据库配置文件存在在多个文件下,入口文件是/etc/mysql/my.cnf
,其余文件是经过include方式进来。
为了能更直观的查看配置文件,因此主库的配置文件放在/etc/mysql/mysql.conf.d/master.cnf
mysql
# 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:本身主机可使用网盘路径,这样数据库的文件实际上是存在远端的。sql
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
使用强大的docker,来模拟一个mysql客户端,直接链接已经运行的主库,注意填写真实的主库ip和端口号数据库
docker run --rm -it --name mysql-client mysql:5.7 mysql -h10.2.11.97 --port=5001 -uroot -p
进入后先建立一个用于同步的帐号slave,密码为123456,并赋予可同步权限bash
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 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和端口号code
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;
得到orm
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来充当客户端,运行一次就退出(--rm),进入交互模式(-it),黑体是mysql链接命令 docker run --rm -it --name mysql-client mysql:5.7 mysql -h127.0.0.1 --port=3339 -uroot -pserver
这个脚本须要基于docker的环境,请先配置好docker
仅需修改#-------------------------------
上面的那部份内容ip
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