Mysql的安装
拉取镜像
docker search mysql#查询镜像
docker pull mysql:5.7#拉取版本号为5.7的镜像
运行镜像创建容器
docker run -p 3307:3307 -e MYSQL_ROOT_PASSWORD=(密码) -d mysql:5.7#运行镜像创建容器
docker exec -it <容器ID> /bin/bash#进入容器
mysql -uroot -p#进入mysql
插入数据
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表中所有数据
插入中文问题
这其实是MySQL都会遇到的一个问题,中文编码问题,若不解决,那么在数据有需要中文时,都会报错,只需要更改编码就可以。
先在docker容器里的MySQL容器查看:
show variables like 'character%';#查看默认的编码格式
可以看到大多数都是拉丁文,接下来我们将其改成utf8格式就好。
在mysql下输入以下命令:
set <Variable_name>='utf8';
这种办法就需要我们一个一个更改设定。
更改配置文件:
我们需要用到容器数据卷这类的知识,在开始容器创建时就做出映射卷管理:
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#查看是否添加成功
重新启动容器实例再重新进入即可成功。
我个人较为建议先更改好编码格式后再建库建表插入数据,这样更加方便有效率。
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;
进入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;