mysql 数据备份和恢复

操作系统:22.04.1-Ubuntu

mysql 版本:8.033

binlog 介绍

binlog 是mysql 二进制日志 binary log的简称,可以简单理解为数据的修改记录。

需要开启binlog,才会产生文件,mysql 8.0 默认开启,开启后可以在 /var/lib/mysql (这是mysql默认数据存储路径,如果用户自己指定则另说) 目录下看到一系列 binlog.xxxxxx 的文件

binlog刷新

每次mysql重启 都会生成一个新的binlog文件,也可以使用命令来刷新binlog

1、进入mysql,使用flush logs,会看到新生成了新的binlog.000011文件

2、mysqladmin -uroot -p flush-logs(这里也需要root账号密码)

备份与恢复

以下是官网的关于备份与恢复的翻译:

完整备份是必要的,但创建它们并不总是很方便。它们会生成大型备份文件,并且需要时间来生成。它们不是最佳的,因为每次连续的完全备份都包括所有数据,即使是自上次完全备份以来没有更改的部分。先进行初始完全备份,然后进行增量备份会更高效。增量备份更小,生成时间更短。代价是,在恢复时,不能仅通过重新加载完整备份来恢复数据。您还必须处理增量备份以恢复增量更改
官网关于备份恢复的链接

简而言之就是2种方式,完整和增量,优缺点也如上所述,下面描述2种方式的使用

完整备份与恢复

完整备份就是将所有数据以表的形式进行保存

备份

命令

bash 复制代码
mysqldump --all-databases --master-data --single-transaction > back_20220806_112100.sql

备份的同时刷新binlog文件

bash 复制代码
mysqldump --single-transaction --flush-logs --master-data=2 --all-databases > back_20220806_112100.sql


mysqldump 指令选项说明

恢复

如何恢复

执行指令

bash 复制代码
mysql <  back_20220806_112100.sql

如果需要密码则

bash 复制代码
mysql -uroot -p <  back_20220806_112100.sql

该指令相当于执行了备份文件中的sql语句。

可以先可以查看 备份文件,发现里面基本是以下语句:删除表,创建表,数据的插入 ,显然是以表为单位来备份的,恢复时也是以表来恢复的

因此可以得出结论:在利用备份文件进行数据恢复时,会恢复备份前的所有表数据,但不包括备份后新增加的表,新增的表有以下2中情况:

1、同一个数据库存在相同的表则被则会被覆盖

2、同一个数据库存在不同的表则忽略,因为备份文件中不含任何对该表的操作

增量恢复

备份

前面我们已经描述过 binlog是一个数据修改记录的文件,默认一个binlog文件代表一次运行的所有数据修改记录,然后也可以使用命令强制生成一个新的binlog文件作为新的起点来记录数据修改过程,因此增量备份 其实是自动的,就是一个个binlog文件

恢复

恢复的前提是要备份,完整备份和增量备份在上面已经描述清楚,因此数据恢复就是利用备份文件+binlog文件来做任意回滚

举个例子,执行备份指令

bash 复制代码
mysqldump --single-transaction --flush-logs --master-data=2 --all-databases > back_20220806_153500.sql

生成备份文件以及新的binlog文件,从000005开始的binlog文件都是back_20220806_153500.sql备份文件的增量文件

在上面的基础上(生成了back_20220806_153500.sql 以及新的binlog.000005),现在做一个简单测试来验证数据恢复,分为几个步骤

  • 步骤1、新增一个数据库incrementTestDatabase,再添加一个表incrementTestTable,包含了id、test字段,以及一条数据(1,"test1")
  • 步骤2、刷新binlog日志
  • 步骤3、删除incrementTestTable,在创建一个incrementTestTable表包含了id、test字段,以及一条数据(2,"test2")
  • 步骤4、恢复成1中的数据(1,"test1")
  • 步骤5、恢复成3中的数据(2,"test2")
    开始测试
    执行步骤1,2效果

    执行步骤3后

    现在我们开始执行步骤4
    显然我们知道
    binlog.000005中包含了数据(1,"test1")的新建
    binlog.000006中包含了表的删除及(2,"test2")的新建
    因此要恢复到步骤1,只需要back_20220806_153500.sql + binlog.000005
    先恢复备份
bash 复制代码
mysql -uroot -p <  back_20220806_153500.sql

备份基础上恢复修改记录

bash 复制代码
mysqlbinlog binlog.000005 | mysql -uroot -p

结果如下,与预料中的一样

现在我们开始执行步骤5,在步骤4的基础上,恢复binlog.000006

bash 复制代码
mysqlbinlog binlog.000006 | mysql -uroot -p

结果如下,与预料中的一样

相关推荐
不脱发的程序猿5 小时前
纳指ETF量化策略
数据库·人工智能·1024程序员节
程序员塔塔喵6 小时前
【MySQL篇|第一篇】索引失效的情况
数据库·mysql·索引失效
paopaokaka_luck6 小时前
宠物门店经营管理系统(销售与库存联动、进货自动记账、 退换与退款关联、员工个人业绩、ECharts 经营分析、滞销识别与客户分层、宠物档案年龄计算)
前端·javascript·spring boot·mysql·echarts·mybatis·1024程序员节
北京青蓝智慧马老师6 小时前
比外部黑客更难防的,是那个有权限的自己人(3 个脱敏复盘)
大数据·数据库·人工智能
笃行3506 小时前
拆一台数据集成产品:KFS 的骨架、肌肉和神经
数据库
4SAPI7 小时前
搭建 AI 数据分析工具大模型 API 选型指南
数据库·人工智能·架构·php·1024程序员节
paopaokaka_luck8 小时前
心理咨询管理系统(WebSocket实时沟通、基于用户的协同过滤、 ECharts多维分析、 预约业务流程、预约校验与定时处理)
java·vue.js·spring boot·mysql·spring·echarts·1024程序员节
码士集团小青8 小时前
面霸篇:高频 Java 基础问题(核心卷一)
linux·服务器·数据库·redis·缓存·1024程序员节
2301_32241428048 小时前
springboot农产品交易平台的设计与实现08055-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·spring boot·redis·mysql·tomcat·maven·mybatis
LMT流氓兔9 小时前
第五单元——第十二课:把脚本整理成项目
java·数据库·python·langchain·1024程序员节