1.mysql主库会把所有的写操作记录在binlog日志中,并且生成log dump线程,将binlog日志传给从库的I/O线程,从库生成两个线程,一个是I/O线程,另外一个是SQL线程。
主将更改操作记录到binlog里从将主的binlog事件(sql语句) 同步本机上并记录在relaylog里从根据relaylog里面的sql语句按顺序执行。
2.主从复制步骤:
- 确保从数据库与主数据库里的数据一致
- 在主数据库里创建一个同步账户授权给从数据库使用
- 配置主数据库(修改配置文件)
- 配置从数据库(修改配置文件)
- 一主一从
- 主主复制
- 一主多从---扩展系统读取的性能,因为读是在从库读取的
- 多主一从---5.7版本开始支持
- 联级复制
3.需求:
搭建两台MYSQL服务器,一台作为主服务器,一台作为从服务器,主服务器进行写操作,从服务器进行读操作。
4.环境说明【使用docker启动两个】
名称 Ip Port
M1 192.168.149.128 3307
M1S1 192.168.149.128 3308
5.安装【阿里云需要放掉端口3307,3308,本机关闭防火墙即可】
docker run --name M1 -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
docker run --name M1S1 -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
6.修改配置文件
*** 一、将容器里面的配置文件复制出来,主要修改服务器的配置。
# 1.在root目录下创建一个mysqlms的目录存放从docker容器里面复制过来的配置文件。
mkdir mysqlms
docker cp M1:/etc/mysql/conf.d/docker.cnf m1.cnf
docker cp M1S1:/etc/mysql/conf.d/docker.cnf m1s1.cnf
# 2.配置主机:主机里面要记录sql 语句,以后从机会把该sql 语句偷过去
vi m1.cnf
server-id=1
log-bin=master.bin
# 3.配置从机:
vi m1s1.cnf
server-id=2
*** 二、配置文件修改后,复制到容器里面
docker cp m1.cnf M1:/etc/mysql/conf.d/docker.cnf
docker cp m1s1.cnf M1S1:/etc/mysql/conf.d/docker.cnf
*** 三、重启
docker restart M1 M1S1
7.配置主机:执行sql
7.1 进入主机,执行配置
docker exec -it M1 bash
mysql -uroot -p123456
7.2 创建账户
create user 'rep'@'%' identified by '123456';
7.3 给该用户授予权限:
grant replication slave on *.* to 'rep'@'%';
flush privileges
7.4 至此:M1 里面已经创建了一个用户:rep 123456 拥有所以库,所有表replication slave
尝试使用M1 里面的rep 用户登录:
8.配置从机:执行sql
8.1 配置登录
docker exec -it M1S1 bash;
mysql -u root -p123456;
8.2 从机执行
change master to master_host="127.0.0.1",master_port=3307,master_user="rep",master_password="123456",master_log_file="master.000001",master_log_pos=745;
注意:master_log_file:该文件具体叫什么名称,需要从主机里面去看看:
进入M1 里面使用root 用户登录M1,执行下面的sql:
show master status;
8.3 启动主从,查询状态 有两个yes
start slave;
show slave status \G;
8.4 规范如下:
1 只能在主机里面执行DML 语句,绝对不能在【从机】里面执行DML语句【会破坏主从】
2 只在从机里面可以执行查询语句
3 主机只有一台,但是从机可以有多台
9.测试
在M1 里面创建数据库,看M1S1 有没有复制过去
来源:oschina
链接:https://my.oschina.net/wyn365/blog/3214390