MySQL主从复制
1. 原理

主bin-log 从relay-log
主dump 从io、sql
两个日志(master的bin-log和slave的relay log)
三个线程(master的dump线程、slave的io线程和sql线程)
1.master(主服务器)执行DDL或DML语句时,会记录bin-log
2.bin-log写入成功后,dump线程会通知slave(从服务器)节点
3.slave使用io线程读取master的bin-log日志,并写入relay log中
4.slave使用sql线程将relay log中新添加的内容转换为SQL语句并执行,从而实现从节点(slave)与主节点(master)的数据一致
线程是进程中任务最小执行单元,一个进程中可以包含多个线程,执行相同或不同的功能,实现多线程并发执行。
master服务器开启了一个dump线程,slave服务器开启了一个IO线程和一个SQL线程。
2. 主从复制的作用
1.实时备份:主服务器实时备份数据到从服务器,主服务器中数据丢失时,可以重从服务中恢复数据。
2.读写分离:主服务器负责写(insert\delete\update),从服务器主要负责读(select)的操作。
3.高可用集群:当主服务器突然下线,从服务器可以很快的接替主服务器的功能。
4.负载均衡:将原本一台服务器处理的请求分发给多台服务器去处理,适用于高并发场景,防止单台服务器负载过高崩溃。
3. 主从复制的核心目标
1.读写分离:主库承担写操作,从库分担读压力(如查询),提升系统吞吐量;
2.数据备份:从库作为主库的副本,避免单库故障导致数据丢失;
3.高可用:主库故障时,可切换到从库继续提供服务(需配合故障转移工具);
4.负载均衡:多从库架构下,将读请求分散到不同从库,降低单库压力。
安装Mysql
1. 上传mysql rpm包
下载地址https://cdn.mysql.com/archives/mysql-8.0/mysql-8.0.36-1.el7.x86_64.rpm-bundle.tar
2. 解压安装包
tar -xvf mysql-8.0.36-1.el7.x86_64.rpm-bundle.tar
3. 卸载多余的依赖包
yum remove mysql-libs
4. 执行安装
rpm -ivh mysql-community-client-plugins-8.0.36-1.el7.x86_64.rpm
rpm -ivh mysql-community-common-8.0.36-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-8.0.36-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-8.0.36-1.el7.x86_64.rpm
rpm -ivh mysql-community-icu-data-files-8.0.36-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-8.0.36-1.el7.x86_64.rpm5. 删除安装包
rm -rf ./*.rpm
6. 指定模式
echo -e "sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"" >> /etc/my.cnf
7. 启动服务
systemctl start mysqld
8. 获取初始密码
cat /var/log/mysqld.log
9. 使用初始密码登录
mysql -uroot -p初始密码
10. 修改root密码
alter user 'root'@'localhost' identified by '新密码';
11. 开启mysql的root用户远程访问
use mysql;
update user set host = '%' where user = 'root';
flush privileges;Mysql卸载
systemctl stop mysqld
yum remove mysql mysql-server
rpm -e mysql-server
rpm -e mysql
rm -rf /var/lib/mysql
rm /etc/my.cnfMysql配置主从同步
主库:
1. 开启binlog
编辑/etc/my.cnf配置文件, 在[mysql]块下添加内容, 然后重启mysql服务:
# 开启binlog
log-bin=mysql-bin
# id, 要求唯一
server_id=1
# 要同步的库名, 多个库名用英文逗号间隔
binlog-do-db=by_test2. 导出主库数据, 多个库名之间空格间隔
mysqldump -uusername -ppassword -h 127.0.0.1 by_test > /opt/by_test.dump
导出的dump文件备用
3. 获取主库目前的binlog状态
先登录主库mysql:
mysql -uusername -ppassword -h 127.0.0.1
刷新到最新log
flush logs;
获取当前状态
show master status;
保留file和position的值备用从库:
1. 编辑/etc/my.cnf配置文件, 在[mysql]块下添加内容, 然后重启mysql服务:
# id, 要求唯一
server_id=2
# 要复制的库名, 多个库名用英文逗号间隔, 不写则同步所有可以同步的库
replicate-do-db=by_test2. 创建要导入的库, 库名和主库保持一致
create database xxx;
3. 导入主库的备份数据到从库
mysql -uusername -ppassword by_test < /opt/by_test.dump
4. 准备同步
先登录从库数据库
mysql -uusername -ppassword -h 127.0.0.1
执行change master to 语句
CHANGE MASTER TO MASTER_HOST='主库IP', MASTER_USER='主库用户名', MASTER_PASSWORD='主库密码', MASTER_LOG_FILE='主库binlog状态的file值', MASTER_LOG_POS=主库binlog状态的position值;5. 执行同步命令
start slave;
6. 查看同步状态
show slave status;