一.理解主从复制
主从复制中分为「主服务器(master)「和」从服务器(slave)」,「主服务器负责写,而从服务器负责读」,Mysql的主从复制的过程是一个「异步的过程」。
这样读写分离的过程能够是整体的服务性能提高,即使写操作时间比较长,也不影响读操作的进行。
原理:
主要基于MySQL二进制日志
主要包括三个线程(2个I/O线程,1个SQL线程)
1、MySQL将数据变化记录到二进制日志中;
2、Slave将MySQL的二进制日志拷贝到Slave的中继日志中;
3、Slave将中继日志中的事件在做一次,将数据变化,反应到自身(Slave)的数据库
详细步骤:
1、从库通过手工执行change master to 语句连接主库,提供了连接的用户一切条件(user 、
password、port、ip),并且让从库知道,二进制日志的起点位置(file名 position 号); start
slave
2、从库的IO线程和主库的dump线程建立连接。
3、从库根据change master to 语句提供的file名和position号,IO线程向主库发起binlog的请求。
4、主库dump线程根据从库的请求,将本地binlog以events的方式发给从库IO线程。
5、从库IO线程接收binlog events,并存放到本地relay-log中,传送过来的信息,会记录到
master.info中
6、从库SQL线程应用relay-log,并且把应用过的记录到relay-log.info中,默认情况下,已经应用过的
relay 会自动被清理purge
二.完成主从复制
主库配置
1.配置参数
vim /etc/my.cnf
[mysqld]
log_bin = mysql-bin
server_id = 128
2.重启数据库
[root@localhost ~]# systemctl restart mysqld
3.建立同步账号
ps:这里的ip段写自己的
mysql>grant replication slave on *.* to 'rep'@'192.168.216.%' identified by'RedHat@123';
mysql>show grants for 'rep'@'192.168.216.%';
4.锁表设置只读
为后面备份准备,注意生产环境要提前申请停机时间;
mysql> flush tables with read lock;
mysql> show variables like '%timeout%';
测试锁表后是否可以创建数据库:
5.查看主库状态
查看主库状态,即当前日志文件名和二进制日志偏移量
mysql> show master status;
6.备份数据库数据
这里的/server/backup文件是自己创建的
-p后密码写自己的这里我的密码是RedHat@123
[root@localhost ~]# mkdir -p /server/backup
[root@localhost ~]# mysqldump -uroot -pRedHat@123 -A -B |gzip > /server/backup/mysql_bak.$(date +%F).sql.gz
mysql> unlock tables;
8.主库备份数据上传到从库
这里的ip写自己从库的ip地址
并在从库里面也要创建/server/backup
[root@localhost ~]# scp /server/backup/mysql_bak.2023-07-25.sql.gz 192.168.95.129:/server/backup/
从库上设置
1.设置server-id值(为自己主机ip的最后如我的ip为192.168.216.129参数为129)并关闭binlog参数
vim /etc/my.cnf
#log_bin = /data/mysql/data/mysql-bin
server_id = 129
重启数据库:
2.还原从主库备份数据
#cd /server/backup/
#gzip -d mysql_bak.2023-07-25.sql.gz
检查还原:
#mysql -uroot -p < mysql_bak.2023-07-25.sql.gz
#mysql -uroot -p -e 'show databases;'
3.设定从主库同步
mysql> change master to
MASTER_HOST='192.168.95.128',-----主库ip
MASTER_PORT=3306,
MASTER_USER='rep',
MASTER_PASSWORD='RedHat@123',----数据库密码
MASTER_LOG_FILE='mysql-bin.000002',----master的二进制日志
MASTER_LOG_POS=440;
(用show master status;)我对应得就是如下
4.启动从库同步开关
mysql> start slave;
检查状态:
mysql> show slave status\G