主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库。主服务器会将更新信息写入到一个特定的二进制日志文件中。并会维护文件的一个索引用来跟踪日志。这个日志可以记录并发送到从服务器中并同步主数据库中的数据。当一台从服务器连接到主服务器时,从服务器会通知主服务器从服务器的日志文件中读取最后一次成功更新的位置。然后从服务器会接收从哪个时刻起发生的任何更新,然后锁住并等到主服务器通知新的更新
原理
配置主数据库 配置主数据库my.cnf文件 编辑/etc/my.cnf
配置文件,在尾部追加以下内容。
1 2 3 4 server-id=1 log_bin=master-bin log_bin_index=master-bin.index binlog_do_db=test
###创建用于数据同步的用户
1 2 3 4 # 创建用户 create user 'masterdb'@'%' identified by 'hmjgwz250'; # 授权 grant replication slave on *.* to masterdb@'%';
重启主数据库服务 1 2 systemctl restart mysqld
重新进入MySQL然后检查主数据库状态 1 2 3 4 # 重新进入mysql mysql -u root -p # 检查主服务器状态 show master status;
请记住这里的master_log_file
和master_log_pos
两项输出结果,在从数据库中配置时要用到 。
防火墙开放3306端口 1 2 3 4 5 6 firewall-cmd --list-ports 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=2 relay-log=slave-relay-bin relay-log-index=slave-relay-bin.index
重启mysql服务 1 2 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_file
和master_log_pos
配置项的值请根据在主数据库中执行show master status;
指令输出的结果填写!!!
启动自动同步主数据库数据 1 2 3 start slave; # 启动与主数据库数据同步 stop slave; # 停止与主数据库数据同步 reset slave; # 重置与主数据库数据同步配置
查看从数据库状态 1 show slave status\G; # 查看从数据库状态
若Slave_IO_Running
与Slave_SQL_Running
两项的值均为Yes
则说明我们的主从复制已经配置好了,否则则说明我们的配置有问题,请根据Lsat_IO_Error
给出的错误信息进行百度改正。
测试主从复制是否配置成功 在主数据库建库建表 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记录已同步至从数据库 。
重置同步语句 1 2 3 4 5 6 reset slave; 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 start slave;