实现原理:

1.主库Master 发生数据变化的时候,将改变的数据/SQL(具体看binlog模式)写入到 二进制日志(binary log,对数据库所有的增删改查操作,都会在该日志文件中记录起来,所以亦可以作为数据恢复用),该操作过程称之为 二进制日志事件

2.然后 从库Slave 通过 IO线程,读取主库的日志文件,当发现日志文件有新增的时候,就会将新增的内容拷贝到从库中的 Relay Log (中继日志文件)中,然后再通过从库的 SQL 线程 写到 从库的DB 中,完成一次数据同步

并且,MySQL的主从复制是异步的,并且是串行化的,而且有延迟(但延迟较短,一般都是毫秒级别)

 

具体实现:

一.服务器和数据库之间的配置

数据库可支持远程访问(一般来说在安装数据库的时候会设置该配置),并且保证防火墙不会被拦截

8.0版本 
GRANT ALL ON *.* TO 'root'@'%';
FLUSH PRIVILEGES;
5.7版本 
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
FLUSH PRIVILEGES;

二.配置文件的配置

主库:

[mysqld]下面进行配置
server-id=1 #唯一标识,主库从库不能重复(必须)
log-bin = "E:/mysql-bin" #开启日志(必须)
log-error = “E:/error-bin” #错误日志(可选)
binlog_ignore_db = mysql,performance_schema,information_schema(MySQL默认库)#日志记录忽略那些数据库的(必须)
binlog_do_db = test1,test2 #日志记录那些数据库(可选)
binlog_format = MIXED   #binlog日志格式,还有STATEMENT ROW模式,mysql默认采用MIXED  

 

从库:

[mysqld]下面进行配置
server-id=2 #唯一标识,主库从库不能重复(必须)
log-bin = "E:/mysql-bin" #开启日志 禁用 binlog 也可以起到加速降低延迟作用
replicate_do_db = raw #是在slave上配置,指定slave要复制哪个库(必须)
replicate-ignore-db=mysql,performance_schema,information_schema #是在slave上配置,指定slave要忽略哪个库(必须)
relay_log_recovery = 1     #从库建议开启,有利于数据一致性
sync_binlog = 0 #可加速降低延迟

 

三.主库从库授权

查看主库的从属状态
show master status;


File:主库二进制日志文件名称(每次重启MySQL服务的时候会发生变化)
Position:主库二进制日志文件磁盘位置(每次重启MySQL服务的时候会发生变化)
Binlog_Do_DB:需要同步的数据库名称

主库设置授权从库的ip
grant replication slave on *.* to 'slave'@'192.168.1.%' identified by 'password';
FLUSH PRIVILEGES;
stop slave;#如果已经配置了主从配置,需要停止主从功能,再执行
change master to
master_host='192.168.1.252',
master_user='root',
master_password='123456',
master_port=3306,
master_log_file='mysql-bin.00003', #查看主库的从属状态进行配置(主库若是重启过,该值可能会发生变化)
master_log_pos=2720; #查看主库的从属状态进行配置(主库若是重启过,该值可能会发生变化)
start slave ;
查看从库的运行状态
show slave status;

如果 Slave_IO_RunningSlave_SQL_Running 显示都为 yes,说明主从同步配置正常(但是,主库之前原有的数据并不会同步到从库中

接下来,直接在主库执行增删改操作,再去从库看一下是否同步,即可完成最后的主从同步校验

不过有一点需要注意的是,如果主库执行的更新或者是删除 SQL 的记录在从库上不存在,从库的 Slave_SQL_Running 的状态将会变为 No,此时之后主库的所有 SQL 增删改操作都不会同步到从库中(此时主库的 Position 的值也会发现变化),需要重新将 master_log_pos 值设置为主库新的 Position 值,并重新启动从库服务,也就是 start slave ;

如果想避免这种从库同步错误的发生,可执行

直接跳过错误执行语句
stop slave;
set global sql_slave_skip_counter =1;
start slave;