MySQL详解六:备份与恢复

文章目录

  • 1. 数据库备份的分类
    • 1.1 从物理和逻辑上分类
      • 1.1.1 物理备份
      • 1.1.2 逻辑备份
    • 1.2 从数据库的备份策略角度上分类
      • 1.2.1 完全备份
      • 1.2.2 差异备份
      • 1.2.3 增量备份
    • 1.3 常见的备份方法
  • 2. MySQL完全备份
    • 2.1 完全备份简介
    • 2.2 优点与缺点
    • 2.3 实现物理冷备份与恢复
      • 2.3.1 实现流程
      • 2.3.2 前置准备
      • 2.3.3 实现物理冷备份
    • 2.4 使用mysqldump备份数据库
    • 2.5 使用source命令恢复数据库
    • 2.6 使用mysql命令恢复数据库
  • 3. MySQL增量备份与恢复
    • 3.1 使用完全备份所带来的问题
    • 3.2 增量备份简介
    • 3.3 特点
    • 3.4 增量备份与日志的关系
      • 3.4.1 二进制日志对备份的意义
    • 3.5 增量恢复方法类别
      • 3.5.1 一般恢复
      • 3.5.2 基于位置恢复
      • 3.5.3 基于时间点恢复
    • 3.6 增量备份
      • 3.6.1 开启二进制日志功能
      • 3.6.2 实现增量备份
      • 2.6.3 一般恢复
      • 3.6.4 端点恢复
        • 3.6.4.1 基于位置恢复
        • 3.6.4.2 基于时间点恢复

1. 数据库备份的分类

1.1 从物理和逻辑上分类

1.1.1 物理备份

对数据库操作系统的物理文件(如:数据文件、日志文件等)的备份

1.1.2 逻辑备份

对数据库逻辑组件(如:表等数据库对象)的备份

1.2 从数据库的备份策略角度上分类

1.2.1 完全备份

每次对数据库进行完整的备份
在这里插入图片描述

1.2.2 差异备份

  • 备份自从上次完全备份之后修改的文件
  • 仅备份最近一次完全备份以来变化的数据,备份较慢,还原简单
    在这里插入图片描述

1.2.3 增量备份

  • 只有在上次完全备份或增量备份后被修改的文件才会备份
  • 仅备份最近一次完全备份或增量备份(如果存在增量)以来变化的数据,备份较快,还原复杂

在这里插入图片描述

1.3 常见的备份方法

  1. 物理冷备
    备份时数据库处于关闭状态,直接打包数据库文件
    备份速度快,恢复时也是最简单的

  2. 专用备份工具mysqldump或mysqlhotcopy
    mysqldump常用的逻辑备份工具
    mysqlhotcopy仅拥有备份MyISAM和ARCHIVE表

  3. 启用二进制日志进行增量备份·
    进行增量备份,需要刷新二进制日志

  4. 第三方工具备份
    免费的MySQL热备份软件Percona XtraBackup

2. MySQL完全备份

2.1 完全备份简介

  • 是对整个数据库、数据库结构和文件结构的备份
  • 保存的是备份完成时刻的数据库
  • 是差异备份与增量备份的基础

2.2 优点与缺点

  • 优点
    备份与恢复操作简单方便

  • 缺点
    数据存在大量重复
    占用大量备份空间
    备份与恢复时间长

2.3 实现物理冷备份与恢复

2.3.1 实现流程

关闭MySQL数据库 > 使用tar命令直接打包数据库文件夹 > 直接替换现有MySQL目录

2.3.2 前置准备

mysql1 :192.168.67.100
mysql2 :192.168.67.101
mysql -uroot -pabc123
#登录数据库

在这里插入图片描述

create datbbase scj;
#新建数据库use scj;
#进入数据库create table scj1 (id int, name varchar(10), age int, sex char(2), hobby varchar(50));
#新建表show tables;
#查看数据库

在这里插入图片描述

#添加数据
insert into scj1 values (1, '张三', 22, '男', 'java');
insert into scj1 values (2, '李四', 23, '男', 'shell');
insert into scj1 values (3, '王五', 24, '男', '云计算');
insert into scj1 values (4, '赵四', 25, '男', 'url');
insert into scj1 values (5, '尼古拉斯', 26, '男', 'html');
insert into scj1 values (6, '日川钢板', 27, '男', 'css');

在这里插入图片描述

create table scj2 like scj1;
insert into scj2 (select * from scj1);
#克隆一个名为scj2的表show tables from scj;
#查看是否创建成功

在这里插入图片描述

2.3.3 实现物理冷备份

quit
#退出数据库
systemctl stop mysqld
#关闭数据库
cd /usr/local/mysql/data
#前往mysql默认日志目录下

~~~

mkdir /opt/backup
#创建备份日志文件目录tar zcvf /opt/backup/mysql_full_$(date -d "-1 day" +%Y.%m.%d).tar.gz ./data/
#打包压缩上一天的data目录到/opt/backup目录下,并标上日期
#拓展
date +%Y/%m/%d
#只显示当前日期date +%Y-%m01
#显示当月第一天date -d "+1 day" +%Y/%m/%d
#显示明天date -d "-1 day" +%Y/%m/%d
#显示昨天date -d "1 day ago" +%Y/%m/%ddate -d "$(date +%Y%m01) -1 day" +%Y/%m/%d
#显示上月最后一天date -d "(date -d "1 mouth" +%Y%m01) -1 day" +%Y/%m/%d
#显示当月最后一天

在这里插入图片描述

cd /optscp mysql_full_2023.09.18.tar.gz 192.168.67.101:/opt
#将打包的data目录远程拷贝到另一台mysql主机的opt目录下

在这里插入图片描述

在这里插入图片描述

#前往mysql2
systemctl stop mysqld
#关闭mysql服务cd /usr/local/mysql
mv data/ data.bak
#将现data目录改名为data.bakmv  mysql_full_2023.09.18.tar.gz /usr/local/mysql/
#将此压缩包转移到mysql用户目录下tar xf mysql_full_2023.09.18.tar.gz
#解压缩mysql1的data目录

在这里插入图片描述

systemctl start mysqld
#打开mysql服务

在这里插入图片描述

mysql -uroot -pabc123
#进入数据库
show databases;
#查看现有数据库show tables from scj;
#查看库中现有数据库select * from scj.scj1;
#查看表内容

在这里插入图片描述

2.4 使用mysqldump备份数据库

#基本格式
mysqldump -u [用户名] -p[密码] --databases 库名1 [库名2]> /备份路径/备份文件名.sql	
#导出的就是数据库脚本文件#完全备份一个或多个完整的库(包括其中所有的表)
mysqldump -uXXX -p[XXX] 库名 > XXX.sql
#备份指定库中的所有表数据(不包含创建库的操作)mysqldump -uroot -pabc123 scj > /opt/backup/scj.sql
#只备份表和表中的内容,并没有备份库cd /opt/backup
ls

在这里插入图片描述

cat scj.sql |egrep -v "^--|^/\*|^$"
#过滤出需要的信息

在这里插入图片描述

mysqldump -uroot -pabc123 --databases scj > /opt/backup/scj_full.sql
#备份一个完整的库到/opt/backup目录下

在这里插入图片描述

cat scj_full.sql |egrep -v "^--|^/\*|^$"
#过滤出需要的信息

在这里插入图片描述

mysqldump -u [用户名] -p[密码] --all-databases > /备份路径/备份文件名.sqlmysqldump -u root -pabc123 --all-databases > /opt/all_full.sql
#完全备份 MySQL 服务器中所有的库

在这里插入图片描述

cat all_full.sql |grep "^CREATE DATABASE"

在这里插入图片描述

mysqldump -u root -p[密码] 库名 [表名1] [表名2]> /备份路径/备份文件名.sql
#备份指定库中的一个或多个表数据(不包含创建库的操作)mysqldump -u root -pabc123 scj scj2 > /opt/backup/scj_scj2.sql
#备份scj库中scj2表cat scj_scj2.sql |egrep -v "^--|^/\*|^$"
#查看备份内容信息

在这里插入图片描述

2.5 使用source命令恢复数据库

#记得提前备份

在这里插入图片描述

#模拟环境
#先登录mysql
mysql -uroot -pabc123mysql>drop databases scj;
#删除scj库

在这里插入图片描述

source /opt/backup/scj_full.sql
#恢复完整的scj库#注:一定要用绝对路径

在这里插入图片描述
在这里插入图片描述

#也可以只用表数据进行恢复
create database scj;
#创建新scj库use scj;
#进入scj库source /opt/backup/scj.sql
#恢复库中表数据#因为scj.sql中不包含有创建库的操作,所以可以在任意一个库中导入表数据

2.6 使用mysql命令恢复数据库

#基本格式
mysql -uXXX -pXXX [库名] < XXX.sql          #如果sql文件只包含表的备份,要指定库名cat XXX.sql | mysql -uXXX -pXXX [库名]
mysql -uroot -pabc123 scj < scj.sql
#需要提前创建库mysql -uroot -pabc123  < scj_full.sql
#直接恢复完整的数据库
mysql -uroot -pabc123 -e "drop database scj;"
#-e 执行命令后退出数据库mysql -uroot -pabc123 -e "show databases;"
#查看是否删除完成

在这里插入图片描述

mysql -uroot -pabc123  < scj_full.sqlmysql -uroot -pabc123 -e "show databases;"
#查看是否恢复完成

在这里插入图片描述

3. MySQL增量备份与恢复

3.1 使用完全备份所带来的问题

  • 备份数据中有重复数据
  • 备份时间与恢复时间过长

3.2 增量备份简介

是自上一次备份后增加和变化的文件或内容

3.3 特点

  • 没有重复数据,备份量不大,时间短
  • 恢复需要上次完全备份及完全备份之后所有的增量备份才能恢复,而且要对所有增量备份进行逐个反推恢复

3.4 增量备份与日志的关系

  • MySQL没有提供直接的增量备份方法
  • 可通过MySQL提供的二进制日志间接实现增量备份

3.4.1 二进制日志对备份的意义

  1. 二进制日志保存了所有更新或者可能更新数据库的操作
  2. 二进制日志在启动MySQL服务器后开始记录,并在文件达到max binlog_size所设置的大小或者接收到flush logs命令后重新创建新的日志文件
  3. 只需定时执行flushlogs方法重新创建新的日志,生成二进制文件序列,并及时把这些日志保存到安全的地方就完成了一个时间段的增量备份

3.5 增量恢复方法类别

3.5.1 一般恢复

  • 将所有备份的二进制日志内容全部恢复

3.5.2 基于位置恢复

  • 数据库在某一时间点可能既有错误的操作也有正确的操作
  • 可以基于精准的位置跳过错误的操作

3.5.3 基于时间点恢复

跳过某个发生错误的时间点实现数据恢复

3.6 增量备份

3.6.1 开启二进制日志功能

vim /etc/my.cnf
#编辑配置文件#添加
log-bin=mysql-bin
binlog_format = MIXED				#可选,指定二进制日志(binlog)的记录格式为 MIXED
server-id = 1#二进制日志(binlog)有3种不同的记录格式:STATEMENT(基于SQL语句)、ROW(基于行)、MIXED(混合模式),默认格式是STATEMENT

在这里插入图片描述

systemctl restart mysqld
#重新启动服务ls /usr/local/mysql/data

在这里插入图片描述

#因为二进制文件内容默认是二进制字符,人是看不懂的
#所以使用mysqlbinlog命令
mysqlbinlog --no-defaults --base64-output=decode-rows -v /usr/local/mysql/data/mysql-bin.000001
#以base64方式进行解码,按行进行读取编码,显示详细内容,指定mysql-bin.000001文件

在这里插入图片描述

#除了可以用重启来刷新mysql二进制文件,还可以使用mysqladmin命令来刷新二进制文件mysqladmin -uroot -pabc123 flush-logs
#再次生成新的二进制日志文件

在这里插入图片描述

cat mysql-bin.index
#该文件保存着所有的二进制文件的序列号

在这里插入图片描述

3.6.2 实现增量备份

#模拟环境
select * from scj.scj1
#事先准备表

在这里插入图片描述

#当天二进制文件是没有操作数据的
cat /usr/local/mysql/data/mysql-bin.000003  
#查看最新二进制日志文件

在这里插入图片描述

#首先实现完全备份
mkdir /opt/backupcd /opt/backup
mkdir full bin
#full目录做完全备份,bin做增量备份

在这里插入图片描述

vim /opt/mysqlquan.sh     
#编写完全备份脚本  
#!/bin/bash  
mysqldump -u root -p123456 --all-databases > /bak/all_$(date +%F).sql  chmod 700 /opt/mysqlquan.sh 
#添加属主的权限

在这里插入图片描述

vim /opt/binlog.sh 
#编写增量备份脚本
#!/bin/bash  
filename=$(sed -n '$p' /usr/local/mysql/data/mysql-bin.index | awk -F '/' '{print $2}') 
#使用sed命令打印二进制日志文件最后一行内容作为filename变量的值 
mv /usr/local/mysql/data/$filename /bak/binlog_$(date +%F)
#将二进制日志移动到备份目录下,并将移动后的文件名称加上日期  
mysqladmin -uroot -pabc123 flush-logs  
#生成新的二进制日志文件  chmod 700 /opt/binlog.sh 
#添加属主的权限

在这里插入图片描述

crontab -e
#做计划任务

在这里插入图片描述
在这里插入图片描述

mysqldump -uroot -pabc123 scj scj1 > /opt/backup/full/scj_scj1-$(date +%Y.%m.%d).sql
#将scj库下scj1表备份到/opt/backup/full下

在这里插入图片描述

mysqladmin -uroot -pabc123 flush-logs
#重新生成一个二进制文件

在这里插入图片描述

#进入数据库
#插入两条数据
insert into scj.scj1 values (7, '小黑子', 25, '男', '黑坤坤');
insert into scj.scj1 values (8, '小仙女', 18, '女', '打拳');select * from scj.scj1;
#查看内容

在这里插入图片描述

mysqladmin -uroot -pabc123 flush-logs
#保存上一个文件并生成新一个文件

在这里插入图片描述

mv -f mysql-bin.000004 /opt/backup/bin/mysql-bin.000004-$(date -d '1 day' +_%Y.%m.%d)

在这里插入图片描述

#进入数据库
#插入两条数据
insert into scj.scj1 values (9, 'giao桑', 28, '男', 'giao');
insert into scj.scj1 values (10, '翠花', 18, '女', '看打拳');select * from scj.scj1;
#查看内容

在这里插入图片描述

mysqladmin -uroot -pabc123 flush-logs
#保存上一个文件并生成新一个文件

在这里插入图片描述

mv -f mysql-bin.000005 /opt/backup/bin/mysql-bin.000005-$(date -d '1 day' +_%Y.%m.%d)

在这里插入图片描述

#进入数据库
#模拟被删库跑路了
drop databbase scj;

在这里插入图片描述

2.6.3 一般恢复

#现在进行恢复
create database scj;
#新建库
mysql -uroot -pabc123 scj < /opt/backup/full/scj_scj1-2023.09.20.sql
#首先恢复基础表数据

在这里插入图片描述

#进入数据库
select * from scj.scj1
#查看表内容

在这里插入图片描述

#恢复第二次输入的内容
mysqlbinlog --no-defaults /opt/backup/bin/mysql-bin.000004-_20230921 | mysql -uroot -pabc123

在这里插入图片描述

#进入数据库
select * from scj.scj1
#查看表内容

在这里插入图片描述

#恢复第三次输入的内容
mysqlbinlog --no-defaults /opt/backup/bin/mysql-bin.000005-_2023.09.22 | mysql -uroot -pabc123

在这里插入图片描述

3.6.4 端点恢复

#将二进制文件转译
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000004-_20230921 > mysql-bin-2023.09.21mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000005-_2023.09.22 > mysql-bin-2023.09.22

在这里插入图片描述
在这里插入图片描述

3.6.4.1 基于位置恢复
#基本格式
mysqlbinlog --no-defaults --start-position='位置点' --stop-position='位置点' 二进制日志文件 | mysql -uXXX -pXXX
#示例
#只恢复小黑子那一段#进入数据库清空表数据
truncate table scj.scj1;

在这里插入图片描述

vim /opt/backup/bin/vim mysql-bin-2023.09.21
#查看具体位置点

在这里插入图片描述

mysqlbinlog --no-defaults --start-position='293' --stop-position='526' /opt/backup/bin/mysql-bin.000004-_20230921 | mysql -uroot -pabc123
#将具体的位置点传往数据库服务器
#注:要使用二进制文件,不要用编码后的二进制文件

在这里插入图片描述

#前往数据库
select * from scj.scj1;
#查看内容

在这里插入图片描述

3.6.4.2 基于时间点恢复
#基本格式
mysqlbinlog --no-defaults --start-datetime='YYYY-mm-dd HH:MM:SS' --stop-datetime='YYYY-mm-dd HH:MM:SS' 二进制日志文件 | mysql -uXXX -pXXX
#示例
#只恢复小仙女那一段#进入数据库清空表数据
truncate table scj.scj1;

在这里插入图片描述

vim /opt/backup/bin/vim mysql-bin-2023.09.21
#查看具体时间点

在这里插入图片描述

mysqlbinlog --no-defaults --start-datetime='2023-09-20 0:37:43' --stop-datetime='2023-09-20 0:40:35' /opt/backup/bin/mysql-bin.000004-_20230921 | mysql -uroot -pabc123
#将具体时间点范围内的数据传往数据库服务器内

在这里插入图片描述

#前往数据库
select * from scj.scj1;
#查看内容

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/139497.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

海外代理IP是什么?如何使用?

一、海外代理IP是什么&#xff1f; 首先&#xff0c;代理服务器是在用户和互联网之间提供网关的系统或路由器。它是一个服务器&#xff0c;被称为“中介”&#xff0c;因为它位于最终用户和他们在线访问的网页之间。 海外IP代理是就是指从海外地区获取的IP地址&#xff0c;用…

redis实战-实现笔记点赞和点赞排行榜

发布探店笔记 探店笔记类似点评网站的评价&#xff0c;往往是图文结合。对应的表有两个&#xff1a; tb_blog&#xff1a;探店笔记表&#xff0c;包含笔记中的标题、文字、图片等 tb_blog_comments&#xff1a;其他用户对探店笔记的评价 保存笔记service层 Overridepublic Re…

Mybatis学习笔记9 动态SQL

Mybatis学习笔记8 查询返回专题_biubiubiu0706的博客-CSDN博客 动态SQL的业务场景&#xff1a; 例如 批量删除 get请求 uri?id18&id19&id20 或者post id18&id19&id20 String[] idsrequest.getParameterValues("id") 那么这句SQL是需要动态的 还…

AJAX学习

文章目录 创建 XMLHttpRequest 对象向服务器发送请求XMLHttpRequest.open()XMLHttpRequest.send()GET或POST 服务器响应XMLHttpRequest 的属性XMLHttpRequest.readyStateXMLHttpRequest.onreadystatechangeXMLHttpRequest.responseXMLHttpRequest.responseTypeXMLHttpRequest.r…

软件工程之总体设计

总体设计是软件工程中的一个重要阶段&#xff0c;它关注整个系统的结构和组织&#xff0c;旨在将系统需求转化为可执行的软件解决方案。总体设计决定了系统的架构、模块划分、功能组织以及数据流和控制流等关键方面。 可行性研究 具体方面&#xff1a;经济可行性、技术可行性…

PY32F003F18之DMA串口

PY32F003F18使用DMA串口&#xff0c;官方程序省FLASH&#xff0c;但不省内存。单片机内存够大&#xff0c;节省没意义&#xff0c;故做了修改&#xff0c;少用HAL库中的发送和接收&#xff0c;从里面抠出有用的部分&#xff0c;修修改改就可以了。 一、DMA串口初始化流程&…

Vue页面快速使用阿里巴巴矢量图标库

前面我已经写个一篇文章 阿里巴巴矢量图标如何使用_turbo夏日漱石的博客-CSDN博客 这篇文章非常详细地讲解了在html页面中如何使用阿里巴巴矢量图标库 下面我们讲解在vue页面中引入阿里巴巴矢量图标库icon的几种方法 目录 一、引入在线链接 1、 第九步链接引入在vue中应该是在…

安卓备份基带分区 备份字库 步骤解析 以免误檫除分区或者“格机” 后悔莫及

玩机搞机---安卓机型mtk和高通芯片查看分区 导出分区 备份分区的一些工具分析 修复基带 改串码 基带qcn 改相关参数 格机危害 手机基带的重要性前面几期博文我都有相关的说明。他区别于别的分区。而且目前手机的安全性越来越高。基带分区基本都是专机专用。而不像早期机型一…

【AI语言大模型】文心一言功能使用介绍

一、前言 文心一言是一个知识增强的大语言模型&#xff0c;基于飞桨深度学习平台和文心知识增强大模型&#xff0c;持续从海量数据和大规模知识中融合学习具备知识增强、检索增强和对话增强的技术特色。 最近收到百度旗下产品【文心一言】的产品&#xff0c;抱着试一试的心态体…

java服务内存说明及配置详解

java进程内存 JVM内存分布图: 【java进程内存】【堆外内存】 【jvm堆内存】 【堆外内存】 【Metaspace】 【Direct Memory】【JNI Memory】【code_cache】 … 堆外内存泄漏的排查在于【本地内存&#xff08;Native Memory&#xff09;】【Direct Memory】【JNI Memory】 一般…

期刊分类一览

分区情况 jcr分区 中科院分区 EI 理工科 一般是SCI的都是EI 国内的分区

网络安全深入学习第三课——热门框架漏洞(RCE—Struts2远程代码执行)

文章目录 一、Struts2框架介绍二、Struts2远程代码执行漏洞三、Struts2执行代码的原理四、Struts2框架特征五、漏洞手工POC六、漏洞工具复现 一、Struts2框架介绍 ------ Struts2是apache项目下的一个web 框架&#xff0c;普遍应用于阿里巴巴、京东等互联网、政府、企业门户网…

2023-09-20 Android CheckBox 让文字显示在选择框的左边

一、CheckBox 让文字在选择框的左边 &#xff0c;在布局文件里面添加下面一行就可以。 android:layoutDirection"rtl" 即可实现 android:paddingStart"10dp" 设置框文间的间距 二、使用的是left to right <attr name"layoutDirection">&…

一文掌握CodiMD安装与使用

简介&#xff1a;CodiMD 是一个基于 Markdown 语言的实时协作文档编辑器&#xff0c;它允许多个用户在同一个文档上进行实时编辑。CodiMD 的前身是 HackMD&#xff0c;但为了满足更开放的开源社区需求&#xff0c;CodiMD 作为其社区版本独立出来。 优势&#xff1a; 1. 开源且…

【Godot】解决游戏中的孤立/孤儿节点及分析器性能问题的分析处理

Godot 4.1 因为我在游戏中发现&#xff0c;越运行游戏变得越来越卡&#xff0c;当你使用 Node 节点中的 print_orphan_nodes() 方法打印信息的时候&#xff0c;会出现如下的孤儿节点信息 孤儿节点信息是以 节点实例ID - Stray Node: 节点名称(Type: 节点类型) 作为格式输出&a…

关于JPA +SpringBoot 遇到的一些问题及解决方法

关于JPA SpringBoot 遇到的一些问题及解决方法&#xff08;可能会有你正在遇到的&#xff09; 一、JpaRepository相关 1.1 org.springframework.dao.InvalidDataAccessResourceUsageException: Named parameter not bound : id; nested exception is org.hibernate.QueryEx…

【从0学习Solidity】33. 发送空投

【从0学习Solidity】 33. 发送空投 博主简介&#xff1a;不写代码没饭吃&#xff0c;一名全栈领域的创作者&#xff0c;专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构&#xff0c;分享一些项目实战经验以及前沿技术的见解。关注我们的主页&#xff0c;探索全栈…

day03_基础语法

今日内容 零、复习昨日 一、Idea安装&#xff0c;配置 二、Idea使用 三、输出语句 四、变量 五、数据类型 附录: 单词 零、 复习昨日 1 装软件(typora,思维导图) 2 gpt(学会让他帮你解决问题) 3 java发展(常识) 4 HelloWorld程序 5 编码规范 6 安装jdk,配置环境变量 电脑常识 任…

vuex如何安装、报错、安装版本注意事项

npm i vuex报错&#xff0c;为什么呢&#xff1f; 在2022.2.7&#xff0c;Vue3就变成了默认版本&#xff0c; Vue2中&#xff0c;必须要用Vuex的3版本 Vue3中&#xff0c;必须要用Vuex的4版本&#xff0c;否则会报错 npm i vuex 安装的就是4版本 如果我们需要安装3版本&…

LaTex打出上大下小的公式

想要在latex中打出如下word公式 首先使用 \atop符号 使用如下语句 d_{H(A,B)} max\{{sup\, inf \atop {a \in A\,b \in B}}\,d(a,b), {sup\, inf\,\atop {b\in B\,a\in\,A}}d(b,a)\}. ![在这里插入图片描述](https://img-blog.csdnimg.cn/0c842594716a4693b1124523d53bfcad…