Mysql数据备份与恢复实战

文章目录

  • 备份类型
  • 备份内容
  • 备份工具
    • mysqldump备份
  • 实战案例:恢复误删除的表
    • 准备工作
    • 2:30完全备份
    • 完全备份后更新数据表
    • 10:00误删students表
    • 需要恢复还原的状态
    • 开始还原恢复

为什么要备份?

备份是为了:灾难恢复:硬件故障、软件故障、自然灾害、黑客攻击、误操作等数据丢失场景。

备份类型

完全备份:整个数据集
部分备份:只备份数据子集,如部分库或表
增量备份:仅备份最近一次完全备份或增量备份(如果存在增量)以来变化的数据,备份较快,还原复杂
差异备份:仅备份最近一次完全备份以来变化的数据,备份较慢,还原简单。冷备份:读写操作均不可进行,数据库停止服务
温备份;读操作可执行,但写操作不可执行
热备份:读写操作均可执行MyISAM: 温备,不支持热备
InnoDB: 都支持物理备份:直接复制数据文件进行备份,与存储引擎有关,占用较多的空间,速度快
逻辑备份:从数据库中“导出”数据另存而进行备份,与存储引擎无关,占用空间少,速度慢,可能丢失精度。

注意:二进制日志文件不应该与数据文件放在同一磁盘。

备份内容

备份什么?1.数据2.二进制日志、InnoDB的事务日志3.用户账号,权限设置,程序代码(存储过程、函数、触发器,事件调度器)4.服务器的配置文件

备份工具

mysqldump备份

命令格式

Usage: mysqldump [OPTIONS] database [tables]
OR     mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR     mysqldump [OPTIONS] --all-databases [OPTIONS]

实战案例:恢复误删除的表

案例说明:每天凌晨2:30做完全备份,早上10:00误删除了students表,10:10才发现故障,现在需要将数据库还原到10:10的状态,且恢复被删除的students表。

准备工作

恢复数据之前的准备工作1.准备数据库和数据表2.确保二进制日志已经开启

现有hellodb数据库中的students、teachers…等数据表

mysql> use hellodb;
Database changedmysql> show tables;
+-------------------+
| Tables_in_hellodb |
+-------------------+
| classes           |
| coc               |
| courses           |
| scores            |
| students          |
| teachers          |
| toc               |
+-------------------+
7 rows in set (0.01 sec)

现students、teachers表中有如下数据

mysql> select * from students;
+-------+---------------+-----+--------+---------+-----------+
| StuID | Name          | Age | Gender | ClassID | TeacherID |
+-------+---------------+-----+--------+---------+-----------+
|     1 | Shi Zhongyu   |  22 | M      |       2 |         3 |......
|    24 | Xu Xian       |  27 | M      |    NULL |      NULL |
|    25 | Sun Dasheng   | 100 | M      |    NULL |      NULL |
+-------+---------------+-----+--------+---------+-----------+
25 rows in set (0.00 sec)mysql> select * from teachers;
+-----+---------------+-----+--------+
| TID | Name          | Age | Gender |
+-----+---------------+-----+--------+
|   1 | Song Jiang    |  45 | M      |
......
|   3 | Miejue Shitai |  77 | F      |
|   4 | Lin Chaoying  |  93 | F      |
+-----+---------------+-----+--------+
4 rows in set (0.01 sec)

确认二进制日志是否开启

#确认log_bin和sql_log_bin这两个变量是否为1mysql> select @@log_bin;
+-----------+
| @@log_bin |
+-----------+
|         1 |
+-----------+mysql> select @@sql_log_bin;
+---------------+
| @@sql_log_bin |
+---------------+
|             1 |
+---------------+

目前二进制日志文件的位置

mysql> show master logs;
+---------------+-----------+-----------+
| Log_name      | File_size | Encrypted |
+---------------+-----------+-----------+
| binlog.000001 |     10753 | No        |
+---------------+-----------+-----------+
# 执行备份之前二进制日志文件,文件名为binlog.000001,文件大小(File_size)在10753处

2:30完全备份

 mysqldump -uroot -F -A --single-transaction --master-data=2 > /data/full_`date +%F`.sql#WARNING: --master-data is deprecated and will be removed in a future version. Use --source-data instead.mysqldump -uroot -F -A --single-transaction --source-data=2 > /data/full_`date +%F`.sqlmaster-data参数mysql8.0.26以后的版本改为source-data了,上面的WARNING中有提示,我的这个是8.0.32版本的

在这里插入图片描述
full_2024-03-29.sql中记录着二进制日志文件的位置,如下截图:
在这里插入图片描述
在这里插入图片描述

完全备份后更新数据表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在完全备份之后,系统可能做了很多的数据库操作,很多的操作会导致越来越多的二进制文件生成binlog.000004、binlog.000005…等等

我们可以使用flush log来模拟下生成了多个二进制日志文件

mysql> flush logs;
Query OK, 0 rows affected (0.03 sec)mysql> show master logs;
+---------------+-----------+-----------+
| Log_name      | File_size | Encrypted |
+---------------+-----------+-----------+
| binlog.000001 |     10797 | No        |
| binlog.000002 |       201 | No        |
| binlog.000003 |       809 | No        |
| binlog.000004 |       157 | No        |
+---------------+-----------+-----------+
4 rows in set (0.00 sec)mysql> insert students (name,age,gender) values('leilei',20,'F');
Query OK, 1 row affected (0.00 sec)mysql> insert students (name,age,gender) values('mengm',18,'M');
Query OK, 1 row affected (0.00 sec)mysql> show master logs;
+---------------+-----------+-----------+
| Log_name      | File_size | Encrypted |
+---------------+-----------+-----------+
| binlog.000001 |     10797 | No        |
| binlog.000002 |       201 | No        |
| binlog.000003 |       809 | No        |
| binlog.000004 |       768 | No        |
+---------------+-----------+-----------+
4 rows in set (0.00 sec)

10:00误删students表

mysql> drop table students;
Query OK, 0 rows affected (0.01 sec)

students表误删后,teachers表还在持续更新中

mysql> drop table students;
Query OK, 0 rows affected (0.01 sec)mysql> insert teachers (name,age,gender) values('wang',30,'M');
Query OK, 1 row affected (0.00 sec)mysql> insert teachers (name,age,gender) values('mage',28,'M');
Query OK, 1 row affected (0.01 sec)
mysql> select * from teachers;
+-----+---------------+-----+--------+
| TID | Name          | Age | Gender |
+-----+---------------+-----+--------+
|   1 | Song Jiang    |  45 | M      |
|   2 | Zhang Sanfeng |  94 | M      |
|   3 | Miejue Shitai |  77 | F      |
|   4 | Lin Chaoying  |  93 | F      |
|   5 | wang          |  30 | M      |
|   6 | mage          |  28 | M      |
+-----+---------------+-----+--------+
6 rows in set (0.00 sec)

需要恢复还原的状态

此时继2:30分的完全备份后,我们需要恢复还原哪些数据

继2:30的完全备份后我们需要恢复1.students表更新的4条记录2.十点钟误删的students表3.teachers表更新的2条记录

开始还原恢复

在做数据的恢复还原之前,有几句心得不知当讲不当讲!!!

还是讲吧,“不要拿生产做测试啊!!!”,这是领导怼我的原话。懂我意思吧,能感受到语气的气浪吗!!!记住,哥们,就算你再有把握恢复数据,也请单独拿一个测试机出来,真正恢复出来了再上生产!!!切记!!!切记!!!切记!!!程序数据这玩意儿你还真得信邪,搞不好生产环境被你弄成一锅粥还不如不恢复!!!

我们将备份出来的sql拷贝到另一台远程主机上做测试

凌晨2:30分的完全备份后的数据更新是从二进制日志文件binlog.000003的157处开始的,所以完全备份之后的更新数据是从157之后的所有内容。
在这里插入图片描述
在这里插入图片描述
将二进制备份出来的内容导入到一个sql文件中

 mysqlbinlog --start-position=157 /var/lib/mysql/binlog.000003 > /data/inc.sqlmysqlbinlog /var/lib/mysql/binlog.000004 >> /data/inc.sql  # '>>'是追加内容,不会覆盖之前的内容。

至此2:30已将数据完全备份至full_2024-03-29.sql文件中,
2:30和10:00之间数据库更新删除操作已经备份至inc.sql文件中了。
在这里插入图片描述
因为inc.sql中有drop table students的语句,所以我们要找到这个误删除的语句,搞掉这个drop语句之后再恢复还原。

grep -i drop inc.sql 
#DROP TABLE `students` /* generated by server */
sed -n '/DROP TABLE `students`/p' inc.sql 
#DROP TABLE `students` /* generated by server */
sed -i '/DROP TABLE `students`/d' inc.sql 
sed -n '/DROP TABLE `students`/p' inc.sql 

将备份出来的sql文件拷贝到另一台远程主机10.0.0.206的data目录下,先在206这台机器上做测试还原,没问题了再在原来的主机上还原恢复。

[root@rocky data]# scp /data/* 10.0.0.206:/data
The authenticity of host '10.0.0.206 (10.0.0.206)' can't be established.
ECDSA key fingerprint is SHA256:jXjzWTy4SJ9SVHPzyzO0XRP60n9QAWDC5kwQBX/tc0U.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.0.0.206' (ECDSA) to the list of known hosts.
root@10.0.0.206's password: 
full_2024-03-29.sql                                                                                                           100% 1262KB 106.0MB/s   00:00    
inc.sql                                                                                                                       100%   12KB  14.7MB/s   00:00    
[root@rocky data]# 

执行远程拷贝过来的sql原文件

mysql> source /data/full_2024-03-29.sql;mysql> source /data/inc.sql;

如下图已经将2:30分的完全备份和2:30到10:00之前的新增数据都还原恢复了。
在这里插入图片描述

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

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

相关文章

CSP-S2020提高级T3:函数调用

题目链接 [CSP-S2020] 函数调用 题目描述 函数是各种编程语言中一项重要的概念,借助函数,我们总可以将复杂的任务分解成一个个相对简单的子任务,直到细化为十分简单的基础操作,从而使代码的组织更加严密、更加有条理。然而&…

Netty源码剖析——ChannelPipeline 调度 handler 的源码剖析(三十九)

ChannelPipeline 调度 handler 的源码剖析 源码剖析目的 当一个请求进来的时候,ChannelPipeline 是如何调用内部的这些 handler 的首先,当一个请求进来的时候,会第一个调用 pipeline 的 相关方法,如果是入站事件,这些方…

突破编程_前端_JS编程实例(分割窗体组件)

1 开发目标 分隔窗体组件旨在提供灵活的窗体分隔功能,支持横向分割与纵向分隔两种类型,并具备拖拽调整窗体比例的功能,同时提供最小比例设置,以防止窗体被过度缩小: 2 详细需求 2.1 分隔窗体类型 (1&…

数据类型和类型检测

Data Type And Type Checking 1.编程语言中的数据类型 类型和变量 一个类型是一系列值的集合,这些集合可以抽象出一个相同的特点,并且可以相互实现计算 例如: 布尔类型:true or false整形:1,2,3…浮点数类型&#xf…

JUC:double-checked locking(DCL) 懒汉单例模式

文章目录 double-checked locking(DCL) 问题解决方法 volatile作用 double-checked locking(DCL) 问题 第一个if用于后续进入的线程,不用再获取锁来判断是否已经创建了对象。第二个if,为的是第一个进入的线程创建对象,以及防止卡在第一个if之…

提升你的CSS技能:深入理解伪类选择器和伪元素选择器!

在CSS的世界里,有些选择器并不像它们的名字那样直接。今天,我们要探索的是两种特殊的选择器:伪类选择器和伪元素选择器。它们虽然名字相似,但功能和用途却大有不同。 下面就让我们一起来了解一下它们是如何在我们的页面布局中扮演…

GoogleNet神经网络介绍

一、简介 GoogleNet,也称为GoogLeNet,是谷歌工程师设计的一种深度神经网络结构,它在2014年的ImageNet图像识别挑战赛中取得了冠军。该神经网络的设计特点主要体现在其深度和宽度上,通过引入名为Inception的核心子网络结构&#x…

vue项目视频播放ckplayer使用

ckplayer 官方网址,点击访问 1,打开网页后能看到这里,我现在使用的是最新 X3版手册 2,这个ckplayer不是npm 插件,要下载安装包解压到项目里面使用 安装包网址 通过gitee下载 3,解析安装包到项目中 publ…

护眼台灯哪个牌子最好,护眼台灯五大品牌墙裂分享

近视在儿童中愈发普遍,许多家长开始认识到,除了学业成绩之外,孩子的视力健康同样重要。毕竟,学业的落后可以逐渐弥补,而一旦孩子近视,眼镜便可能成为长期伴随。因此,专业的护眼台灯对于每个家庭…

【zlm】音视频流与音频流合并的设计

目录 设想一 设想二 方案三 关键技术 测试语句 测试脚本 参考文档 设想一 //开始录制_option.mp4_save_path custom_path;_option.mp4_max_second max_second;vector<Track::Ptr> mytracks getTracks();auto src MediaSource::find( DEFAULT_VHOST, "1&quo…

今天起,ChatGPT无需注册就能用了!

就在刚刚&#xff0c;OpenAI狠狠地open了一把&#xff1a; 从今天起&#xff0c;ChatGPT打开即用&#xff0c;无需再注册帐号和登录了&#xff01; 像这样&#xff0c;直接登录网站&#xff0c;然后就可以开启对话&#xff1a; OpenAI对发布这个“超自由版ChatGPT”的解释是&am…

将 EDI 从 VAN 迁移到知行之桥:EDI 成本降低 90%

G公司帮助零售商在网上和实体店取得成功&#xff0c;是来自300家顶级制造商网络中包含狩猎&#xff0c;钓鱼&#xff0c;露营和体育用品等45,000 多种商品的批发分销商。 通过可靠的客户服务、良好的定价和超越标准大卖场产品的库存量&#xff0c;G公司的重点是为零售商、电子…