一.主从复制
1.1概念和原理
简单来说就是在主服务器上执行的语句,从服务器执行同样的语句,在主服务器上的操作在从服务器产生了同样的结果。
Master(主数据库)将用户对数据库更新的操作以二进制格式保存到BinaryLog日志文件中。
Slave(从数据库)上面的I0进程连接上Master, 并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容。
Master接收到来自Slave的I0进程的请求后,通过负责复制的I0进程根据请求信息读取制定日志指定位置之后的日志信息,返回给Slave 的I0进程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息已经到Master端的bin-log文件的名称以及bin-log的位置。
Slave的I0进程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候方便请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容。
Slave的Sql进程检测到relay-log中新增加了内容后,会马上解析relay- log的内容成为在Master端真实执行时候的那些可执行的内容,并在自身执行。
1.2案例:一主一从
1.准备工作
同步时间
# 安装 ntpdate
yum -y install ntpdate
# 同步时间
ntpdate pool.ntp.org
这里如果是克隆的虚拟机,则需要修改mysql 的 uuid,mysql5.6以上版本使用唯一uuid表示符,数据迁移是使用的物理备份,uuid会重复,修改uuid不一致即可。
首先使用查找命令确定文件位置,这里我们的位置如图所示,修改过后,重启 mysql 服务。
2.master主机
# 编辑 mysql 配置文件
vim /etc/my.cnf
# 写入以下内容
server-id=1
read-only=0
log-bin=mysql-bin
#binlog-do-db=my_test
# 重启服务
systemctl restart mysqld.service
主库配置
# 登录 mysql
mysql -uroot -p
# 创建用户,并授予主从复制权限
mysql> create user 'my'@'%' identified with mysql_native_password by 'Bdqn_8888';
mysql> grant replication slave on *.* to 'my'@'%';
# 查看主机上的binlog信息,如下图
mysql> show master status;
3.slave从机
# 编辑 mysql 配置文件
vim /etc/my.cnf
# 写入以下内容
server-id=2
read-only=1
log-bin=mysql-bin
# 重启服务
systemctl restart mysqld.service
这里要注意版本不同命令也有差别
# 登录 mysql
mysql -uroot -p
# 在从机上设置主机相关信息
mysql> CHANGE MASTER TO
master_host='192.168.9.3',
master_user='my',
master_password='Bdqn_8888',
master_port=3306,
master_log_file='mysql-bin.000001',
master_log_pos=154;
# 开启从机
mysql> START SLAVE;
# 查看状态,如下图
mysql> SHOW SLAVE STATUS\G;
看见两个yes说明没有问题,可以进行下一步测试。
4.测试
# 登录mysql主机
mysql -uroot -p
# 建库建表添加数据
mysql> create database testdb;
mysql> use testdb;
mysql> create table test(
id int(10) primary key not null auto_increment,
name varchar(50) not null,
gender char(1) not null
)engine=innodb default charset=utf8mb4;
mysql> insert into test values (null,'tom','m'),(null,'jack','m'),(null,'marry','f');
完成后在从机数据库中查询数据,验证是否同步。