MySQL单机配置
拉取&启动容器
docker run -d \
--name mysql \
--privileged=true \
-v /usr/local/mysql/data:/var/lib/mysql \
-v /usr/local/mysql/conf:/etc/mysql/ \
-v /usr/local/mysql/log:/var/log/mysql \
-v /usr/local/mysql/mysql-files:/var/lib/mysql-files/ \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 3306:3306 \
mysql
默认拉取的最新版是mysql8
docker 镜像:https://hub.docker.com/_/mysql?tab=tags
配置mysql
在/usr/local/mysq/conf目录下添加文件:my.cnf
[client]
default-character-set=utf8mb4
[mysqld]
# 指定认证插件
authentication_policy=mysql_native_password
- mysql8服务端默认编码格式:utf8mb4,所以字符编码可以不设置。
- 身份认证插件:在mysql5.7中插件为"mysql_navtive_password",而在mysql8使用的插件是" caching_sha2_password",为了避免客户端连接时出现问题,所以需要设置一下。
重新启动Mysql
docker restart mysql
进入容器
docker exec -it mysql bin/bash
进入容器内的MySQL
mysql -uroot -p123456
MySQL主从配置
MySQL Master
Docker设置
指定宿主机端口为:13306
docker run -d \
--name mysql-master-13306 \
--privileged=true \
-v /usr/local/mysql-master/data:/var/lib/mysql \
-v /usr/local/mysql-master/conf:/etc/mysql/ \
-v /usr/local/mysql-master/log:/var/log/mysql \
-v /usr/local/mysql-master/mysql-files:/var/lib/mysql-files/ \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 13306:3306 \
mysql
配置文件
在/usr/local/mysql-master/conf中添加配置文件:my.cnf
[client]
default-character-set=utf8mb4
[mysqld]
## serverId,局域网内唯一
server_id=01
## 开启二进制日志功能
log-bin=ms-mysql-bin
## 指定不需要同步的数据库名称, 可指定多个
binlog-ignore-db=mysql
binlog-ignore-db=sys
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
## 指定同步的数据库,可指定多个
binlog-do-db=db01
binlog-do-db=db02
## 二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 二进制日志格式(mixed, statement,row)
# statement: 将写操作语句添加到binlog,然后在slave机运行。缺点:语句中有now()时,会造成数据不一致
# row: 记录每一行的改变,然后在slave机更新。缺点:批量更新时,会在slave机执行大量update
# mixed: 有类似now()这种会造成数据不一致的函数时,使用row模式,否则还是使用statement模式。
binlog_format=mixed
## 二进制日志过期清理时间,默认2592000秒(30天),604800秒(7天)
binlog_expire_logs_seconds=604800
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave复制中断
replica_skip_errors=1062
# 指定认证插件
authentication_policy=mysql_native_password
重启Master
docker restart mysql-master-13306
添加备份用户
进入MySQL
CREATE USER 'slave'@'%' identified by 'backup';
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
FLUSH PRIVILEGES;
在mysql5.7中,可使用一条语句来创建用户和赋:GRANT REPLICATION SLAVE ON . TO ‘slave’@’%’ IDENTIFIED BY ‘backup’;
在mysql8中貌似会报错,将创建用户和赋权语句分开就可以。
查看&记录Master状态
mysql> show master status \G;
*************************** 1. row ***************************
File: ms-mysql-bin.000003
Position: 1535
Binlog_Do_DB:
Binlog_Ignore_DB: mysql
Executed_Gtid_Set:
1 row in set (0.01 sec)
重点:
- File: ms-mysql-bin.000003
- Position: 1535
MySQL Slave
Docker设置
指定宿主机端口为:13307
docker run -d \
--name mysql-slave-13307 \
--privileged=true \
-v /usr/local/mysql-slave/data:/var/lib/mysql \
-v /usr/local/mysql-slave/conf:/etc/mysql/ \
-v /usr/local/mysql-slave/log:/var/log/mysql \
-v /usr/local/mysql-slave/mysql-files:/var/lib/mysql-files/ \
-e MYSQL_ROOT_PASSWORD=123456 \
-p 13307:3306 \
mysql
配置文件
在/usr/local/mysql-slave/conf中添加配置文件:my.cnf
[client]
default-character-set=utf8mb4
[mysqld]
## serverId,局域网内唯一
server_id=11
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=ms-mysql-slave11-bin
## 二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 二进制日志格式(mixed, statement,row)
binlog_format=mixed
## 二进制日志过期清理时间,默认2592000秒(30天),604800秒(7天)
binlog_expire_logs_seconds=604800
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave复制中断
replica_skip_errors=1062
## relay_log配置slave的中继日志
relay_log=ms-mysql-relay-bin
## 将复制事件写进自己的二进制日志
log_slave_updates=1
## 设置为只读(super权限用户除外)
read_only=1
# 指定认证插件
authentication_policy=mysql_native_password
重启slave容器
docker restart mysql-slave-13307
查看slave状态
进入slave
show slave status;
此时,通常是啥信息也没有。
将slave连接到master
# 停止slave
stop slave;
# 如果原来做过主从复制,可能还需要执行以下命令
## reset master;
# 连接到master
# master_log_file和 master_log_pos的值参考master机状态查询的结果:
change master to master_host='192.168.10.121', master_user='slave', master_password='backup', master_port=13306,master_log_file='ms-mysql-bin.000003',master_log_pos=1535,master_connect_retry=30;
# 启动slave
start slave;
参数说明:
- master_host: master机IP,也就是宿主机IP
- master_port: master端口,docker配置时,master对外端口
- master_user: 用于同步的账号
- master_password: 用于同步的密码
- master_log_file:指定slave要复制的master数据日志文件
- master_log_pos:指定从哪个位置开始复制
- master_connect_retry: 连接失败时,重试时间间隔,单位:秒
查看slave状态
show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
Master_Host: 192.168.10.121
Master_User: slave
Master_Port: 13306
Connect_Retry: 30
Master_Log_File: ms-mysql-bin.000003
Read_Master_Log_Pos: 828
Relay_Log_File: ms-mysql-relay-bin.000002
Relay_Log_Pos: 327
Relay_Master_Log_File: ms-mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
..........
重点:
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
当两个值都为“Yes”时,说明连接成功,可在Master机上进行数据操作,而后在slave机看到数据同步效果。
其他
如果查询slave 状态时,Slave_IO_Running的值一直是Connecting,有可能是账号密码问题或者权限问题,一般在下面可看到提示,例如:
Last_IO_Error: error connecting to master 'slave@192.168.10.121:13306' - retry-time: 30 retries: 1 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.
根据提示调整即可。