参考链接:MySQL主从介绍_rain_yunlx的博客-CSDN博客
Linux下搭建Mysql主从复制详细步骤(Mysql版本5.7.35)_linuxmysql主从_Direct_的博客-CSDN博客
Linux环境MySQL数据库主从复制保姆级教程_linux主从复制_小学生波波的博客-CSDN博客(参照这个即可)
也可参考这个:MySQL主从配置详解 - 简书
1.msyql主从又叫做replication,AB复制。A、B两条机器做主从后,在A上写数据,另一台B也会跟着写数据,两者数据实时同步。
2.mysql主从是基于binlog的,主服务器上必须开启binlog才能进行主从。
binlog:是一个二进制文件,用于记录用户对数据库更新的SQL语句信息,例如更改数据库表和更改内容的SQL语句都会记录到binlog里,但是不会记录查询语句。
3.主从复制过程
(1)Slave上的IO_thread连接上Master,并请求从指定日志文件的指定位置或者从最开始的日志之后的日志内容。
(2)Master接收到来自Slave的IO_thread的请求后,通过负责复制的IO进程根据请求信息读取指定日志指定位置之后的日志信息,返回给Slave的IO_thread。返回信息中除了日志所包含的信息之外,还包括本次返回的信息已经到Master端的bin-log file以及bin-log pos.
(3)Slave的IO_thread接收到信息后,将接收到的日志内容依次天机到Slave端的relay-log文件的最末端,并将读取到的Master端的bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉Master要从哪个binlog的哪个位置开始往后的日志内容发送给Slave。
(4)Slave的sql_thread检测到relay-log中新增加了内容后,会马上解析relay-log的内容成为Master端真实执行时候的那些可执行的内容,并在数据库中执行。
5.mysql支持的肤质类型
(1)基于语句的复制:在主服务器上执行的SQL语句,在从服务器上执行同样的语句;Mysql默认采用基于语句的复制,小吕比较高。
(2)基于行的复制:把改变的内容复制过去,而不是把命令在服务器上执行一遍
(3)混合类型复制:默认采用基于语句的复制,一旦发现语句无法精确复制时,就会采用基于行的复制。
6.应用场景
(1)从服务器作为主服务器的实时数据备份
(2)主从服务器实现读写分析(主写从读),从服务器实现负载均衡
(3)把多个服务器根据业务重要性进行拆分访问(从服务器根据业务进行拆分)
首先准备两台机器,A和B, A主B从,每台机器上都安装了mysql,并将mysql启动;
第一步: 修改主机名并配置主机映射:
[root@localhost ~]# hostnamectl set-hostname mysql1
[root@localhost ~]# hostnamectl set-hostname mysql2
两个节点配置/etc/hosts文件,修改为如下: #ip地址应改成自己主机对应的ip
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.30.11.12 mysql1
172.30.11.13 mysql2
第二步:两台主机都关闭防火墙和SELinux服务
关闭防火墙命令如下:
systemctl stop firewalld //关闭防火墙
systemctl disable firewalld //将防火墙设置开机不自启
关闭selinux服务
vi /etc/selinux/config //进入到此目录下将selinux的状态设置为disabled
(1)修改A机器的mysql配置
vim /etc/my.cnf
(2)添加如下内容
#配置唯一的服务器ID,一般使用IP最后一位
server-id=100
#开启log-bin二进制日志
log-bin=/var/log/mysql/mysql-bin
#添加,允许从服务器更新二进制日志
log-slave-updates=true
#下面这两个不是必须要配置 #主要是为了使用带事务的InnoDB进行复制设置时尽可能 提高持久性和一致性
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
(3) 修改完保存后重新加载配置文件
/etc/init.d/mysqld restart 或者 systemctl start mysql
登录mysql:mysql -uroot -p
(4)重启完成后mysql目录下会生产两个文件 mysql-bin开头的文件是实现主从的根本
(5)创建mysql用户,用户名为testuser,密码为testpasswd
以下都在mysql中执行,
create user 'repl'@'slave_ip' identified by '1234';
或者:
在主库上建立用于主从复制的账号
mysql> CREATE USER 'rep1'@'%';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'rep1'@'%' identified by 'password';
查看主库的二进制日志的名称:
mysql> show master status\G
(6)保持状态
flush tables with read lock;
(7)记住 File和Position,执行命令show master status;
在从库上面测试之前建立的复制账号是否可以连接主库:
mysql -urep1 -p'password' -h192.168.169.131
(1)配置server ID,需要和主不一样
vim /etc/my.cnf
添加如下的内容:
server-id=200
#添加,开启中继日志,从主服务器上同步日志文件记录到本地
relay-log=relay-log-bin
#添加,定义中继日志文件的位置和名称
relay-log-index=slave-relay-bin.index
(2)修改完配置文件后,重启mysqld服务
/etc/init.d/mysqld restart 或者 systemctl start mysql
(3)将A机器上的备份数据库都拷贝到B机器上,我的备份都存放在/tmp目录下,且都是sql结尾的文件
scp 192.168.177.100:/tmp/*.sql /tmp/
(4)拷贝完A的数据库后在B上创建相对应的数据库
create database zrlog;
create database wordpress;
(5)在B机器上恢复数据库
mysql zrlog < /tmp/zrlog.sql
mysql wordpress < /tmp/wordpress.sql
(6)B机器登陆mysql,执行命令
stop slave;
(7)change master:
# 配置同步,注意 master_log_file 和 master_log_pos 的值要与Master的一致
mysql> CHANGE MASTER TO MASTER_HOST='192.168.169.131',MASTER_USER='rep1',MASTER_PASSWORD='password',MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=682;
# 启动同步,如有报错执行 reset slave;
mysql> start slave;
(8)开始服务
start slave;
(9)如何判断主从是否配置成功
使用命令mysql> show slave status\G