mysql主从复制

发布于:2025-05-14 ⋅ 阅读:(12) ⋅ 点赞:(0)

1、主从复制介绍及原理
主从复制用于提高mysql数据的安全性。
主从复制是mysql架构的基石。

主从复制原理
    1.在每个事务更新数据完成之前,master将这些改变记录进二进制日志。写入二进制日志完成后,master通知存储引擎提交事务。
    2.slave将master的binary log复制到其中继日志(relay log)。首先,slave开始一个工作线程--i/o线程,i/o线程在master上打开一个普通的连接,然后开始binlog dump process。binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。i/o线程将这些时间写入中继日志。
    3.sql slave thread(sql 从线程)处理该过程的最后一步。sql线程从中级日志读取事件,并重放其中的事件而更新slave数据,使其与master中的数据保持一致。只要该线程与i/o线程保持一致,中继日志通常会位于os的缓存中,所以中继日志的开销很小。复制过程有一个很重要的限制,即复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。

2、示范

mysql8.0主从复制
一、实验环境:
Euler101 master 关闭防火墙及selinux
Euler102 slave1 关闭防火墙及selinux
Euler103 slave2 关闭防火墙及selinux

systemctl stop firewalld

setenforce 0

systemctl disable firewalld

sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/sysconfig/selinux

二、101.102.103安装mysql8.0
tar zxf mysql-8.0.33-linux-glibc2.28-x86_64.tar.gz  -C /usr/local/   # 解压到指定目录

cd /usr/local/				# 切换到解压目录

ls					# 查看文件

mv mysql-8.0.33-linux-glibc2.28-x86_64/ mysql # 重命名文件夹

groupadd mysql				# 创建运行组

useradd -M -s /sbin/nologin -g mysql mysql # 创建运行用户

/usr/local/mysql/bin/mysqld --initialize --user=mysql --
basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/ # 初始化mysql,最后一行会生成随机密码 root@localhost: rfHhKaMEy6=%

注意:如果初始化失败,显示“No such ... directory” 说明缺少依赖包,用dnf -y install libaio安装即可。

echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile #增加环境变量,在任何地方都可使用mysql

. /etc/profile 				# 重载环境变量

vim /etc/my.cnf				# 编写启动文件
[mysqld]
basedir=/usr/local/mysql/		# 软件所在目录
datadir=/usr/local/mysql/data/		# 数据所在目录

cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld #将mysql启动脚本复制到系统服务下命名为mysqld

vim /etc/init.d/mysqld
basedir=/usr/local/mysql/		# 添加内容
datadir=/usr/local/mysql/data/		# 添加内容

chmod +x /etc/init.d/mysqld		# 给启动脚本执行权限

chkconfig --add mysqld			# 增加系统服务mysqld

chkconfig mysqld on			# 开机自启动系统服务mysqld

service mysqld start			# 启动mysql
# 启动成功显示的信息
Starting MySQL.Logging to '/usr/local/mysql/data/localhost.localdomain.err'.
.. SUCCESS! 				

mysql -uroot -p 			# 使用上面生成的随机密码登录

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'pwd123';	# 修改root密码为pwd123

mysql -uroot -ppwd123			# 登录验证,成功。

三、配置主从复制
101(主)
vim /etc/my.cnf
server-id=11				# 服务id
log-bin=master-bin			# 日志文件名字为master

service mysqld restart			# 重启mysql

/usr/local/mysql/data/			# 这里能看到master-bin.000001。

create user 'ooos'@'192.168.10.%' identified with mysql_native_password by '123456';	# 创建用户ooos,密码为123456

grant replication slave on *.* to 'ooos'@'192.168.10.%'; # 授予从复制权限

flush privileges;			# 刷新权限

show master status; 			# 查看主状态

102、103(从1,从2)
vim /etc/my.cnf
server-id=22				# 服务id与主不同即可

service mysqld restart			# 重启mysql

change master to master_host='192.168.10.101',master_port=3306,master_user='ooos',master_password='123456',master_log_file='master-bin.000001',master_log_pos=849;	# 连接主

start slave;				# 开启从
show slave status\G 			# 查看从状态
Slave_IO_Running: Yes		# IO线程
Slave_SQL_Running: Yes		# SQL线程

注意:如果IO线程显示为no,先停止从,再重载从,最后启动从就可以。
        stop slave
        reset slave
        start slave
	


四、验证主从复制
主,从1,从2:
show databases					# 查看数据库
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
主:
create database ooos;				# 创建数据库
show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| ooos               |
| performance_schema |
| sys                |
+--------------------+
use ooos;					# 使用数据库
create table t_user(id int,name varchar(20));	# 创建表t_user
insert into t_user values(1,'ooos');		# 插入数据'1','ooos'
select * from t_user;				# 查询t_user数据
+------+------+
| id   | name |
+------+------+
|    1 | ooos |
+------+------+

从1,从2:
show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| ooos               |
| performance_schema |
| sys                |
+--------------------+

select * from ooos.t_user;
+------+------+
| id   | name |
+------+------+
|    1 | ooos |
+------+------+