MySQL数据库备份及恢复

数据备份的重要性

1、备份的主要目的是灾难恢复

2、在生产环境中,数据的安全性至关重要

3、任何数据的丢失都可能产生严重的后果

4、造成数据丢失的原因
 

备份类型(重点)

1、物理备份

数据库备份可以分为物理备份和逻辑备份。物理备份是对数据库操作系统的物理文件(如数据文件、日志文件等)的备份。这种类型的备份适用于在出现问题的时候需要快速恢复的大型重要数据库。
物理备份又可以成为冷备份(脱机备份)、热备份(连接备份)和温备份

冷备份 (脱机备份) :是在关闭数据库的时候进行的(tar)

热备份 (联机备份) :数据库处于运行状态,依赖于数据库的日志文件(mysqlhotcopy mysqlbackup)

温备份 :数据库锁定表格(不可写入但可读)的状态下进行备份操作(mysqldump)

2、逻辑备份

逻辑备份是对数据库逻辑组件的备份.表示为逻辑数据库结构

这种类型的备份适用于可以编辑数据值或表结构    

从数据库的备份策略角度来看,备份又可分为完全      备份、差异备份和增量备份

        完全备份

每次对数据进行完整备份,即对整个数据库、数据库结构和文件结构的备份,保存的是备份完成时刻的数据库,是差异备份与增量备份的基础完全备份的备份与恢复操作都非常简单方便,但是数据存在大量的重复并且会占用大量的磁盘空间,备份的时间也很长

每次都进行完全备份,会导致备份文件占用空间巨大,并且有大量的重复数据,恢复时,直接使用完全备份的文件即可


        差异备份

备份那些自从上次完全备份之后被修改过的所有文件,备份的时间节点是从上次完整备份起,备份数据量会越来越大。恢复数据时只需要恢复上次的完全备份与最佳的一次差异备份

每次差异备份,都会备份上一次完全备份之后的数据,可能会出现重复数据。恢复时,先恢复完全备份的数据,再恢复差异备份的数据

        增量备份

只有那些在上次完全备份或者增量备份后被修改的文件才会被备份以上次完整备份或上次增量备份的时间为时间点,仅备份期间内的数据变化,因而备份的数据量小,占用空间小,备份速度快。但恢复时,需要从上一次的完整备份开始到最后一次增量备份之间的所有增量依次恢复,如中间某次的备份数据损坏,将导致数据的丢失

每次增量备份都是在备份在上一次完成全备份

每次增量备份都是备份在上一次完全备份或者增量备份之后的数据,不会出现重复数据的情况,也不会占用额外的磁盘空间
恢复数据,需要按照次序恢复完全备份和增量备份的数据

三种备份方式比较

备份方式 完全备份 差异备份增量备份
完全备份时的状态表1、表2 表1、表2 表1、表2
第1次添加内容 创建表3 创建表3创建表3
备份内容表1、表2、表3表3表3
第2次添加内容创建表4创建表4 创建表4
备份内容 表1、表2、表3表4         表3表4         表4

常见的备份方法

1、物理冷备

备份时数据库处于关闭状态,直接打包数据库文件(tar)

备份速度快,恢复时也是最简单的

2、专用备份工具 mysqldump 或 mysqlhotcopy 

mysqldump 常用的逻辑备份工具

mysqlhotcopy 仅拥有备份 MyISAM 和 ARCHIVE 表

3、启用二进制日志进行增量备份

进行增量备份,需要刷新二进制日志

MySQL支持增量备份,进行增量备份时必须启用二进制日志。二进制日志文件为用户提供复制,对执行备份点后进行的数据库更改所需的信息进行恢复。如果进行增量备份(包含自上次完全备份或增量备份以来发生的数据修改),需要刷新二进制日志。

4、第三方工具备份

免费的MySQL 热备份软件 Percona XtraBackup mysqlbackup

MySQL完全备份

是对整个数据库、数据库结构和文件结构的备份

保存的是备份完成时刻的数据库

是差异备份与增量备份的基础

1、优点:备份与恢复操作简单方便

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

数据库完全备份分类

1、物理冷备份与恢复

关闭MySQL数据库

使用tar命令直接打包数据库文件夹

直接替换现有MySQL目录即可

2、mysqldump备份与恢复

MySQL自带的备份工具,可方便实现对MySQL的备份

可以将指定的库、表导出为SQL 脚本

使用命令mysq|导入备份的数据
 

MySQL完全备份与恢复

物理冷备份与恢复

#首先停止MySQL
systemctl stop mysqld#压缩备份
tar -cf mysql_all_$(date +%F).tar.gz /usr/local/mysql/data/
#/模拟故障
mv /usr/local/mysql/data/ /opt/
#此时重启MySQL后,发现数据库中的表丢失#解压恢复
tar -xf /opt/mysql_all_2023-08-29.tar.gz -C /usr/local/mysql/data/#查看数据库,数据恢复

mysqldump 备份与恢复(温备份)

备份

完全备份一个或多个完整的库 (包括其中所有的表)

mysqldump -u root -p[密码] --databases 库名1 [库名2] ... > /备份路径/备份文件名.sql    

#导出的就是数据库脚本文件

例:
mysqldump -u root -p --databases test1 > /opt/test1.sql       #备份一个test1库mysqldump -u root -p --databases mysql test1 > /opt/mysql-test1.sql    #备份mysql与test1两个库 

完全备份 MySQL 服务器中所有的库

mysqldump -u root -p[密码] --all-databases > /备份路径/备份文件名.sql

例:
mysqldump -u root -p --all-databases > /opt/all.sql #备份所有的库

完全备份指定库中的部分表

mysqldump -u root -p[密码] 库名 [表名1] [表名2] ... > /备份路径/备份文件名.sql

例:
mysqldump -u root -p [-d] test1 zh1 zh2 > /opt/test1_zh1_zh2.sql#注意!!
#使用"-d"选项,说明只保存数据库的表结构 
#不使用"-d"选项,说明表数据也进行备份
#做为一个表结构模板

查看备份文件

grep -v "^--" /opt/test1_zh1_zh2.sql | grep -v "^/" | grep -v "^$"


完全恢复

恢复数据库

1.使用mysqldump导出的文件,可使用导入的方法
source命令
mysql命令

2.使用source恢复数据库的步骤

登录到MySQL数据库
执行source备份sql脚本的路径

登录进入数据库
mysql -uroot -p
#输入密码
#模拟故障损坏(删除指定的库)
drop database test1;

方法一
#使用source命令恢复
source /opt/test1.sqlshow databases;

方法二
使用mysql命令恢复
此方法可实现面交互恢复mysql -uroot -p123456 < /opt/test1.sql   #恢复test1库
mysql -uroot -p123456 -e 'show databases;'  #查看库

mysqldump 严格来说属于温备份,会需要对表进行写入的锁定在全量备份与恢复实验中,假设现有test1库,test1库中有一个zh1表,需要注意的一点为:一、当备份时加 --databases ,表示针对于test1库#备份命令
mysqldump -uroot -p123456 --databases test1 > /opt/test_01.sql 备份库后、#恢复命令过程为:
mysql -uroot -p123456 
drop database test1;
exit
mysql -uroot -p123456 < /opt/test1_01.sql二、当备份时不加 --databases,表示针对test1库下的所有表
#备份命令
mysqldump -uroot -p123456 test1 > /opt/test1_alltables.sql
#恢复过程:
mysql -uroot -p123456
drop database test1;create database test1;
exit
mysql -uroot -p123123 test1 < /opt/test1_alltables.sql #查看test1_01.sql 和test1_alltables.sql 
主要原因在于两种方式的备份(前者会从"create databases"开始,而后者则全是针对表格进行操作) 

在生产环境中,可以使用Shell脚本自动实现定时备份(时间频率需要确认)

0 1 * * 6 /usr/local/mysql/bin/mysqldump -uroot -p123456 test1 zh1 > ./test1_zh1_$(date +%Y%m%d).sql ;/usr/local/mysql/bin/mysqladmin -u root -p123456 flush-logs

MySQL 增量备份与恢复

MySQL数据库增量恢复

1、一般恢复

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

2、基于位置恢复

数据库在某一时间点可能既有错误的操作也有正确的操作

可以基于精准的位置跳过错误的操作

发生错误节点之前的一个节点,上一次正确操作的位置点停止

3、基于时间点恢复

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

在错误时间点停止,在下一个正确时间点开始


二进制日志

二进制日志(binlog)有3种不同的记录格式: STATEMENT (基于SQL语句)、ROW(基于行)、MIXED(混合模式),默认格式是STATEMENT

STATEMENT(基于SQL语句):

每一条涉及到被修改的sql 都会记录在binlog中

缺点:日志量过大,如sleep()函数,last_insert_id()>,以及user-defined fuctions(udf)、主从复制等架构记录日志时会出现问题

总结:增删改查通过sql语句来实现记录,如果用高并发可能会出错,可能时间差异或者延迟,可能不是我们想想的恢复可能你先删除或者在修改,可能会倒过来。准确率底

ROW(基于行)

只记录变动的记录,不记录sql的上下文环境

缺点:如果遇到update......set....where true 那么binlog的数据量会越来越大

总结:update、delete以多行数据起作用,来用行记录下来,只记录变动的记录,不记录sql的上下文环境,
比如sql语句记录一行,但是ROW就可能记录10行,但是准确性高,高并发的时候由于操作量,性能变低 比较大所以记录都记下来,

MIXED (混合)推荐使用

一般的语句使用statement,函数使用ROW方式存储。

开启二进制日志

开启二进制日志功能
vim /etc/my.cnf
[mysqld]
log-bin=mysql-bin
binlog_format = MIXED      #可选,指定二进制日志(binlog)的记录格式为MIXED(混合输入)
server-id = 1              #可加可不加该命令systemctl restart mysqld #重启后在/usr/local/mysql/data  目录下会生成二进制日志文件mysql-bin.000001

查看二进制日志文件的内容

cp /usr/local/mysql/data/mysql-bin.000001 /opt/mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000001#--base64-output=decode-rows:使用64位编码机制去解码(decode)并按行读取(rows)
#-v: 显示详细内容
#--no-defaults : 默认字符集(不加会报UTF-8的错误)PS: 可以将解码后的文件导出为txt格式,方便查阅
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000001 > /opt/mysql-bin.000001

二进制日志中需要关注的部分

1、at :开始的位置点 

2、end_log_pos:结束的位置

3、时间戳: 230829 11:50:30 

4、SQL语句

增量备份的流程

一、首先进行完全备份(进行增量备份时基于完全备份)

mysqldump -uroot -p123456 test > /opt/test_alltables_$(date +%F).sql

二、可每天进行增量备份操作,生成新的二进制日志文件(例如:mysql-bin.000002)

mysqladmin -u root -p123456 flush-logs
#刷新,生成新的二进制日志文件

三、插入新数据,以模拟数据的增加或变更

四、再次生成新的二进制日志文件(例如:mysql-bin.000003)

mysqladmin -u root -p flush-logs

增量备份实例

一般恢复

1、模拟丢失更改的数据的恢复步骤(直接使用恢复即可)
#备份test库中zh1表
mysqldump -uroot -p123456 test zh1 > /opt/test_zh1.sql
# 删除test库中zh1表
drop table test.zh1;
# 恢复zh1表
mysql -uroot -p123456 test < /opt/test_zh1.sql#刷新生成二进制日志文件mysql-bin.000002
mysqladmin -u root -p123456 flush-logs
#查看日志文件
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.0000022、模拟丢失所有数据的恢复步骤模拟丢失所有数据
mysql -uroot -p123456mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| school             |
| sys                |
| test               |
+--------------------+
7 rows in set (0.00 sec)mysql> drop database test;
Query OK, 1 row affected (0.00 sec)mysql> exit基于mysql-bin.000002恢复
mysqlbinlog --no-defaults /opt/mysql-bin.000002 | mysql -u root -p123456

断点恢复

#查看二进制日志文件
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002例:
# at 302
#230829 16:41:16
插入了"user3"的用户数据# at 623
#230829 16:41:24 
插入了"user4"的用户数据

基于位置恢复

#仅恢复到操作 ID 为“623"之前的数据,即不恢复"user4"的数据
mysqlbinlog --no-defaults --stop-position='623' /opt/mysql-bin.000002 | mysql -uroot -p123456#仅恢复"user4"之后的数据,即跳过"user3"和之前的数据恢复
mysqlbinlog --no-defaults --start-position='623' /opt/mysql-bin.000002 | mysql -uroot -p123456#恢复从位置为302开始到位置为623为止
mysqlbinlog --no-defaults --start-position='302' --stop-position='623' /opt/mysql-bin.000002 | mysql -uroot -p123456      

基于时间点恢复

mysqlbinlog [--no-defaults] --start-datetime='年-月-日 小时:分钟:秒' --stop-datetime='年-月-日小时:分钟:秒' 二进制日志 | mysql -u 用户名 -p 密码#仅恢复到16:41:24 之前的数据,即不恢复"user4"的数据
mysqlbinlog --no-defaults --stop-datetime='2023-08-29 16:41:24' /opt/mysql-bin.000002 | mysql -uroot -p123456#仅恢复"user4"的数据,跳过"user3"的数据恢复
mysqlbinlog --no-defaults --start-datetime='2023-08-29 16:41:24' /opt/mysql-bin.000002 | mysql -uroot -p123456#恢复16:41:16 到 16:41:24 之间的数据
mysqlbinlog --no-defaults --start-datatime='2023-08-29 16:41:16' --stop-datetime='2023-08-29 16:41:24' /opt/mysql-bin.000002 | mysql -uroot -p123456如果恢复某条SQL语之前的所有数据,就stop在这个语句的位置节点或者时间点
如果恢复某条SQL语句以及之后的所有数据,就从这个语句的位置节点或者时间点start

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

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

相关文章

kafka详解一

kafka详解一 1、消息引擎背景 根据维基百科的定义&#xff0c;消息引擎系统是一组规范。企业利用这组规范在不同系统之间传递语义准确的消息&#xff0c;实现松耦合的异步式数据传递. 即&#xff1a;系统 A 发送消息给消息引擎系统&#xff0c;系统 B 从消息引擎系统中读取 A…

城市白模三维重建

收费工具&#xff0c;学生党勿扰&#xff0c;闹眼子当勿扰 收费金额&#xff1a;2000元&#xff0c;不能开发票 1 概述 几个月前&#xff0c;一家小公司找我帮忙给他们开发一个程序&#xff0c;可以将一个城市进行白模的三维重建。 报酬大约5K。经过不懈的努力&#xff0c;终于…

分布式集群——搭建Hadoop环境以及相关的Hadoop介绍

系列文章目录 分布式集群——jdk配置与zookeeper环境搭建 分布式集群——搭建Hadoop环境以及相关的Hadoop介绍 文章目录 前言 一 hadoop的相关概念 1.1 Hadoop概念 补充&#xff1a;块的存储 1.2 HDFS是什么 1.3 三种节点的功能 I、NameNode节点 II、fsimage与edits…

国产工业软件的挑战与机遇:风口是否还在燃烧?

随着智能制造与数字化转型等新型工业理念的推广&#xff0c;工业软件在工业领域中的地位日益重要。在这个过程中&#xff0c;国产工业软件也迎来了新的发展机遇。然而&#xff0c;对于国产工业软件而言&#xff0c;是否存在着发展的“风口”&#xff1f;今天&#xff0c;我们将…

【C++技能树】继承概念与解析

Halo&#xff0c;这里是Ppeua。平时主要更新C&#xff0c;数据结构算法&#xff0c;Linux与ROS…感兴趣就关注我bua&#xff01; 继承 0. 继承概念0.1 继承访问限定符 1. 基类和派生类对象赋值兼容转换2. 继承中的作用域3. 派生类中的默认成员函数4.友元5.继承中的静态成员6.菱…

如何飞速成为开源贡献者(Contributor)

如何飞速成为开源贡献者Contributor 一、环境信息1.1 硬件信息1.2 软件信息 二、Git安装2.1 Git介绍2.2 Git下载安装 三、开源项目选定四、GitHub参与开源流程4.1 Fork项目4.2 SSH配置4.2.1 为什么要配置SSH4.2.2 如何配置SSH 4.3 Clone项目4.4 IDEA关联4.5 PR生成4.6 PR提交 一…

STM32f103入门(9)编码器接口测速

TIM3 PA6 PA7 上拉输入 原理上也是PWM捕获输入 捕获两个输入 我们用中断处理读取CNT的值 读取完将CNT置0 这样我们就得到了旋转编码器的速度/s 中断配置代码 #include "stm32f10x.h" // Device headervoid Timer_Init(void) {RCC_APB1PeriphClockC…

SWAT-MODFLOW地表水与地下水耦合

耦合模型被应用到很多科学和工程领域来改善模型的性能、效率和结果&#xff0c;SWAT作为一个地表水模型可以较好的模拟主要的水文过程&#xff0c;包括地表径流、降水、蒸发、风速、温度、渗流、侧向径流等&#xff0c;但是对于地下水部分的模拟相对粗糙&#xff0c;考虑到SWAT…

com.google.guava:guava 组件安全漏洞及健康分析

组件简介 维护者google组织许可证类型Apache-2.0首次发布2010 年 4 月 26 日最新发布时间2023 年 8 月 1 日GitHub Star48189GitHub Fork10716依赖包28,694依赖存储库219,576 Guava 是 Google 的一组核心 Java 库&#xff0c;其中包括新的集合类型&#xff08;例如 multimap 和…

Web安全——穷举爆破上篇(仅供学习)

Web安全 一、概述二、常见的服务1、burpsuite 穷举后台密码2、burpsuite 对 webshell 穷举破解密码3、有 token 防御的网站后台穷举破解密码3.1 burpsuite 设置宏获取 token 对网站后台密码破解3.2 编写脚本获取token 对网站后台密码破解 4、针对有验证码后台的穷举方法4.1 coo…

ElasticSearch安装为Win11服务

在windows的环境下操作是Elasticsearch,并且喜欢使用命令行 &#xff0c;启动时通过cmd直接在elasticsearch的bin目录下执行elasticsearch ,这样直接启动的话集群名称会默elasticsearch&#xff0c;节点名称会随机生成。 停止就直接在cmd界面按CtrlC 其实我们也可以将elasticse…

一篇文章教会你什么是二叉搜索树

二叉搜索树 二叉搜索树概念二叉搜索树操作1.二叉搜索树的查找2.二叉搜索树的插入3.二叉搜索树的删除4.二叉搜索树的遍历 二叉搜索树的实现1.二叉搜索树节点结构2.二叉搜索树类3.二叉搜索树的构造及析构4.二叉搜索树的拷贝构造及赋值重载5.二叉搜索树插入6.二叉搜索树查找7.二叉…

必读干货!独立站新手卖家常见十大问题解答

新手卖家入局跨境电商独立站&#xff0c;会考虑到很多问题&#xff0c;从网站到产品再到售卖最终的发货。而且卖家普遍对独立站存在认知不全的问题&#xff0c;门槛高、推广难、转化难是最初印象。 那独立站该怎么开始&#xff0c;如何下手&#xff1f;今天整理并解答独立站新…

数据结构--树4.2.2(二叉树--遍历)

目录 一、二叉树的建立 二、二叉树的遍历算法 一、二叉树的建立 CreateBitree(Bitree *t){char c;scanf("%c",&c);if( c){*t NULL;}else{*t(Bitnode*)malloc(sizeof(Bitnode));(*t)->data c;CreateBitree(&(*t)->lchild);CreateBitree(&(*t)-&…

Mybatis学习|注解开发、lombok

1.使用注解开发 无需再编写相应的Mapper.xml文件&#xff0c;直接将sql用注解的形式写在Mapper接口的对应方法上即可。 然后因为没有xml文件,所以要在mybatis-config.xml核心配置文件中注册这个Mapper接口&#xff0c;而不用去注册之前的Mapper.xml&#xff0c;这里其实如果用…

iOS 设置下载部分文件,如何获取完整文件的大小

在视频的需求中&#xff0c;遇到这样一个需求&#xff0c;播放一视频的时候&#xff0c;要预下载 后面10条视频&#xff0c;但是只下载后面十条视频的前面1M 实现方法 1 创建请求时设置cacheLength resource [[IdiotResource alloc] init];resource.requestURL task.request…

UE5.1 透明渲染流程框架图

相关文章&#xff1a; UE 透明物体绘制准备_sh15285118586的博客-CSDN博客 透明直接光和间接光生成_sh15285118586的博客-CSDN博客 Scene:Translucency-Translucency(AfterDOF)_sh15285118586的博客-CSDN博客 Scene:Translucency-Distortion &PostProcessing:ComposeTran…

详解vue3中ref和reactive用法和区别

vue3中ref和reactive区别 1、前言2、基本用法2.1 ref2.2 reactive 3、ref和reactive定义数组对比3.1 ref定义数组3.1 reactive定义数组 4、ref 和reactive的区别 1、前言 ref和reactive是Vue3中用来实现数据响应式的API&#xff0c;一般情况下&#xff0c;ref定义基本数据类型…

react css 污染解决方法

上代码 .m-nav-bar {background: #171a21;.content {height: 104px;margin: 0px auto;} }import React from "react"; import styles from ./css.module.scssexport default class NavBar extends React.Component<any, any> {constructor (props: any) {supe…

定位与轨迹-百度鹰眼轨迹开放平台-学习笔记

1. 百度鹰眼轨迹的主要功能接口 百度的鹰眼轨迹平台&#xff0c;根据使用场景不同&#xff0c;提供了web端、安卓端等各种类型的API与SDK&#xff0c;本文章以web端API为例&#xff0c;介绍鹰眼轨迹的使用。 2. API使用前的准备 使用鹰眼轨迹API&#xff0c;需要两把钥匙&…