mysql 读写分离 主从复制
0、master主库配置
名称 | IP | mysql |
服务器A-master | 192.168.0.161 | mysql 8.0 |
服务器B-slave | 192.168.0.162 | mysql 8.0 |
1、master主库配置
1) 在 /etc/my.cnfmysql核心配置文件的[mysqld]节点内,新增如下配置:
[mysqld]
## 设置server_id,注意要唯一,只能为数字
server_id=1
## 开启binlog
log-bin=mysql-bin
## binlog缓存
binlog_cache_size=1M
## binlog格式(mixed、statement、row,默认格式是statement)
binlog_format=mixed
binlog-do-db=test_db #待同步的数据库日志,可省略,省略为全部
binlog-ignore-db=mysql #不同步的数据库日志,可省略,省略为无
2) 创建专门用于主从复制用户账号。因此使用root账户登录mysql,并执行一些指令:
--登录
mysql -u root -p密码
--创建用户 我这里用户名为copyuser,注意这里的ip是从库服务器的ip
CREATE USER 'copyuser'@'192.168.0.162' IDENTIFIED WITH mysql_native_password BY '123456';
--给主从复制账号授权
grant replication slave on *.* to 'copyuser'@'192.168.0.162';
3) 重启主库的mysql
service mysqld restart
4) 再次登录mysql,使用如下指令查看master的状态:
--登录
mysql -u root -p密码
--查看master的状态
show master status;
结果类似如下:我们需要关注File和Position的信息,后面要用到。
2、slave从库配置
1) 在从库 /etc/my.cnf
mysql核心配置文件的[mysqld]
节点内,新增如下配置:
[mysqld]
## 设置server_id,注意要唯一
server_id=2
## 开启binlog,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
## 如果需要同步函数或者存储过程
log_bin_trust_function_creators=true
## binlog缓存
binlog_cache_size=1M
## binlog格式(mixed、statement、row,默认格式是statement)
binlog_format=mixed
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
2) 重启从库的mysql
service mysqld restart
3) 从库执行同步
--1,先登录mysql,然后执行后续代码
mysql -u root -p密码
--2,关闭从库
stop slave;
--3,设置同步,注意这里是主库ip,日志名称和位置是我们之前上图中看到的名称和位置
change master to master_host='192.168.0.161',master_user='copyuser',master_password='123456',master_log_file='mysql-bin.000004',master_log_pos=157;
--4,开启从库
start slave;
-- 5,检查服务器状态
show slave status \G;
显示正常结果如下:
看到Slave_IO_Running: Yes,Slave_SQL_Running: Yes
Replica has read all relay log; waiting for more updates
基本说明配置成功了,已经开始了主从复制
3、测试主从MySQL8复制功能
测试就非常简单了,在主库的表中新增一条数据,然后打开从库的对应表,发现也有了一样的记录数据,说明就复制成功了。
4、可能出现的错误问题解答
1) mysql主从配置之后,重启后出现Slave failed to initialize relay log info structure from the repository
解决方法:在start slave之前,先启用
reset slave
2) 集群中 id 重复 mysql equal_master and slave have equal MySQL server ids
注意所有主从中my.cnf文件节点中 server_id 是否重复,可在mysql中使用一下命令查看 server_id设置是否生效
mysql> show variables like 'server_id';
可通过一下命令通过sql设置 server_id
set global server_id=1;
3) 同步出错
使用下面sql查看具体错误
select * from performance_schema.replication_applier_status_by_worker;