1. 下载镜像
使用命令docker pull 拉取镜像到本地(有mysql镜像的可以忽略这一步)
docker pull mysql:5.7
2. 启动并配置数据库
2.1 启动数据库
使用docker run [OPTIONS] mysql:5.7命令启动MySQL
docker run -d --name mysql_master -p 3307:3306 \
-v /usr/local/mysql-master/log:/var/log/mysql \
-v /usr/local/mysql-master/data:/var/lib/mysql \
-v /usr/local/mysql-master/conf:/etc/mysql \
--privileged=true -e MYSQL_ROOT_PASSWORD=root
mysql:5.7
使用命令docker ps 查看一下mysql是否启动成功
2.2 添加配置文件
在宿主机上进入到刚才挂载的mysql conf的目录下,创建my.cnf(配置文件名不一定是my,可以改成其他的,但是cnf不能变),添加如下配置信息,添加完配置信息记得一定要重启mysql容器
# 进入存储mysql配置文件的目录下
cd /usr/local/mysql-master/conf
# 创建配置文件
vim my.cnf
# 在配置文件下添加配置信息
[client]
default_character_set=utf8
[mysqld]
collation_server=utf8_general_ci
character_set_server=utf8
# 保存并退出后,重启mysql容器(mysql_master是我在2.1启动mysql服务时指定的容器名)
docker restart mysql_master
到这一步简单的mysql配置就完成啦,现在可以在其他的电脑上使用navicat工具操作数据库啦。
3. 主从数据库配置
在实际工作中,如果数据量很大的情况下,大部分公司都会使用读写分离的方式使用mysql,使用主从复制原理来实现,主数据库用来做增、删、改操作,从数据库用来做查询操作。接下来就来配置一下主从复制。
3.1 配置主数据库
在第2步的时候我已经安装好了mysql并做了简单的配置,现在在这个基础上做主数据库的配置,在my.cnf配置文件下添加配置信息,并使用命令docker restart mysql_master重启容器。
[client]
default_character_set=utf8
[mysqld]
collation_server=utf8_general_ci
character_set_server=utf8
## 设置server_id,必须要保证这个id在同一个局域网中保持唯一
server_id=501
## 指定不需要同步的数据空间名称(mysql这个数据库是自带的,不需要做主从复制,可以在这里忽略掉)
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
3.2 创建数据同步用户
这一步可选,但是我感觉非常有必要新创建一个用户用来做从数据库访问主数据库,因为root用户权限太大啦。
进入mysql_master容器,并登录mysql:
# 进入mysql容器
docker exec -it mysql_master bash
# 在容器的bash命令行输入登陆mysql命令
mysql -uroot -p
使用如下命令创建用户并授权:
## 创建一个用户slave,并设置密码为123456
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
## 给slave用户授权
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'slave'@'%';
3.3 新建从数据库
参考2.1,启动从数据库
docker run -d --name mysql_slave -p 3308:3306 \
-v /usr/local/mysql-slave/log:/var/log/mysql \
-v /usr/local/mysql-slave/data:/var/lib/mysql \
-v /usr/local/mysql-slave/conf:/etc/mysql \
--privileged=true -e MYSQL_ROOT_PASSWORD=root
mysql:5.7
3.4 配置从数据库
在宿主机上进入到从数据库存储配置文件的目录,并创建配置文件my.cnf,配置玩my.cnf记得要重启从数据库
# 进入从数据库存储配置文件的路径
cd /usr/local/mysql-slave/conf
# 创建my.cnf
vim my.cnf
# 在my.cnf添加下面的配置信息
[client]
default_character_set=utf8
[mysqld]
collation_server=utf8_general_ci
character_set_server=utf8
## 设置server_id,必须要保证这个id在同一个局域网中保持唯一
server_id=502
## 指定不需要同步的数据空间名称(mysql这个数据库是自带的,不需要做主从复制,可以在这里忽略掉)
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其他数据库实例的master时使用
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
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具备super权限的用户除外)
read_only=1
3.5 配置主从复制
可以先进入到主数据库容器中查看主从同步状态
# 进入mysql_master容器
docker exec -it mysql_master bash
# 进入mysql
mysql -uroot -p
# 使用sql命令查看状态
show master status;
# 可以查看到返回的状态信息
+-----------------------+------------+-------------------+--------------------+
| File | Position | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------------+------------+-------------------+--------------------+
| mall-mysql-bin.000001 | 617 | mysql | |
+-----------------------+------------+-------------------+--------------------+
进入从数据库,配置主从复制
# 进入从数据库容器
docker exec -it mysql_slave bash
# 登陆从数据库
mysql -uroot -p
# 配置主从复制
change master to
master_host='192.168.1.12',
master_user='slave',
master_password='123456',
master_port=3307,
master_log_file='mall-mysql-bin.000001',
master_log_pos=617,
master_connect_retry=30;
主从复制命令参数说明:
master_host:主数据库的IP地址
master_port:主数据库的运行端口
master_user:在数据库创建的用于同步数据的用户账号
master_password:用户密码
master_log_file:指定从数据库要复制数据的日志文件,可以通过在主数据库使用show master status命令查看,获取File字段值
master_log_pos:指定从数据库要从哪个位置开始复制数据,可以通过在主数据库使用show master status命令查看,获取Position字段值
master_connect_retry:连接重试时间间隔,单位:秒
在从数据库中查看主从同步状态:
show slave status \G;
# 这是返回结果
********************************* 1. row *********************************
Slave_IO_State:
Master_Host: 192.168.1.12
Master_User: slave
Master_Port: 3307
Connect_Retry: 30
Master_Log_File: mall-mysql-bin.000001
Read_Master_log_Pos: 617
Relay_Log_File: mall-mysql-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mall-mysql-bin.000001
Slave_IO_Running: NO
Slave_SQL_Running: NO
......还有很多就不一一展示了
通过以上的主从同步状态可以看到Slave_IO_Running和Slave_SQL_Running都是NO,说明同步还没有开始呢,现在在从数据库中开启同步
start slave
现在继续使用show slave status命令可以看到Slave_IO_Running和Slave_SQL_Running都是YES了,说明同步已经开始了。
3.6 主从复制测试
到这没有问题说明主从复制配置已经完成了,现在就自己测一测吧,就是在主数据库中创建库、创建表、插入数据、修改数据、删除数据后从数据库都实时同步说明就没有问题了。
注意:在从数据库操作数据,主数据库是不会同步的