MYSQL主从同步----1、基于binlog 2、基于gtid
目录
前提(无论是基于binlog还是基于gitd)
一、对MySQL主从同步的了解
1、MySQL支持的复制类型
2、为什么要做主从复制
3、主从复制原理---面试会考
二、基于binlog的主从同步
1、主库上的操作
1)配置文件
2)备份数据库(如果没有数据库则不用)
3)授权用户(在mysql下)
4)查看主库上的用户
2、从库上的操作(两个从库上都要操作)
1)配置文件
2)还原主库备份(如果步骤1的2)没有操作则不用)
3)设置从库的change master
4)开启主从库并查看是否配置成功
3、验证是否同步
二、基于gitd主从同步
1、在vim /etc/my.cnf里写入
2、从库配置change master 有两种方法
3、启动·主从配置
4、验证(验证方法与binlog一样)
前提(无论是基于binlog还是基于gitd)
主库与从库都要安装MySQL(安装方式看自己)----这里使用在线安装
[root@localhost ~]# dnf install -y mysql-server.x86_64
[root@localhost ~]# systemctl start mysqld
注意主库与从库的系统得一致(比如都是openeuler系统或者其他)
一、对MySQL主从同步的了解
MySQL内建的复制功能是构建大型,高性能应用程序的基础 通过将MySQL的某一台主机(master)的数据复制到其他主机(slaves)上,并重新执行一遍来执行 复制过程中一台服务器充当主服务器,而其他一个或多个其他服务器充当从服务器
1、MySQL支持的复制类型
基于语句(statement)的复制 在主服务器上执行SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。 基于行(row)的复制 把改变的内容复制过去,而不是把命令在从服务器上执行一遍。从MySQL 5.0开始支持。 混合型(mixed)的复制 默认采用基于语句的复制,一旦发现基于语句的无法精确复制时,就会采用基于行的复制。
2、为什么要做主从复制
灾备 数据分布 负载平衡 读写分离 提高并发能力
3、主从复制原理---面试会考
主要基于MySQL二进制日志 主要包括三个线程(2个I/O线程,1个SQL线程)
· 1、MySQL将数据变化记录到二进制日志中;
· 2、Slave将MySQL的二进制日志拷贝到Slave的中继日志中;
· 3、Slave将中继日志中的事件在做一次,将数据变化,反应到自身(Slave)的数据库
二、基于binlog的主从同步
这里用一主二从来操作
1、主库上的操作
1)配置文件
#进入文件输入 server_id=1 (id写自己的ip)
[root@openeuler ~]# vim /etc/my.cnf
#重新启动mysql
[root@localhost ~]# systemctl restart mysqld
2)备份数据库(如果没有数据库则不用)
#db1为表 school为数据库
[root@openeuler ~]# mysqldump --opt -B db1 it school > db.sql
3)授权用户(在mysql下)
mysql> create user rep@'172.16.%.%' identified with mysql_native_password by '123456';
mysql> grant replication slave on *.* to rep@'172.16.%.%';
# *.*表示 所有数据库.所有表
4)查看主库上的用户
#记住自己的Flie 和 position
mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000002 | 678 | | | |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
2、从库上的操作(两个从库上都要操作)
1)配置文件
#进入文件输入 server_id=1 (id写自己的ip)
[root@client ~]# vim /etc/my.cnf
#重新启动mysql
[root@client ~]# systemctl restart mysqld
2)还原主库备份(如果步骤1的2)没有操作则不用)
[root@client ~]#mysql -uroot -pMySQL@123 < db.sql
3)设置从库的change master
#master_host----主库的ip
#master_user----在授权用户时设置的 主库的用户
#master_password----在授权用户时设置的密码
#master_log_file----前面要求注意记住的flie名
#master_log_pos----前面要求注意记住的position
mysql> change master to
-> master_host='192.168.131.20',
-> master_user='rep',
-> master_password='123456',
-> master_log_file='binlog.000002',
-> master_log_pos=678;
Query OK, 0 rows affected, 8 warnings (0.01 sec)
4)开启主从库并查看是否配置成功
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> show slave status;
这里注意出现两个yes才是配置成功
出现以下这种情况则是配置失败,解决方式如下
[root@client ~]# mysqladmin -urep -p123456 -h192.168.131.20 ping
如果又出现以下的情况
就是防火墙没有关把防火墙关了就行了(主从库都关)-----systemctl stop firewalld
3、验证是否同步
在主库上建立一个数据库或者表看从库上是否同步(这里以建立数据库为例)
#在主库上先查看已有的数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
#创建一个school的数据库
mysql> create database school;
Query OK, 1 row affected (0.00 sec)
在从库上查看是否有该数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| school |
| sys |
+--------------------+
5 rows in set (0.00 sec)
二、基于gitd主从同步
如果前有用主从同步得需要关闭(在mysql上)----stop slave;
配置与binlog差不多
1、在vim /etc/my.cnf里写入
#开启gtid
gtid_mode=ON
enforce-gtid-consistency=ON
主库一样
2、从库配置change master 有两种方法
#方法一
mysql> CHANGE MASTER TO
> MASTER_HOST = '192.168.131.20',
> MASTER_PORT = 3306,----可以不用写
> MASTER_USER = 'rep',
> MASTER_PASSWORD ='12456',
> MASTER_AUTO_POSITION = 1;
Or from MySQL 8.0.23:
#方法二
mysql> CHANGE REPLICATION SOURCE TO
> SOURCE_HOST ='192.168.131.20',
> SOURCE_PORT = 3306,----可以不用写
> SOURCE_USER = 'rep',
> SOURCE_PASSWORD = '123456',
> SOURCE_AUTO_POSITION = 1;
3、启动·主从配置
mysql> START SLAVE;
Or from MySQL 8.0.22:
mysql> START REPLICA;
#查看
mysql> START SLAVE STATUS;
4、验证(验证方法与binlog一样)
在主库上
#创建数据库以及表并写内容
mysql> create database school;
Query OK, 1 row affected (0.00 sec)
mysql> use school;
Database changed
mysql> CREATE TABLE `Student` (
-> `Sno` int(10) NOT NULL COMMENT '学号', `Sname` varchar(16) NOT NULL CMMENT '姓名',
-> `Ssex` char(2) NOT NULL COMMENT '性别', `Sage` tinyint(2) NOT NULL DEAULT '0' COMMENT '学生年龄',
-> `Sdept` varchar(16) DEFAULT 'NULL' COMMENT '学生所在系别', PRIMARY KE (`Sno`)
-> ) ;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
mysql> INSERT INTO `Student` VALUES (1, '陆亚', '男', 24, '计算机网络'),(2, 'to', '男', 26, '英语'),(3, '张阳', '男', 21, '物流管理'), (4, 'alex', '女', 22, '电子商务');
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0
在从库上查看是否有(可以看到就说明同步成功)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| school |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> select * from Student;
+-----+--------+------+------+-----------------+
| Sno | Sname | Ssex | Sage | Sdept |
+-----+--------+------+------+-----------------+
| 1 | 陆亚 | 男 | 24 | 计算机网络 |
| 2 | tom | 男 | 26 | 英语 |
| 3 | 张阳 | 男 | 21 | 物流管理 |
| 4 | alex | 女 | 22 | 电子商务 |
+-----+--------+------+------+-----------------+
4 rows in set (0.00 sec)