一、准备
1、准备两台服务器,如果本地测试,准备两台虚拟机。
2、两台服务器上安装相同的mysql数据库。
3、我这里准备两台虚拟机演示:
192.168.21.102 主机
192.168.21.105 从机
4、在两台mysql数据库分别创建相同数据库
create database IdentityServer4Admin;
注意:如果在本地虚拟机上进行操作,一般部署好一台虚拟机后,采用克隆操作(virtualbox上是采用复制的方式)。克隆完成之后,需要修改任意一台虚拟机上mysql数据库uuid,详见看下面错误2介绍。
二、配置主数据库master
1、修改配置文件
# 修改mysql配置文件
vi /etc/my.cnf
#在[mysqld]下方添加如下配置信息
log-bin=node1-bin #二进制文件名称
binlog-format=ROW #二进制日志格式,有row、statement、mixed三种格式。
#row是指把改变的内容复制过去,而不是把命令在从服务器上执行一遍。
#statement是指在主服务器上执行的SQL语句,在从服务器上执行相同的语句。
#mixed是指默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会
#采用基于行的复制。
#Mysql默认采用基于语句的复制,效率比较高。
server-id=1 #各个服务器的id保持唯一
binlog-do-db=IdentityServer4Admin #同步的数据库名
配置完成后,重启数据库,查看配置信息。
2、授权账号
create user 'repl'@'%' identified by 'Ab123456'; --创建从服务器连接账号
grant replication slave on *.* to 'repl'@'%'; --授权账号权限
flush privileges; --刷新权限
三、配置从数据库slave
1、配置文件
#修改从服务器配置文件
vi /etc/my.cnf
#在[mysqld]下方添加如下配置信息
log-bin=node1-bin #二进制文件名称
binlog-format=ROW #二进制文件格式
server-id=2 #服务器id
2、与主数据库互联
#重启数据库服务
systemctl restart mysqld
#登录mysql
mysql -uroot -p
#连接主数据库
change master to master_host='192.168.21.102',master_user='repl',master_password='Ab123456',master_port=3306,master_log_file='node1-bin.000005',master_log_pos=157,get_master_public_key=1;
#启动slave
start slave;
#查看slave的状态
show slave status \G(没有分号,分号执行会不成功!)
四、问题汇总
1、错误2:ERROR 2061 (HY000): Authentication plugin 'caching_sha2_password' reported error:Authentication requires secure connection.
mysql8使用的密码机制是caching_sha2_password,而不是之前的mysql_native_password。主从数据库密匙不同步造成。
解决方案:
使用用户请求服务器公钥:
从数据库请求主数据库,发送互联请求时添加参数。get_master_public_key=1。
2、错误1:Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
原因:主机和从机的UUID一致了,要求不一样。克隆两个一样的虚拟机造成。
查看UUID,show variables like '%server_uuid%';命令查看uuid值
find -name auto.cnf命令查看auto.cnf文件的位置。位置为/var/lib/mysql/auto.cnf。编辑修改。重启mysql,systemctl restart mysqld。
3、出错后处理
#停止主从复制
stop slave;
#清空之前的主从复制配置信息
reset slave;
#从新配置主从复制
change master to master_user='repl',master_password='Ab123456',master_host='192.168.21.102',master_port=3306,master_auto_position=157,get_master_public_key=1;
start slave;