概念

作用

主从同步,可以实现在主数据库修改数据时,从数据库的数据一样进行同步修改。

原理

image.png

主从同步,同步数据时很容易出错的,如果从数据库在同步时出错,则往下都不会继续同步的,且修改数据等也容易因为主键啥的导致从在同步时出错,所以还是挺多坑的。

配置过程

配置时,主从的数据库都不要有mysql连接,避免可能的操作数据导致的配置失败。

配置完成后,先把使用到主的数据库的程序先跑起来,再去启动使用到从的数据库,不然可能还是会出现同步错误的问题。

如果出现从同步数据的时候错误,则我们把从的数据库删掉,再把主的数据库导出,然后导入到从的数据库中,保证数据是一样的。

主数据库

1.修改配置文件

[mysqld]
server-id=1         #[必须]服务器唯一ID,默认是1
log-bin=mysql-bin   #[必须]启用二进制日志

Linux 配置路径 /etc/my.cnf
windows 配置路径 mysql/bin/my.ini

log-bin的值不一定要mysql-bin,只是一个日志的名称。

2.重启mysql生效配置

[windows] 
net stop mysql;
net start mysql;

[Linux]
systemctl restart mysqld;

[docker]
docker restart mysql;

3.创建用于从数据库连接的mysql账号,登录mysql执行以下命令

create USER '用户名'@'%' IDENTIFIED BY '密码';

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO '用户名'@'%'; 

FLUSH PRIVILEGES;

其中 %代表任意ip都可以连接,最好将其提替换为备用数据库的服务器ip,防止账号在其他ip被使用。

从数据库

1.修改配置文件,重启mysql生效配置

[mysqld]
server-id=2 #[必须]不能跟主数据库相同
log-bin=mysql-slave-bin
relay-log=mysql-relay

Linux 配置路径 /etc/my.cnf
windows 配置路径 mysql/bin/my.ini

log-bin的值不一定要mysql-slave-bin,只是一个日志的名称。

2.配置主数据库信息,登录mysql执行以下命令

CHANGE MASTER TO 
MASTER_HOST='',
MASTER_USER='', 
MASTER_PASSWORD='', 
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=120 ;

MASTER_HOST : 主数据库IP地址
MASTER_USER : 主数据连接账号,用上面创建的
MASTER_PASSWORD : 主数据库连接密码,用上面创建的
MASTER_PORT : 主数据库端口
MASTER_LOG_FILE : 主数据库的log file名称,在主数据库中登录执行show master status;查询到的File的值
MASTER_LOG_POS : 主数据库的log pos名称,在主数据库中登录执行show master status;查询到的Position的值

3.启动同步,登录mysql执行以下命令

start slave;

4.查看是否启动正常

show slave status;

Slave_IO_Running的值YES,Slave_SQL_Running的值YES,则代表主从配置无问题,启动成功。

由于此命令查找出来的字段有很多,排序乱很难看,我们可以直接show slave status \G;以竖的方式显示即可容易看。

常用指令

做为主数据库

显示作为主数据库时的相关配置

show master status;

重置作为主数据库时的相关配置

reset master;

我们利用show master status;查询出来,可以看到Position的值是固定的,我们可以利用此命令进行重新生成。

如果发现主从同步有问题,也可以尝试此命令进行重置。

重置后,由于Position发现变化,我们的从数据库也要重新配置CHANGE MASTER TO。

从原理我们可以看出,主从同步的核心就是binlog日志,reset master就是重置此日志。

做为从数据库

启动主从同步

start slave;

停止主从同步

stop slave;

重置主从同步

reset slave;

停止后才能重置;如果遇到一些问题出错,我们可以利用重置解决问题。

从原理我们可以看出,主从同步的核心就是binlog日志,reset slave就是重置此日志。

显示主从同步状态

show slave status;

主从的日志

显示日志列表

show master logs;

显示的是本地的日志,主就是主的,从就是从的。

刷新日志列表

flush logs;

查看指定日志

show binlog events in '日志键名';

日志键名为show master logs查询出来的Log_name对应的值。

错误时的思路参考

mysql主从复制一个小错误导致从库不更新数据
https://blog.csdn.net/qq_31648761/article/details/51997163
线上MYSQL同步报错故障处理方法总结(必看篇)
https://www.jb51.net/article/109107.htm