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 主机只有一台,但是从机可以有多台