主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库。主服务器会将更新信息写入到一个特定的二进制日志文件中。并会维护文件的一个索引用来跟踪日志。这个日志可以记录并发送到从服务器中并同步主数据库中的数据。当一台从服务器连接到主服务器时,从服务器会通知主服务器从服务器的日志文件中读取最后一次成功更新的位置。然后从服务器会接收从哪个时刻起发生的任何更新,然后锁住并等到主服务器通知新的更新

原理

主从复制原理

配置主数据库

配置主数据库my.cnf文件

编辑/etc/my.cnf配置文件,在尾部追加以下内容。

1
2
3
4
server-id=1   # 服务器唯一标识。主数据库唯一标识数字必须小于从数据库唯一标识数字
log_bin=master-bin # 启动MySQL二进制日志,即数据同步语句,从数据库会一条一条的执行这些语句。
log_bin_index=master-bin.index # 二进制日志文件索引
binlog_do_db=test # 需要数据同步的数据库
image-20200812200714121

###创建用于数据同步的用户

1
2
3
4
# 创建用户
create user 'masterdb'@'%' identified by 'hmjgwz250';
# 授权
grant replication slave on *.* to masterdb@'%';

重启主数据库服务

1
2
# 重启mysql服务
systemctl restart mysqld

重新进入MySQL然后检查主数据库状态

1
2
3
4
# 重新进入mysql
mysql -u root -p
# 检查主服务器状态
show master status;

请记住这里的master_log_filemaster_log_pos两项输出结果,在从数据库中配置时要用到

image-20200812203317429

防火墙开放3306端口

1
2
3
4
5
6
# 查看防火墙是否已经开放3306端口
firewall-cmd --list-ports
# 永久开放3306端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
# 重启防火墙,使配置生效
firewall-cmd --reload

若第一步执行后提示防火墙已关闭,请使用systemctl start firewalld指令打开防火墙后再重新执行。

从数据库配置

配置从数据库my.cnf文件

编辑/etc/my.cnf配置文件,在底部加入如下配置。

该文件默认只有root用户可编辑,其他用户只读,请切换至root用户编辑。

1
2
3
4
5
6
7
8
9
10
# server-id 服务器唯一标识,如果有多个从服务器,每个服务器的server-id不能重复
server-id=2
# 启动MySQL二进制日志,
relay-log=slave-relay-bin
# 二进制日志文件索引
relay-log-index=slave-relay-bin.index
# 指定同步的数据库,如果复制多个数据库,重复设置这个选项即可。
# 若在master端不指定binlog-do-db,则在slave端可用replication-do-db来过滤。
#replicate-do-db=test
#replicate-ignore-db 不需要同步的数据库
image-20200812204024336

重启mysql服务

1
2
# 重启mysql服务
systemctl restart mysqld

执行同步语句

1
change master to master_host='47.115.29.238',master_port=3306,master_user='slavedbuser',master_password='hmjgwz250',master_log_file='binlog.000002',master_log_pos=2642;

⚠️注意:这里的master_log_filemaster_log_pos配置项的值请根据在主数据库中执行show master status;指令输出的结果填写!!!

image-20200812205958527

启动自动同步主数据库数据

1
2
3
start slave;   # 启动与主数据库数据同步
stop slave; # 停止与主数据库数据同步
reset slave; # 重置与主数据库数据同步配置
image-20200812204742804

查看从数据库状态

1
show slave status\G; # 查看从数据库状态

Slave_IO_RunningSlave_SQL_Running两项的值均为Yes则说明我们的主从复制已经配置好了,否则则说明我们的配置有问题,请根据Lsat_IO_Error给出的错误信息进行百度改正。

image-20200812213834031

测试主从复制是否配置成功

在主数据库建库建表

1
2
3
4
5
6
7
# 建库
create database test default character set utf8;
# 建表
create table user(
id int primary key auto_increment,
name varchar(25) not null,
age int not null);

测试一下,先在从数据库中查询一下全部的user表数据,然后在主数据库中新增一条记录,此时再使用从数据库查询全部user表数据,可以看到,主数据库中新增的user记录已同步至从数据库

image-20200812215925306

重置同步语句

1
2
3
4
5
6
 # 1.重置从数据库同步配置
reset slave;
# 2.重新执行同步语句
change master to master_host='10.211.55.5',master_port=3306,master_user='masterdb',master_password='hmjgwz250',master_log_file='master-bin.000007',master_log_pos=3379
# 3.启动与主数据库数据同步
start slave;