MySQL备份与还原

MySQL使用过程中,难免会出现不可抗力,这时候就体现了备份的重要性,MySQL备份在日常操作中是非常重要的,应该不会不知道备份是什么意思吧。

数据备份的类型有很多,有物理备份和逻辑备份

物理备份

物理备份是指直接复制数据库的物理文件,如数据文件、日志文件等。这种备份方式通常速度较快,适合大型数据库的快速恢复

冷备份

冷备份就是再关闭数据库的时候进行的

冷备份也被称为脱机备份,它是指在数据库关闭的情况下进行的备份操作,因此也被称为全备份。这种 备份方式的优点是简单全面且无需额外资源,但劣势就是必须在数据库脱机的情况下进行,这在生产环 境中往往是无法接受的。

热备份

热备份就是处于运行状态进行的

热备份也称为在线备份,这种备份在数据库运行(在线)状态下进行,可以提供24小时的服务,不会因为备份而影响业务的正常运行。这是一个比较复杂的过程,需要数据库的支持,并且备份过程中需要对每个数据文件申请开始和结束备份的操作,否则可能会备份到一些不一致的数据。热备份优点是可以在数据库运行过程中进行备份,备份的细粒度可以调控,对业务几乎无影响;缺点是复杂,消耗系统和数据库资源

温备份

数据库锁定表格的状态下进行备份操作

温备份介于冷备份和热备份之间。一般来讲,温备份是指数据库在非峰值时间进行的备份,这时数据库可能未关闭但流量较小。和冷备份与热备份相比,温备份的优点是可以供不停机的环境下用作备份,同 时也不会像热备份那样对在线服务产生太大影响;但和热备份相比,它无法提供24小时的全天候备份服务。当然,实际应用中这个概念使用得较少,通常用冷备份和热备份来区分备份操作。

逻辑备份

逻辑备份是对数据库逻辑组件的备份,表示为逻辑数据库结构,这种类型的备份适用于可以编辑数据值或表结构

完全备份

完整备份是指备份整个数据库的所有数据和结构。这种备份方式确保了备份的完整性和一致性,但同时也需要较多的时间和存储空间

但是这种备份策略是最简单和最可靠的,但需要占用大量的存储空间和时间,这种策略通常再首次备份或者数据量不大的情况下使用

差异备份

差异备份是指备份自上次完整备份以来发生变化的所有数据。这种备份方式减少了备份所需的时间和存储空间,但恢复时需要先恢复最近的完整备份,再恢复最近的差异备份。

差异备份仅备份自上次完整备份以来的变更数据,恢复时需要先恢复完整备份,再恢复差异备份,占用较少的存储空间,但备份时间相对较长。

增量备份

增量备份是指备份自上次备份(无论是完整备份、差异备份还是增量备份)以来发生变化的所有数据。这种备份方式进一步减少了备份所需的时间和存储空间,但恢复时需要按顺序恢复所有相关的增量备份。

增量备份进行数据恢复时需要按顺序恢复所有相关的增量备份,占用最少的存储空间,但备份和恢复过程较为复杂,如果有一个备份丢失或者损坏,那么可能导致无法完全恢复数据

几种备份方式的比较:

首先三个数据库分别采用三种备份方式,然后都进行第一次完全备份,备份了表1、表2

然后三个数据库都插入表三

此时,完全备份会备份表123,差异备份会备份表3,增量备份会备份表3

再在三个数据库分别插入表4进行备份

此时,完全备份依然是备份所有表(表1234),差异备份会备份表34,增量备份会备份表4

MySQL完全备份

MySQL完全备份确实是对整个数据库、数据库结构和文件结构的备份,它保存的是备份完成时刻的数据库状态。完全备份是差异备份与增量备份的基础,因为它提供了一个基准点,后续的差异或增量备份都是基于这个基准点进行的。

MySQL完全备份的优缺点

优点:

备份与恢复操作方便,完全备份提供了一个完整的数据集,因此在恢复时不需要考虑其他备份文件,只需恢复这个完全备份即可。恢复过程也相对简单,不需要复杂的步骤或按特定顺序恢复多个备份文件。

缺点:

由于每次完全备份都包含所有数据,因此如果数据变化不大,备份文件中会包含大量重复的数据。

完全备份需要存储整个数据库的数据,因此会占用较多的存储空间。

由于需要备份所有数据,完全备份的过程通常比差异备份或增量备份更耗时,同样,在恢复时也需要更多的时间来恢复整个数据库。

物理备份与恢复很简单,关闭数据库,使用tar命令直接打包数据库文件夹,直接替换现有的MySQL目录即可。

MySQL有自带的备份工具mysqldump,可以将指定的库、表导出为SQL脚本,使用命令导入备份的数据。

首先创建一个新的表,插入几条数据,来模拟我们的数据库

物理冷备份与恢复

systemctl stop mysqld

tar jcvf /opt/mysql_all_$(date +%F).tar.xz /usr/local/mysql/data/ ##压缩备份

mv /usr/local/mysql/data/ /opt/ ##移除数据,模拟数据丢失

解压恢复

tar jxvf /opt/mysql_all_[压缩时的时间,自动补全就好].tar.xz -C /usr/local/mysql/data/

mysqldump备份与恢复

1.完全备份一个或多个完整的库

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

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

例:

备份abc 和 xyz 两个数据库的结构和数据

mysqldump -u root -p --databases xyz abc > /opt/bak.sql

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

mysqldump -u -p[密码] --all-database > /opt/all.sql

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

如备份test 库中的abc 和 xyz

mysqldump -u root -p[密码] test 123 abc > /opt/bak.sql

使用 -d 选项与不使用 -d 选项的区别

使用 -d ,说明只保存该数据库的表结构

不使用 -d ,表数据和结构都进行备份

4.查看备份文件

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

备份完之后需要进行恢复的时候,翻过来重定向

mysql -uroot -p[密码] [库名] < /opt/bak.sql

如果是

mysql -u root -p[密码] -database [库名] >

表示针对school库下的所有表

增量备份与恢复

MySQL中增量备份的恢复也分为集中

1.一般恢复

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

2.基于位置恢复

数据库在某一时间点可能既有错误的操作也有正确的操作,可以基于精准的位置跳过错误的操作,从发生错误的节点之前的一个节点开始,到上一个正确操作的节点停止

3.基于时间点恢复

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

想要进行增量备份,首先要开启二进制日志功能

vim /etc/my.cnf

mysqld

log-bin=mysql-bin

binlog_format = mixed

server-id = 1

二进制文件记录了数据库的所有更改操作,包括数据修改和结构修改

首先复制二进制日志文件到/opt下

cp /usr/local/mysql/data/mysql-bin.000002 /opt/

想要查看二进制日志文件需要用到工具 mysqlbinlog

mysqlbinlog --no-defaults /opt/mysql-bin.000002

解码按行显示内容,进行详细查看:

mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002

导出为文本文件:

mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002 > /opt/mysql-bin.000002.txt

一般恢复其实就是和MySQL完全备份恢复操作差不多,只不过不指定所有库

还可以基于mysql-bin.000002恢复

mysqlbinlog --no-defaults /opt/mysql-bin.000002 | mysql -u root -p

断点恢复

基于位置恢复

分为两个步骤,首先确认位置点,然后再基于位置恢复

mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.00000X

查看二进制文件,确认操作错误的步骤的位置

比如操作id为 500 700

那我们就需要恢复到操作id为 500 之前的数据

mysqlbinlog --no-defaults --stop-position='500' /opt/mysql-bin.00000X | mysql uroot -p

恢复700之后的数据

mysqlbinlog --no-defaults --start-position='700' /opt/mysql-bin.00000X | mysql uroot -p

基于时间点恢复

其实和基于位置恢复大同小异,只是将操作id改成了时间

比如恢复2024年9月1日17:00之前的数据

mysqlbinlog --no-defaults --stop-datetime='2024-09-01 17:00:00' /opt/mysql bin.00000X | mysql -uroot -p

同理,恢复某时间之后的数据就是将stop改成start

相关推荐
一只大袋鼠30 分钟前
Redis 安装+基于短信验证码登录功能的完整实现
java·开发语言·数据库·redis·缓存·学习笔记
Anastasiozzzz31 分钟前
深入研究Redis的ZSet底层数据结构:从 Ziplist 的级联更新到 Listpack 的完美救场
数据结构·数据库·redis
菠萝蚊鸭34 分钟前
x86 平台使用 buildx 基于源码构建 MySQL Wsrep 5.7.44 镜像
数据库·mysql·galera·wsrep
沙漏无语3 小时前
(二)TIDB搭建正式集群
linux·数据库·tidb
思麟呀3 小时前
计算机网络初步认识
linux·计算机网络
姚不倒3 小时前
三节点 TiDB 集群部署与负载均衡搭建实战
运维·数据库·分布式·负载均衡·tidb
浩子智控3 小时前
zynq嵌入式开发(2)—基本开发测试实例
linux·嵌入式硬件·硬件架构
隔壁小邓3 小时前
批量更新方式与对比
数据库
闻道且行之3 小时前
Nginx 安装、做成服务及 HTTPS 配置全流程
linux·运维·nginx·https
数据知道3 小时前
MongoDB复制集架构原理:Primary、Secondary 与 Arbiter 的角色分工
数据库·mongodb·架构