Docker之mysql的主从复制

Mysql的安装
拉取镜像
docker search mysql#查询镜像
docker pull mysql:5.7#拉取版本号为5.7的镜像

1.png

运行镜像创建容器
docker run -p 3307:3307 -e MYSQL_ROOT_PASSWORD=(密码) -d mysql:5.7#运行镜像创建容器
docker exec -it <容器ID> /bin/bash#进入容器
mysql -uroot -p#进入mysql

1.png2.png

插入数据
create database w;#建库w
use w;#使用库w
create table a(id int,name varchar(20));#建表a
insert into a values(1,'zs');#插入数据
select * from a;#查看a表中所有数据

1.png

插入中文问题

这其实是MySQL都会遇到的一个问题,中文编码问题,若不解决,那么在数据有需要中文时,都会报错,只需要更改编码就可以。
先在docker容器里的MySQL容器查看:

show variables like 'character%';#查看默认的编码格式

1.png
可以看到大多数都是拉丁文,接下来我们将其改成utf8格式就好。

在mysql下输入以下命令:
set <Variable_name>='utf8';

1.png
这种办法就需要我们一个一个更改设定。

更改配置文件:

我们需要用到容器数据卷这类的知识,在开始容器创建时就做出映射卷管理:

docker run -d -p 3307:3307 --privileged=true -v /w/mysql/log/:/var/log/mysql -v /w/mysql/data/:/var/lib/mysql -v /w/mysql/conf/:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=(密码) --name mysql mysql:5.7

我们通过容器卷同步给mysql容器实例的配置文件,在宿主机指定目录下做如下操作:

cd /w/mysql/conf/#进入宿主机数据卷目录
vim my.cnf#创建配置文件
#添加如下内容
[client]
default_character_set=utf8
[mysqld]
collation_server=utf8_general_ci
character_set_server=utf8
cat my.cnf#查看是否添加成功

重新启动容器实例再重新进入即可成功。
1.png
1.png

我个人较为建议先更改好编码格式后再建库建表插入数据,这样更加方便有效率。

MySQL主从复制
原理

MySQL的主从复制和MySQL的读写分离两者有必然的联系,首先要部署主从复制,只有主从复制完成了,才能在此基础上进行数据的读写分离
MySQL支持的复制类型

  • 语句的复制:在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。但是必须开启二进制日志功能;
  • 行的复制:把改变的内容复制过去,而不是把命令在从服务器上执行一遍;
  • 混合类型的复制:默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制;
搭建

新建主服务器容器实例:

docker run -p 3307:3306 --name mysql-master -v /mydata/mysql-master/log:/var/log/mysql -v /mydata/mysql-master/data:/var/lib/mysql -v /mydata/mysql-master/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

进入/mydata/mysql-master/conf目录下新建my.cnf

vi my.cnf
[mysqld]
#设置server_id,同一局域网中需要唯一
server_id=101
#指定不需要同步的数据库名称
binlog-ignore-db=mysql
#开启二进制日志功能
log-bin=mall-mysql-bin
#设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
#设置使用的二进制日志格式( mixed,statement,row)
binlog_format=mixed
#二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
#跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062

修改完配置后重启master实例

docker restart mysql-master

进入mysql-master容器

docker exec -it mysql-master /bin/bash
mysql -u root -proot

master容器实例内创建数据同步用户

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

新建从服务器容器实例

docker run -p 3308:3306 --name mysql-slave -v /mydata/mysql-slave/log:/var/log/mysql -v /mydata/mysql-slave/data:/var/lib/mysql -v /mydata/mysql-slave/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7

进入/mydata/mysql-slave/conf目录下新建my.cnf

vi my.cnf
[mysqld]
#设置server_id,同一局域网中需要唯一
server_id=102
#指定不需要同步的数据库名称
binlog-ignore-db=mysql
#开启二进制日志功能,以备Slave作为其他数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin
#设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
#设置使用的二进制日志格式( mixed,statement,row)
binlog_format=mixed
#二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
#跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
#如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
#relay_log配置中继日志
relay_log=mall-mysql-relay-bin
#log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
#slave设置为只读(具有super权限的用户除外)
read_only=1

修改完配置后重启slave实例

docker restart mysql-slave

在主数据库中查看主从同步状态

show master status;

1.png
进入mysql-slave容器

docker exec -it mysql-slave /bin/bash
mysql -uroot -proot

在从数据库中配置主从复制,注意 master_log_file 和 master_log_pos 的值要与Master查询的一致,

change master to master_host='192.168.244.188',master_user='slave',
master_password='123',master_port=3308, 
master_log_file='mall-mysql-bin.000001', master_log_pos=617,
master_connect_retry=30;

在从数据库中查看主从同步状态

show slave status \G;

在从数据库中开启主从同步

start slave;

查看从数据库状态发现已经同步

show slave status \G;

1.png

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我不是少爷.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值