通过docker-compose创建mysql,实现主从复制
一、创建主服务器所需目录
mkdir -p /home/docker/mysql/conf
mkdir -p /home/docker/mysql/db
二、主服务器配置文件
vim /home/docker/mysql/conf/mysql.cnf
[mysqld]
character-set-server=utf8mb4
## 设置server_id,注意要唯一
server-id=1
## 开启binlog
log-bin=mysql-bin
## binlog缓存
binlog_cache_size=1M
## binlog格式(mixed、statement、row,默认格式是statement)
binlog_format=mixed
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000
default-time-zone = '+08:00'
auto_increment_increment=2
auto_increment_offset=1
log-slave-updates
sync_binlog=1
character-set-server=utf8mb4
[client]
default-character-set=utf8mb4
三、创建并启动mysql主服务
我是使用的docker-compose 下面是docker-compose的文件
version: '2'
services:
mysql:
container_name: "mysql"
network_mode: "host"
environment:
TZ: Asia/Shanghai
image: "mysql:5.7.29"
restart: always
ports:
- 3306:3306
volumes:
- "/home/docker/mysql/db:/var/lib/mysql"
- "/home/docker/mysql/conf:/etc/mysql/conf.d"
# 启动mysql镜像
docker-compose up -d
四、添加复制master数据的用户reader,供从服务器使用
我是在Navicat链接的数据库,也可以在docker镜像中链接 像我这样启动安装的 账号密码默认是root 123456
# 用户名:root 密码:123456
# 切换到MySQL数据库。
use mysql;
# 查看当前用户
select user,host from user;
# 更改当前用户密码
set password for 'root'@'%' = password('root');
# 创建reader用户
GRANT REPLICATION SLAVE ON *.* to 'reader'@'%' identified by '123456';
FLUSH PRIVILEGES;
五、创建从服务器所需目录,编辑配置文件(配置从服务器)
mkdir -p /home/docker/mysql/conf
mkdir -p /home/docker/mysql/db
vim /home/docker/mysql/conf/mysql.cnf
[mysqld]
## 设置server_id,注意要唯一
server-id=2
## 开启binlog,以备Slave作为其它Slave的Master时使用
log-bin=mysql-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
## 如果需要同步函数或者存储过程
log_bin_trust_function_creators=true
## binlog缓存
binlog_cache_size=1M
## binlog格式(mixed、statement、row,默认格式是statement)
binlog_format=mixed
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
[mysqld]
character-set-server=utf8mb4
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000
default-time-zone = '+08:00'
auto_increment_increment=2
auto_increment_offset=2
log-slave-updates
sync_binlog=1
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
六、创建并运行mysql从服务器
docker-compose文件 加上定义好的密码,并不行
version: '2'
services:
mysql:
container_name: "mysql"
# network_mode: "host"
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: "root"
MYSQL_USER: 'root'
MYSQL_PASS: 'root'
image: "mysql:5.7.29"
restart: always
ports:
- 3306:3306
volumes:
- "/home/docker/mysql/db:/var/lib/mysql"
- "/home/docker/mysql/conf:/etc/mysql/conf.d"
七、在从服务器上配置连接主服务器的信息
首先主服务器上查看master_log_file、master_log_pos两个参数,然后切换到从服务器上进行主服务器的连接信息的设置
主服务上执行:
记住file和position值
show master status;
查看主服务器容器的ip地址
在从服务器上执行:
change master to master_host='49.232.221.199',master_user='reader',master_password='123456',master_log_file='mysql-bin.000002',master_log_pos=22469150;
在从服务器启动I/O 线程和SQL线程
# 启动
start slave;
#查看启动状态
必须确认两个都为Yes才可以生效
问题
Slave_IO_Running为No
我的原因是:因为我的两个docker容器是从一个安装好mysql的镜像生成的,他们的UUID相同重复了
只需要进从数据库的镜像中将auto.cnf删除重新启动就可以重新生成了
# 进入mysql容器
docker exec -it mysql /bin/bash
# 进入auto.cnf目录下
cd /var/lib/mysql
# 删除文件
rm -f auto.cnf
# 退出
exit;
# 重启mysql容器生成auto.cnf
docker restart mysql
## 进入从数据库执行命令
stop slave ;
start slave;
show master status;
Slave_SQL_Running为No
直接重行手动set值 master_log_pos要改成主库的值 确认master_log_file和master_log_pos和主库的一致
stop slave ;
change master to master_host='49.232.221.199',master_user='reader',master_password='123456',master_log_file='mysql-bin.000002',master_log_pos=22469150;
start slave;
show master status;
通过docker-compose创建mysql,实现主从复制