docker MySql 主从复制搭建

91 阅读4分钟

MySql 主从复制搭建

创建主容器实例3306

docker run -it --name mysql-master -p 3306:3306 --privileged=true -v /home/admin/docker/mysql/master/conf:/etc/mysql -v /home/admin/docker/mysql/master/data:/var/lib/mysql -v /home/admin/docker/mysql/master/log:/log -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.38 image.png

创建主容器实例3306的配置文件my.cnf image.png

[mysqld]

## 设置server_id,同一局域网中需要唯一
server_id=101 

## 开启二进制日志功能
log-bin=mysql-master-bin

## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  

## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed  

## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7  

## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062

## 指定不需要写入binlog的数据库名称
binlog-ignore-db=mysql
binlog-ignore-db=sys
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema

## 指定的库名,其内部表数据修改都会写入binlog。
## binlog-do-db=db_name


## 忽略某些库的binlog 日志应用
## replicate-ignore-db=db_name

## 忽略某些表的binlog 日志应用
## replicate-ignore-table=db_name.tbl_name

## 应用某些库的binlog 日志
## replicate-do-db=db_name

## 应用某些表的binlog 日志
## replicate-do-table=db_name.tbl_name

## 使用通配符来匹配那些应用binlog日志的表
## replicate-wild-do-table=db_name.tbl_name

## 使用通配符来匹配那些不能应用binlog日志的表
## replicate-wild-ignore-table=db_name.tbl_name

## 能够实现主库与从库数据库名称不同的复制,比如主库数据库名为A,从库数据库名为B,实现主库A到从库B的复制
## replicate-rewrite-db=from_name->to_name

image.png

访问主数据库3306

docker exec -it mysql-master bash

mysql -uroot -p123456

show master status;

//给从库创建主从复制账号并赋权

GRANT REPLICATION SLAVE ON . TO 'slave'@'%' IDENTIFIED BY '123456';

image.png

创建重容器实例3307

docker run -it -p 3307:3306 --name mysql-slave
--privileged=true
-v /home/admin/docker/mysql/slave/log:/log
-v /home/admin/docker/mysql/slave/data:/var/lib/mysql
-v /home/admin/docker/mysql/slave/conf:/etc/mysql
-e MYSQL_ROOT_PASSWORD=123456
-d mysql:5.7.38 image.png

创建重容器实例3307的配置文件my.cnf

image.png

[mysqld]

## 设置server_id,同一局域网中需要唯一
server_id=102


## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mysql-slave-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=mysql-relay-bin  

## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1  

## slave设置为只读(具有super权限的用户除外)
read_only=1

## 指定不需要写入binlog的数据库名称
binlog-ignore-db=mysql
binlog-ignore-db=sys
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema

image.png

访问主数据库3307

docker exec -it mysql-slave bash

mysql -uroot -p123456 image.png change master to master_host='192.168.247.128',master_user='slave',master_password='123456',master_port=3306,master_log_file='mysql-master-bin.000001',master_connect_retry=30; image.png show slave status; image.png start slave;

show slave status; image.png

搭建过程中遇到的问题

  • my.cnf中的配置无效 原因:运行mysql时配置错误,-v /home/admin/docker/mysql/master/conf:/etc/mysql中冒号(:)后面是/etc/mysql,而不是/etc/mysql/conf
  • 编辑my.cnf时粘贴内容是每行前都自动添加一个# 解决方案::set paste
  • show slave status;时 Slave_IO_Running显示连接中 原因:change master to master_host='192.168.247.128',master_user='slave',master_password='123456',master_port=3306,master_log_file='mysql-master-bin.000001',master_connect_retry=30;中设置错误,检查里面的master_host,master_user,master_password,master_port,master_log_file,或者主数据库中不存在master_user设置的用户,或该用户的设置不对,在主数据库中查看用户信息,如下image.png

其他

主库操作, 给从库创建主从复制账号并赋权

GRANT FILE ON . TO 'slaver'@'192.168.247.128' IDENTIFIED BY '123456';

CREATE USER 'slave'@'%' IDENTIFIED BY '123456';

FLUSH PRIVILEGES;

设置从库同步

reset slave;

stop slave;

admin用户使用vim编辑文档时,在退出时会提示“E212: Can't open file for writing”,解决办法有两个。

  1. 直接退出

su成具有权限的超级用户之后,在所操作文件的目录下会出现一个swap的隐藏文件,读入缓存后可删掉。

  1. 提权::w !sudo tee %