MySQL实现主从同步

前期准备

  • Linux版本:CentOS7
  • 分别创建两个虚拟机作为主从节点(有钱的话可以买两个服务器😁)
  • 两台虚拟机上都安装好mysql

Master配置

配置文件

修改 my.cnf 文件,[mysqld] 下加入下面内容

# 服务的唯一编号
server-id = 1

# 开启mysql binlog功能
log-bin = mysql-bin

# binlog记录内容的方式,记录被操作的每一行
binlog_format = ROW

# 减少记录日志的内容,只记录受影响的列
binlog_row_image = minimal

# 指定需要复制的数据库名为test,主库从库必须一样
binlog-do-db = test

修改好配置文件后,重启 mysql 服务,使修改生效

systemctl restart mysqld

创建从库同步数据的账号

登录客户端

mysql -uroot -pxxx

添加一个用户【用于在从库主机中登录进行同步】

create user 'replicate'@'%' identified by 'replicate';

对用户授予复制权限

grant replication slave on *.* to 'replicate'@'%';

刷新使其生效

flush privileges;

查看主库状态

show master status\G;

这样就表示成功了!

file:表示同步的bin-log信息从哪个文件开始;

position:表示从file的哪个位置开始;

binlog_do_db:表示同步哪一个库

在后面的slave配置中,这三个结果都需要使用到。

Slave配置

配置文件

修改 my.cnf 文件,[mysqld] 下加入下面内容

# 服务的唯一编号
server-id = 2

# 开启mysql binlog功能
log-bin = mysql-bin

# binlog记录内容的方式,记录被操作的每一行
binlog_format = ROW

# 减少记录日志的内容,只记录受影响的列
binlog_row_image = minimal

# 指定需要复制的数据库名为test
replicate-do-db = test

重启使其生效

systemctl restart mysqld	

执行同步命令(重要

mysql终端执行

change master to master_host='192.168.6.84',master_port=3306,master_user='replicate',master_password='replicate',master_log_file='mysql-bin.000001',master_log_pos=749;

命令需要特别注意:master_log_file 和master_log_pos 2个属性内容,这2个属性是刚才主服务器上执行show master status\G;查询出来的内容。

开启从机角色

start slave;

查看从库状态

show slave status\G;

注意:当:Slave_IO_Running和Slave_SQL_Running的状态都为Yes时,说明从库配置成功。

测试验证

主库上创建 test

create database test character set 'utf8';
use test;
show tables;

查看从库

show databases;
use test;
show tables;

发现什么了!没错,从库已经有了 test 库了,说明同步已经成功,主机上的修改,已经能同步到从库上,可以再尝试加表加数据都可以成功!

期间遇到的问题

创建用户时密码不能设置太简单

解决办法

  • my.cnf文件中添加配置,这样密码就可以设置简单的

    validate_password.policy=0  #0是最简单,1是medium,2是strong

    视版本而定,有的版本是validate_password_policy

主从同步报错

一种情况(从机):error connecting to master replicate@192.168.232.130:3306 - retry-time: 60 retries: 6 message: Authentication plugin caching_sha2_password reported error: Authentication requires secure connection

这种报错同时还伴随着:Slave_IO_Running: CONNECTING

解决办法:

  • 主机中执行:alter user ‘replicate‘@’%’ identified with mysql_native_password by ‘replicate’;

  • 执行完上述命令,记得 flush privileges,不放心可以再重启一下mysql

    说明:replicate是你创建用来同步数据的用户,第二个是该用户密码

二种情况(从机):我是解决了第一种情况就变成了第二种情况

UUID相同了

解决办法:

  • 先看主从机server-idmy.cnf文件中配置的)设置的是否相同

  • 相同的话执行下列命令

    find / -name 'auto.cnf'
    vim /var/lib/mysql/auto.cnf

    修改其中的 uuid 即可

还有这个问题

虚拟机关机后,第二天从库 SLAVE_SQL_RUNNING 为 NO 了

我是看这篇文章解决的 这里