本文讲解如何实现MySQL数据库的主从复制功能。使用的机器为Windows上的数据库作为主服务器,Linux上的数据库作为从服务器,实现一主一从的配置。
基本原理
实现主从复制,主机master和从机slave的工作方式如下图所示。
MySQL复制过程分成三步:
- master将改变记录到二进制日志(binary log)。这些记录过程叫做二进制日志事件,binary log events;
- slave将master的binary log events拷贝到它的中继日志(relay log);
- slave重做中继日志中的事件,将改变应用到自己的数据库中。 MySQL复制是异步的且串行化的。
复制的基本原则
- 每个slave只有一个master(类似Java中的单继承)
- 每个slave只能有一个唯一的服务器ID
- 每个master可以有多个salve
复制的最大问题:延时
配置过程
注意,实现一主一从的配置,要求两者的mysql版本要一致(本人使用的都是mysql5.7.25的版本),并且主从配置信息都在[mysqld]下,且最好都是小写。
修改主机配置
将主机设置为本机Windows下的数据库,其配置文件位于mysql的安装目录中的my.ini下。并修改以下的配置信息:
- [必须] 主机服务器唯一ID:server-id=1
- [必须] 启用二进制日志:bin-log=自己本地的路径/data/mysqlbin
- [可选] 启用错误日志:log-err=自己本地的路径/data/mysqlerr
- [可选] 根目录:basedir=自己本地的路径
- [可选] 临时目录:tmpdir=自己本地的路径
- [可选] 数据目录:datadir=自己本地的路径/data/
- [可选] read-only=0,设置主机为可读可写
- [可选] 设置不要复制的数据库:binlog-ignore-db=mysql
- [可选] 设置需要复制的数据库:binlog-do-db=主数据库名字
修改好后保存,并重启mysql服务。
修改从机配置
从机配置文件位于Linux上的/etc/my.cnf文件,修改的配置信息位于[mysqld]标签下
- [必须] 从服务器唯一ID:server-id=2(不能和主机相同)
- [可选] 启用二进制日志
修改好配置文件后,保存,重启mysql服务。
建立连接并授权
- 关闭主机和从机上的防火墙。windows手动关闭,linux通过systemctl stop firewalld关闭。
【主机配置】
- 主机给从机授权:
#%可以改为从机的ip地址,%表示任意ip都可以连
GRANT REPLICATION SLAVE ON *.* TO 'zhangsan'@'%' IDENTIFIED BY '123456';
flush privileges;
- 查看master的状态,并记录File和Position的值(表示要从哪个文件的哪个位置开始复制)
show master status;
【从机配置】
- 在从机上配置主机(主机IP需要改为自己的windows的ip,File名字和位置改为上图记录的值)
CHANGE MASTER TO MASTER_HOST='10.1.18.79', #更改ip
MASTER_USER='zhangsan',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysqlbin.000001',MASTER_LOG_POS=604; #更改文件名和位置
- 启动主从复制功能
start slave;
- 查看是否配置成功
show slave status\G
下面两个参数必须都是Yes,则说明主从配置成功!
- 停止主从复制功能(测试好后再来停止)
stop slave;
测试
在经过上述的配置之后,从机可从主机复制数据。
【主机创建数据】
create database mydb58;
use mydb58;
create table dog(id int not null, name varchar(20));
insert into dog values (1, 'ww1'); #插入1号汪汪
【从机检查数据】
至此,MySQL主从复制成功配置完成。