mysql主从复制
# Mysql 主从复制说明
主从复制前提准备:
主库需要开启二进制日志,一旦启用二进制日志后,它的数据库中所有操作都会以“事件”的方式记录在二进制日志中,而这个二进制保留着用户对数据库的所有“增删改”操作,
创建一个用来slave 和master 复制用户账号
需要告知slave,master 二进制日志文件名,和position位置点
slave 启用slave 服务
使用master 分配的复制用户读取master
修改server-id,这个id 如果只做主从可以不修改,但如果要做 MHA高可用 就必须修改
主从复制过程:
主从就是从库通过一个IO线程与主服务器保持通信,并监控master的二进制日志文件的变化,一旦主库有修改,则会把变化复制到自己的中继日志中,从库的SQL线程会把相关的事件执行到自己的数据库中,来实现与主库的数据一致性。
主从延迟,当主库执行操作也会立即把二进制日志复制到从库,只是执行sql 会根据设定时间延迟执行sql 语句
主从复制实现原理图图片来自网图😅
# 主从复制实践
通过上一篇咋们知道怎么去做数据库的备份,而主从就是通过一次全备,再通过设置position点,进行实时同步
主从复制有两种可行方法,
第一种 是通过逻辑全备,然后通过查看日志,做主从。
第二种 是通过xtrabackup 全备 ,记录slave position 位置信息,做主从,相对第一种更加方便快速
- 1,检查配置文件,my.cnf,是否都有配置
log-bin = mysql-bin
binlog_format = mixed #日志混合模式
server-id = 112
log-bin = /opt/mysql/logs/mysql-bin.log
2
3
4
- 2,主库创建复制用户
mysql> grant replication slave on *.* to rep@'192.168.%' identified by 'yfk123';
mysql-8.0
需要修改密码加密方式
select host,user,ssl_type,ssl_cipher,x509_issuer,x509_subject,plugin from mysql.user;
ALTER USER 'rep'@'%' IDENTIFIED BY 'yfk123' PASSWORD EXPIRE NEVER;
ALTER USER 'rep'@'%' IDENTIFIED WITH mysql_native_password BY 'yfk123';
2
3
4
- 3,数据库全备
方式一:逻辑全备
mysqldump -uroot -p -R --single-transaction --master-data=2 --flush-privileges --flush-logs --all-databases > full_all_db.sql
方式二:物理冷备
innobackupex --user root --password yfk123 --host 192.168.14.144 --slave-info /opt/backup/full-mysql --no-timestamp
- 3,从库操作-修改my.cnf配置,导入数据到从库
log-bin = mysql-bin
binlog_format = mixed #日志混合模式
server-id = 113
log-bin = /opt/mysql/logs/mysql-bin.log
2
3
4
- 4,查看position 位置点
逻辑备份查看
head -30 full_all_db.sql |grep -n MASTER_LOG_FILE=
物理备份查看
- 5,登录从库,配置主库连接信息
mysql >
CHANGE MASTER TO
MASTER_LOG_FILE='mysql-bin.000008',
MASTER_LOG_POS=120,
MASTER_HOST='192.168.14.144',
MASTER_USER='rep',
MASTER_PASSWORD='yfk123';
2
3
4
5
6
7
记录:主从延迟600s,按需求添加是否需要该参数 change master to master_delay=600;
- 6,启动从库,检查主从状态
start slave;
show slave status\G
如果地址配置错了,可以执行:stop slave;
修改完,启动slave ,检查即可
检查是否启动正常
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0 #同步延迟,一般如果数据量大,会出现一段时间,这个数字不为0,会慢慢的跟主库一致之后,才为0,当从库有压力,或者从库表锁了,也会不为0
- 7,设置从库为只读,从库不能写入数据,一旦写入,主从就会立即失败
注意:set global read_only=1 对拥有super权限的账号是不生效的,所以在授权账号的时候尽量避免添加super权限
mysql> show global variables like "%read_only%";
mysql> set global read_only=1;
2
3
4
记录
全局表锁:flush tables with read lock;
解锁:unlock tables ;