Mysql DBA学习笔记(主从复制)
一、核心概念
主从复制指:将主数据库的DDL和DML语句通过二进制日志(Binlog)传到从库服务器中,然后在从库上面对这些日志再重新执行一遍,从而使从库和主库的数据保持同步,从而实现数据转移、读写分离、数据备份。
Mysql的主从复制是一个异步的复制过程。
mysql中,支持一台主库同时向多台从库进行复制,从库也可以同时作为其他从服务器的主库,从而实现链状复制。
二、原理
步骤:
1、2)主库进行增删改操作 / 执行DDL语句时,将所有数据变更记录到二进制日志中。
3)从库的IO线程发出请求读取主库的binlog日志。
4、5)从库的IO线程会将主库的binlog日志写到从库自己的relay log中继日志中。
6、7)从库的另一个sql thread线程读取relay log日志中记录的数据变化,并同步到从库自己数据库的数据变化。
注:二进制日志不记录select这种查询语句,二进制日志默认的ROW日志格式记录的是每行的数据变更。
三、主从复制的搭建
1)服务器准备
- 主库:192.168.200.200
- 从库:192.168.200.201
- Mysql版本:8.0及以上版本
两台服务器都开放指定3306端口号:
firewall-cmd --zone=public --add-port=3306/tcp -permanent
firewall-cmd -reload
2)主库配置
- 修改主库配置文件
vim /etc/my.cnf
# mysql 服务ID,保证在整个集群环境中它是唯一,默认为1
server-id=1
# 是否只读,1 代表只读,0 代表读写
read-only=0
# 开启二进制日志
log-bin=mysql-bin
-- 二选一
# 设置需要同步的数据库
binlog-do-db=db01
# 设置不需要同步的数据库
binlog-ignore-db=mysql(忽略系统库)
- 重启mysql服务
systemctl restart mysqld
- 创建复制用户
# 创建账户,作用:授予从库连接主库并读取二进制日志
# 创建用户和密码,使用户能从任意主机上连接mysql服务
create user 'user1'@'%' identified by 'password'(这里'%'代表任意主机,也可以指定特定主机'192.168....‘’)
# 给用户分配主从复制权限
grant replication slave on *.* to 'user1'@'%'
# 查看主库状态
show master status
File :最终写入哪个二进制日志文件
Position :写入位置
3)从库配置
- 修改从库配置文件
vim /etc/my.cnf
# mysql 服务ID,保证在整个集群环境中它是唯一,默认为1,从库与主库不一样即可
server-id=2
# 是否只读,1 代表只读,0 代表读写,从库只需要查询不需要写入
read-only=1
# 开启relay log中继日志
relay-log=mysql-relay
- 重启mysql服务
systemctl restart mysqld
- 配置主从关系
change replication source to
source_host='xxx.xxx',
source_user='xxx',
source_password='xxx',
source_log_file='xxx',
source_log_pos=xxx;
8.0.23之前的版本:
change master to
master_host='192.168.200.200',master_user='user1',
master_password='password',
master_log_file='xxx', -- 使用show master status 查看到"File"对应的值
master_log_pos=xxx; -- 使用show master status 查看到"Position"对应的值
- 开启同步
start replica; -- 8.0.22之后
start slave; -- 8.0.22之前
- 查看主从同步状态
show replica status\G; -- 8.0.22之后
show slave status\G; -- 8.0.22之前
(其中 "\G" 表示将数据列转化为行显示)
- 验证主从同步
主要看:
Replica_IO_Running
Replica_SQL_Running
是否都正常
4)同步失败处理
-- 查看错误信息
show slave status\G
-- 解决方案
1. 跳过错误
set global SQL_SLAVE_SKIP_COUNTER = 1;
start slave;
2. 重置从库
stop slave;
reset slave;
start slave;
参考作者/文章:
黑马程序员 - Mysql数据库从入门到精通
博客园 - https://www.cnblogs.com/it-feiyu/p/18630316