docker-mysql主从复制

MySQL主从复制

安装docker和拉取镜像不再赘述

一.主服务器

1.新建主服务器容器-3307

(这里设置的密码可能不生效,若未生效请看问题中的2)

复制代码
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=123456 \
-d mysql

2.编辑MySQL配置文件

进入/mydata/mysql-master/conf目录下新建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
secure_file_priv=/var/lib/mysql

3.修改完配置后重启master实例

复制代码
docker restart mysql-master

4.进入mysql-master容器

复制代码
docker exec -it mysql-master /bin/bash

mysql -u root -p

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

复制代码
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

二.从服务器

1.新建从服务器容器-3308

复制代码
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=123456 \
-d mysql

2.编辑配置文件

进入/mydata/mysql-slave/conf目录下新建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
secure_file_priv=/var/lib/mysql

3.修改完配置后重启slave实例

复制代码
docker restart mysql-slave

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

复制代码
show master status;

5.进入mysql-slave容器

复制代码
docker exec -it mysql-slave /bin/bash
mysql -u root -p

6.在从数据库中配置主从复制

复制代码
change master to master_host='宿主机ip', master_user='slave', master_password='123456', 
master_port=3307, master_log_file='mall-mysql-bin.000002', master_log_pos=156, master_connect_retry=30;

主从复制命令参数说明

复制代码
master_host:主数据库的IP地址;
master_port:主数据库的运行端口;
master_user:在主数据库创建的用于同步数据的用户账号;
master_password:在主数据库创建的用于同步数据的用户密码;
master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
master_connect_retry:连接失败重试的时间间隔,单位为秒。

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

复制代码
show slave status \G;

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

复制代码
start slave;

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

10.主从复制测试

10.1主机新建库-使用库-新建表-插入数据
复制代码
create database testdemo;
use testdemo;
create table demo(id int, name varchar(20));
insert into demo values(1,'li1'),(2,'li2');
10.2从机使用库-查看记录
复制代码
use testdemo;
select * from demo;

三.遇到的问题

1.修改配置文件后容器无法重新启动

(未加secure_file_priv=/var/lib/mysql),报错如下(docker logs containerid 查看报错日志)

解决方法:

在配置文件中加上secure_file_priv=/var/lib/mysql即可

2.设置密码未生效无法登录

MySQL指定密码未生成,mysql -uroot -p 直接回车即可登录

3.修改密码

MySQL8.0不支持password,修改用户名密码用下面这种方式

复制代码
alter user 'root'@'localhost' identified by '111';
相关推荐
神仙别闹14 分钟前
基于NodeJS+Vue+MySQL实现一个在线编程笔试平台
前端·vue.js·mysql
RDCJM40 分钟前
【MySQL】在MySQL中STR_TO_DATE()以及其他用于日期和时间的转换
android·数据库·mysql
加成BUFF1 小时前
解决MySQL/MariaDB忘记root密码:完整重置教程(XAMPP/Windows版)
数据库·mysql·xampp
dreamread1 小时前
完美解决phpstudy安装后mysql无法启动
数据库·mysql
小江的记录本1 小时前
【SQL】多表关系与冷热数据(全维度知识体系)
数据库·sql·mysql·数据库开发·数据库架构
zjjsctcdl2 小时前
【prometheus】监控MySQL并实现可视化
数据库·mysql·prometheus
阿波罗尼亚2 小时前
MySQL 存储引擎 FEDERATED
数据库·mysql
lym5400508892 小时前
MySQL篇(管理工具)
数据库·mysql
Benszen4 小时前
Docker容器化解决方案全解析
运维·docker·容器
badhope4 小时前
Docker从零开始安装配置全攻略
运维·人工智能·vscode·python·docker·容器·github