MySQL数据库主从复制原理及作用分析
作者:神慕蔡蔡 发布时间:2024-01-26 11:42:14
目录
1.数据库主从分类:
2.mysql主从介绍由来
3.主从作用
4.主从复制原理
5.主从复制配置(数据一致时)
5.1主从服务器分别安装mysql5.7
5.2主数据库与从数据库数据一致
5.3在主数据库里创建一个同步账号授权给从数据库使用
5.4在从库上测试连接
5.5配置主数据库
5.6配置从数据库
5.7配置并启动主从复制的功能(mysql02从数据库上)
5.8测试:
主库:
从库:
主库创建数据库clq并且加入数据:
从库中查看:
6.主从配置(数据不一致时)
6.1一般全备主库需要另开一个终端,给数据库加上读锁(只读不写)
6.2确保主主数据库与从数据库的数据一样
6.3在从库上查看主库有哪些库,确保一致
6.4确保俩库的配置文件已经配置了相应的文件
1.数据库主从分类:
主从分为俩种:传统主从/GTID主从
2.mysql主从介绍由来
现实生活中,数据极其重要,存储数据库的方式很多,但是数据库存在着一种隐患。
隐患:
用一台数据库存放数据,若数据库服务器宕机了导致数据丢失数据多了,访问量大了,一台服务器无法保证服务质量
因此数据库主从诞生
3.主从作用
故障切换,实现预备读写分离,提供查询服务数据库管理系统备份(DBSM),避免影响业务
4.主从复制原理
bin log:二进制日志,记录写操作(增删改查)
Relay log:中继日志
主库会将所有的写操作记录到binlog日志下生成一个log dump线程,将binlog日志传给从库的I/O线程。
从库有俩个线程:
I/O线程
sql线程从库的I/O线程会请求主库得到binlog日志写到relay log(中继日志)中
sql线程,会读取relay log日志文件中的日志,并解析具体操作,来实现主从的操作一样,达到数据一致
5.主从复制配置(数据一致时)
步骤:
确保主数据库与从数据的数据一样
主数据库里创建一个同步账号授权给从数据库使用
配置主数据库(修改配置文件)
配置从数据库(修改配置文件)
环境需求:
俩台mysql服务器,一台主服务器(写功能),一台从服务器(读功能)
主数据库(centos8) ip地址:192.168.136.145 centos8.0/mysql5.7 相同数据
第六节:数据不相同 (可能在公司之前有数据的情况)
从数据库(centos8) ip地址:192.168.136.191 centos7.0/mysql5.7 相同数据
5.1主从服务器分别安装mysql5.7
可看相关教程教程(超详细):https://www.jb51.net/article/221946.htm
#二进制安装:https://blog.csdn.net/qq_47945825/article/details/116848970?spm=1001.2014.3001.5501
#或者网络仓库安装:(一般二进制安装)
https://blog.csdn.net/qq_47945825/article/details/116245442?spm=1001.2014.3001.5501
5.2主数据库与从数据库数据一致
[root@mysql01 ~]# mysql -uroot -e 'show databases;'
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
[root@mysql02 ~]# mysql -uroot -e 'show databases;'
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
5.3在主数据库里创建一个同步账号授权给从数据库使用
replication:复制 slave:从 192.168.136.191:从数据库ip地址
mysql> create user 'vvv'@'192.168.136.191' identified by 'vvv0917';
Query OK, 0 rows affected (0.00 sec)
mysql> grant replication slave on *.*to 'vvv'@'192.168.136.191';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
5.4在从库上测试连接
[root@mysql02 ~]# mysql -uvvv -vvv0917 -h192.168.136.145
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.00 sec)
5.5配置主数据库
[root@mysql01 ~]# cat /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
pid-file = /opt/data/mysql.pid
user = mysql
skip-name-resolve
log-bin=mysql_bin #启动binlog日志
server-id=10 #数据库服务器唯一标识,id必须比从数据库小
#重启服务 (此重启方式,前提已配置mysqld.service文件)
[root@mysql01 ~]# systemctl restart mysqld
观察主数据库状态:
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql_bin.000004 | 962 | | | |
+------------------+----------+--------------+------------------+---
5.6配置从数据库
[root@mysql02 ~]# cat /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3307
user = mysql
pid-file = /opt/data/mysql.pid
skip-name-resolve
#skip-grant-tables
server-id=20 #服务器id,大于主数据库id
relay-log=mysql_relay_log #启动中继日志
#log-bin=mysql-bin
#重启服务:
[root@mysql02 ~]# systemctl restart mysqld
5.7配置并启动主从复制的功能(mysql02从数据库上)
[root@slave02 ~]# mysql -uroot -p
mysql> change master to
-> master_host='192.168.136.145',
-> master_user='vvv',
-> master_password='vvv0917',
-> master_log_file='mysql_bin.000004',
-> master_log_pos=962;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
mysql> start slave; #stop slave为关闭
Query OK, 0 rows affected (0.01 sec)
#查看配置状态:
mysql> show slave status\G;
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.136.145
Master_User: vvv
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql_bin.000004
Read_Master_Log_Pos: 962
Relay_Log_File: mysql_relay_log.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql_bin.000004
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
#此处必须俩个都是yes,就是配置成功,否则失败
5.8测试:
主库:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
从库:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
主库创建数据库clq并且加入数据:
mysql> create database clq;
Query OK, 1 row affected (0.00 sec)
mysql> create table clq01(id int(11)not null primary key auto_increment,name varchar(100)not null,age tinyint(4));
mysql> insert clq01(name,age) values('A',20),('B',21),('C',22);
Query OK, 3 rows affected (0.00 sec)
从库中查看:
mysql> select * from clq01;
+----+------+------+s
| id | name | age |
+----+------+------s+
| 1 | A | 20 |
| 2 | B | 21 |
| 3 | C | 22 |
+----+------+------+
#主从复制完成!
6.主从配置(数据不一致时)
6.1一般全备主库需要另开一个终端,给数据库加上读锁(只读不写)
避免其他人在写入数据导致不一样
flush tables with read lock:
quit:退出即可为解锁(备份完之后才能解锁)
6.2确保主主数据库与从数据库的数据一样
#先对主库进行全备
[root@mysql01 ~]# mysqldump -uroot -A > all-databases.sql
#拷贝数据到从数据库上
[root@mysql01 ~]# ls /clq
all-databases.sql
[root@mysql01 ~]# scp /clq/all-databases.sql root@192.168.136.193:/clq/
The authenticity of host '192.168.136.193 (192.168.136.193)' can't be established.
ECDSA key fingerprint is SHA256:XIAQEoJ+M0vOHmCwQvhUdw12u5s2nvkN0A4TMKLaFiY.
Are you sure you want to continue connecting (yes/no/[fingerprint])yes
root@192.168.136.193's password:
all-databases.sql 100% 853KB 115.4MB/s 00:00
[root@mysql02 clq]# ll
总用量 896 #从库上查看
-rw-r--r--. 1 root root 873266 5月 17 19:36 all-databases.sql
6.3在从库上查看主库有哪些库,确保一致
[root@mysql02 clq]# mysql -uroot -pHuawei0917@ < all-databases.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@mysql02 clq]# mysql -uroot -pHuawei0917@ -e 'show databases;'
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database |
+--------------------+
| information_schema |
| clq |
| mysql |
| performance_schema |
| sys |
+--------------------+
主库:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| clq |
| mysql |
| performance_schema |
| sys |
+--------------------+
6.4确保俩库的配置文件已经配置了相应的文件
[root@mysql01 ~]# cat /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3306
pid-file = /opt/data/mysql.pid
user = mysql
skip-name-resolve
log-bin=mysql_bin #日志文件
server-id=10 #唯一标识服务id
[root@mysql02 ~]# cat /etc/my.cnf
[mysqld]
basedir = /usr/local/mysql
datadir = /opt/data
socket = /tmp/mysql.sock
port = 3307
user = mysql
pid-file = /opt/data/mysql.pid
skip-name-resolve
#skip-grant-tables
server-id=20 #唯一标识服务id(大于主库)
relay-log=mysql_relay_log #中继日志
#log-bin=mysql-bin
此后步骤和5.5之后一模一样!
小结:
主库修改数据,从库的数据随之改变!
反之,从库修改数据,主库的数据不会发生改变
查看数据库运行的命令进程
mysql> show processlist;
+----+------+-----------------------+------+-------------+------+---------------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------------------+------+-------------+------+---------------------------------------------------------------+------------------+
| 5 | repl | 192.168.136.219:39788 | NULL | Binlog Dump | 1575 | Master has sent all binlog to slave; waiting for more updates | NULL |
| 7 | root | localhost | NULL | Query | 0 | starting | show processlist |
+----+------+-----------------------+------+-------------+------+---------------------------------------------------------------+------------------+
2 rows in set (0.00 sec)
来源:https://blog.csdn.net/qq_47945825/article/details/119995132
猜你喜欢
- 用CSS+DIV编写的实现在网页中显示圆角矩形的代码!希望对大家有用!谢谢支持!以下为CSS代码:<style> div.bg{
- 第一种方法:采用git命令操作1、例如仓库中有下面的代码(版本1)2、现在继续编写代码,并且提交到远程仓库中(版本2)3、回退到版本1中gi
- status = show status like ‘%%' [例:show status like 'Com_select
- 有时我们在定义字段名及别名时所用名与oracle关键字同名,这时该如何处理呢? 其实很简单,只要在此关键字加上"",如&
- 基本概述我们知道MySQL有2种方式指定复制同步的方式,分别为:基于binlog文件名及位点的指定方式 - 匿名事
- 前面介绍过vSQLAlchemy中的 Engine 和 Connection,这两个对象用在row SQL (原生的sql语句)上操作,而
- 所需库的安装很多人问Pytorch要怎么可视化,于是决定搞一篇。tensorboardX==2.0tensorflow==1.13.2由于t
- 制作网页可说是易学难精,因此,不断吸收经验可弥补不足,以下列出的50个制作主页的独门招数可帮助你尽快成为高手,哈哈!1、让读者有理由逗留。要
- 1.安装相应的库文件sudo apt-get install python-mysqldb2.数据库操作import MySQLdb db
- 在国内外大中型数据库管理系统中,把ORACLE作为数据库管理平台的用户比较多。RACLE 不论是数据库管理能力还是安全性都是无可非
- 想用linux虚拟机装一个oracle,中间遇到的坑太多了,最后总算是安装好了,一定要写个全面的教程出来。话不多说通用编辑命令:vi tes
- 本文实例为大家分享了python对实例属性进行类型检查的具体代码,供大家参考,具体内容如下案例:在某项目中,我们实现了一些类,并希望能像静态
- 按下"开始(win)"按钮和R键,输入cmd,打开命令行寻找点击需要的库:https://www.lfd.uci.edu
- 过程名:ManualPagination作 用:采用手动分页方式显示文章具体的内容参 数:ArticleID,strContentSub&n
- USE master; Go EXEC sp_attach_db @dbname = N'数据库名', @filename1
- 我们很少会一次性从数据库中取出所有的数据;通常都只针对一部分数据进行操作。 在Django API中,我们可以使用`` filter()``
- Python中的sys模块主要用于程序与解释器的交互,提供一系列函数和变量来处理Python运行环境1、sys.api_version --
- 本文介绍了Python格式化输出%s和%d的实例案例。分享给大家供大家参考,具体如下:python print格式化输出1. 打印字符串pr
- 调用:var pageChange = function (index) { &n
- 1、安装AnacondaAnaconda指的是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。