Mysql 主从复制

系统 CentOS7

本次mysql主从复制将用docker来实现,本次实习有以下两种方式

  1. 单向主从
  2. 双向主从

本次主从复制:基于日志(binlog)

Master和Slave数据库的版本要一致

单向主从

Mysql 主从复制

安装步骤

本次将要修改my.cnf 文件 可以先启动容器拷贝my.cnf文件

文件拷贝

docker cp 本地文件路径 ID全称:容器路径 (本地到容器)

docker cp ID全称:容器文件路径 本地路径 (容器到本地)

yum remove docker  ##删除docker

yum -y install docker-io  ##安装docker

// 启动 Docker service docker start

镜像加速

修改 /etc/docker/daemon.json 文件并添加上 registry-mirrors 键值

{ "registry-mirrors": ["http://hub-mirror.c.163.com"] }

然后重新启动下docker服务 systemctl restart docker

docker pull registry.cn-hangzhou.aliyuncs.com/hhzz/mysql

docker ps -a 查看

docker start id 启动

创建下面3个文件

mkdir data  logs conf    注意:conf/my.conf

打开 vi conf/my.conf

在 [mysqld] 中增加以下配置项

## 设置server_id,一般设置为IP

server_id=1

## 复制过滤:需要备份的数据库,输出binlog

#binlog-do-db=roncoo

## 复制过滤:不需要备份的数据库,不输出(mysql库一般不同步)

binlog-ignore-db=mysql

## 开启二进制日志功能,可以随便取,最好有含义

log-bin=edu-mysql-bin

## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存

binlog_cache_size=1M

## 主从复制的格式(mixed,statement,row,默认格式是statement)

binlog_format=mixed

# mysql清除过期日志的时间,默认值0,不自动清理,而是使用滚动循环的方式。
expire_logs_days = 0
# 如果二进制日志写入的内容超出给定值,日志就会发生滚动。你不能将该变量设置为大于1GB或小于4096字节。 默认值是1GB。
max_binlog_size = 1000M

## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。

## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致

slave_skip_errors=1062

:wq保存

docker exec -it id bash 或 /bin/sh 启动一个伪终端以交互式的方式进入某个容器(使用exit退出后容器不停止运行)

进入容器 mysql -uroot -p 

Enter password: //输入密码即可

myslq> show master status;

Mysql 主从复制

记住 File 跟 Position

master 安装完毕

安装Slave 同上    Slave my.conf  文件同上加入 一些配置

## relay_log配置中继日志

relay_log=edu-mysql-relay-bin

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

log_slave_updates=1

## 防止改变数据(除了特殊的线程)

read_only=1

# 默认值N=1,使binlog在每N次binlog写入后与硬盘同步,ps:1最慢

sync_binlog = 1

进入容器 Slave   mysql -uroot -p 

change master to master_host='IP', master_user='用户名', master_password='密码', master_port=3306, master_log_file='masterFile文件名', master_log_pos=1389,master_log_pos= MasterPosition, master_connect_retry=30;

开始同步 mysql> start slave;

查看主从同步状态 mysql>  show slave status\G;

Mysql 主从复制

两个为 YES 表示成功。

双向主从.show master status; 记住 Slave 上的 File 跟 Position 在 master 中执行就OK了