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

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

相关推荐
一朝入魔29 分钟前
oracle 中创建 socket客户端 监听数据库变动,返回数据给服务端!!!
数据库·oracle
洛北辰南2 小时前
系统架构设计师—案例分析—数据库篇—分布式缓存技术
数据库·分布式·系统架构·缓存技术
星光璀璨山河无恙3 小时前
【MySQL】数据库简要介绍和简单应用
数据库·mysql
px52133443 小时前
Solder leakage problems and improvement strategies in electronics manufacturing
java·前端·数据库·pcb工艺
啥都想学的又啥都不会的研究生3 小时前
Redis设计与实现-数据持久化
java·数据库·redis·笔记·缓存·面试
新知图书3 小时前
Windows下安装MongoDB 8
数据库·windows·mongodb
jay丿4 小时前
Django 分页操作详解
数据库·django·sqlite
誰能久伴不乏4 小时前
深入理解 Qt 系统托盘图标:创建自定义的系统托盘图标类
数据库·qt·microsoft
cherry52304 小时前
【第4章】项目实战-亿级电商系统需求分析
大数据·数据库·架构·需求分析
吐泡泡_4 小时前
MySQL(事物下)
数据库·mysql