Mysql 主从复制
GuoJun 2022-09-09 MysqlDocker
# 概述
( 1 )首先, MySQL主库在事务提交时会把数据变更作为事件 Events 记录在二进制日志文件Binlog中; MySQL主库上的 sync_binlog参数控制 Binlog日志刷新到磁盘。
( 2 )主库推送二进制日志文件 Binlog中的事件到从库的中继日志 Relay Log, 之后从库根据中继日志 Relay Log重做数据变更操作, 通过逻辑复制以此来达到主库和从库的数据一致。
# 安装
- 创建Master实例并启动
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=root \
-d mysql:5.7
- 创建Slave实例并启动
docker run -p 3317:3306 --name mysql-slaver \
-v /mydata/mysql/slaver/log:/var/log/mysql \
-v /mydata/mysql/slaver/data:/var/lib/mysql \
-v /mydata/mysql/slaver/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
- 给master和slaver添加基本配置
vi /mydata/mysql/master/conf/my.cnf
vi /mydata/mysql/slaver/conf/my.cnf
分别添加如下配置
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
- Master配置 my.cnf添加如下配置
# 主从复制配置如下
#主服务器唯一Id[必填]
server-id=1
#启用二进制日志[必填] mysql-bin日志文件名
log-bin=mysql-bin
#主机,读写都可以
read-only=0
#设置不要复制的数据库[可选]
#binlog-ignore-db=mysql
#设置需要复制的数据库[可选](输数据库名字)
binlog-do-db=test
- Salve配置 my.cnf添加如下配置
#主从复制配置
#从服务器唯一Id
server-id=2
#只读,对拥有super权限的账号是不生效的
read_only = 1
#启用二进制日志
log-bin=mysql-bin
- 为master授权用户用来同步数据
# 进入master容器
docer exec -it mysql /bin/bash
# 添加用来同步的用户
GRANT REPLICATION SLAVE ON *.* TO 'backup'@'%' IDENTIFIED BY '123456';
# 查看master的状态 查询日志文件
show master status
- 配置slaver
CHANGE MASTER TO MASTER_HOST='192.168.56.20', MASTER_PORT=3307, MASTER_USER='backup', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=3052;
- 启动从服务器复制功能
start slave
- 查看是否成功
show slave status\G
#【\G是为了以键值的形式显示,好看一些】
#下面两个参数都是Yes,则说明主从配置成功!