mysql主从复制

mysql 主从复制:所有在主服务器上的操作都会同步到从服务器上,实现主从同步的配置,主从复制可以避免主服务器宕机后导致业务暂停(主服务器宕机后切换到从服务器上继续执行任务)。

环境准备:

主服务器:10.88.22.183,安装MySQL(可编译安装或者通过yum直接安装),最好版本一样

从服务器:10.88.22.182,安装MySQL(可编译安装或者通过Yum直接安装),最好版本一样

本例子以mariadb5.5为例子做演示

配置步骤:

1、 首先开启binlog日志,开启方法进入MySQL配置文件,vi /etc/my.cnf   在mysqld下方中添加如下内容

1、log-bin=/var/lib/mysql/mysql-bin
2、expire_logs_days=10(表示binlog日志数据保存周期为10天),mysql8不支持此参数
3、server-id=1(两台服务器设置不同的节点,另一台可设置server-id=2)

设置完成后,重启mysql即可

注意:binlog日志文件必须开启,因为数据同步的实质就是其他的MySQL服务器将数据变更的二进制日志在本机上再执行一遍

配置从库只读:从库my.cnf中可添加配置如下:

read_only = 1           #只读模式,普通用户只能读不能写
super_read_only = 1     #所有用户只读,root也不能写 

2、在主服务器中执行10.88.22.183中创建一个通过从服务器10.88.22.182可以登录的MySQL用户,用户名:night 密码night@5793,执行命令如下:

grant replication slave on *.* to 'night'@'10.88.22.182' identified by 'night@5793';

flush privileges;

如果是mysql8版本,需要先创建用户然后给权限,如下:

#创建的用户也要使用mysql_native_password,否则主从会提示认证失败
create user 'replica'@'172.23.21.155' identified WITH mysql_native_password by 'replica2024';
grant replication slave on *.* to replica@'172.23.21.155';
flush privileges;

3、 查看主服务器10.88.22.183中binlog二进制日志位置与名字,执行命令如下:

show master status;

从图中可以看出日志名字为mysql-bini.000004,位置为475

4、在从服务器10.88.22.182中获取主服务器中的二进制文件名与位置,执行命令如下:

change master to master_host='10.88.22.183',master_user='night',master_password='night@5793',master_port=3306,master_log_file='mysql-bin.000004',master_log_pos=475;

注意:如果主的mysql端口不是3306,就需要使用master_port参数,否则不用此参数也行

5、 测试主从复制,在从服务器中执行如下命令,start slave;开始复制, 查看主从复制是否成功,执行命令 show slave status\G; 如图所示 :

当看到Slave_IO_Running和Slave-SQL_Running都是显示yes时表示配置成功,此时可以在主服务器上新建数据库以及建表,在从服务器中查看可以发现已经同步成功。

注意:如果Slave_IO_Running显示connecting表示未连接成功,此时可能是防火墙开启了但是没有通过3306端口,可以关闭防火墙或者允许3306端口通过即可,重启mysqld  重启防火墙,重新测试主从复制配置发现都显示yes,表示成功。 同时可以通过mysql -h10.88.22.183 -unight -p 测试是否可以登陆成功

还有一种错误情况如下:

发生此错误的原因是关闭了从服务器(stop slave),主服务器上又执行了增删改等操作,导致当前的数据pos点和之前配置的无法匹配,解决方法如下:

先关闭从服务器stop slave然后重新执行change master to master_host=”,master_user…………………………………然后执行start slave打开同步,执行show slave status\G;

再次测试主从同步即可。

备注: 一主多从的配置方法和这个一样,也是先通过主服务器给从服务器授,然后告知主服务器的日志位置和pos点,执行change,然后查看是否配置成功,还有一种是双机器互为主从,配置方法和主从一样,反过来配置一下就可以啦(从服务器给主服务器权限,主服务器执行change ——-start slave ….等等)

附录:

mysql5.6以上版本会报错误图片如下:

查看错误日志可以看到报错如下:

这是由于从mysql5.6开始复制引入了uuid的概念,各个复制结构中的server_uuid的值不可以一样,可以通过show variables like ‘server_uuid’;查看,发现相同,于是找到数据文件夹下的auto.cnf文件,将里面的值修改为不同的,重启myqld,再次查看配合发现主从配置成功slave_io_running为yes).同样,my.cnf中的server_id也要不一样

注意:如果设置了互为主从,同时配上keepalived可实现mysql高可用架构,防止单点故障

注意:如果要重新配置主从,可在相关的每个节点执行如下命令:

stop slave
reset slave all   #清空配置信息

附加:

1、MySQL8版本以上默认的认证方式方式为caching_sha2_password,如果要修改为mysql_native_password,可执行如下命令:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new_password' PASSWORD EXPIRE NEVER;
flush privileges;

2、如果只让从库同步指定的主库中的库,可添加配置如下:

replicate-do-db=your_database_name

如果配置从库同步指定的多个库,如下:

replicate-wild-do-table=db1.%
replicate-wild-do-table=db2.%

标签