Mysql数据备份与恢复实战

news2024/10/5 21:18:15

文章目录

  • 备份类型
  • 备份内容
  • 备份工具
    • 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 changed

mysql> 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这两个变量是否为1

mysql> 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`.sql

 master-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.sql
 mysqlbinlog /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.coloradmin.cn/o/1561435.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

维安电子、费斯托中国等20+智能制造企业共探渠道管理数字化

近日,纷享销客新增长100人系列活动之制造业专场,我们有幸邀请维安电子、费斯托工具一起,共同探讨制造业渠道管理的新理念、新增长和新实践。 活动聚集了维安电子、费斯托工具、唐纳森、中科新松、斯可络、江浪科技、上海沪工等等20余位标杆制…

算法学习——LeetCode力扣动态规划篇9(1035. 不相交的线、53. 最大子数组和、392. 判断子序列、115. 不同的子序列)

算法学习——LeetCode力扣动态规划篇9 1035. 不相交的线 1035. 不相交的线 - 力扣(LeetCode) 描述 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在,可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线&#x…

针对 qt的sqlite加密数据库sqlitecipher插件QtCipherSqlitePlugin

💂 个人主页:pp不会算法^ v ^ 🤟 版权: 本文由【pp不会算法v】原创、在CSDN首发、需要转载请联系博主 💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 文章目录 简介编译安装使用可视化工具查看完结 简介 在客户端存储…

【docker】基础操作命令

docker run:干两步,本地找一下有没有集装箱,有运行,没有远程仓库下载运行。还没有报错。 docker好处: 不需要进行物理层模拟,不需要hypervisor利用的内核是宿主机的内核,不需要重新加载Linux内核 镜像相关…

QT-飞机水平仪图标

QT-飞机水平仪图标 一、演示效果二、关键程序三、下载链接 一、演示效果 二、关键程序 #include <stdio.h> #include <stdlib.h> #include <string.h>#include <QtCore> #include <QtGui> #include <QDebug> #include <QTableWidget&g…

刷题之动态规划-路径问题

前言 大家好&#xff0c;我是jiantaoyab&#xff0c;开始刷动态规划的题目了&#xff0c;要特别注意初始化的时候给什么值。 动态规划5个步骤 状态表示 &#xff1a;dp数组中每一个下标对应值的含义是什么->dp[i]表示什么状态转移方程&#xff1a; dp[i] 等于什么1 和 2 是…

python毕业设计django宠物寄存系统fn62p

本文所设计的宠物寄存中心系统的设计与实现拥有前端和后端&#xff0c;前端使用Vue.js框架和创建&#xff0c;后端使用django框架创建&#xff0c;开发语言采用python&#xff0c;使用Mysql数据库对后台数据进行存储。将pcyahrm作为主要的开发工具。接着进行系统的需求分析、功…

surfer绘制等值线图

surfer介绍 Surfer软件&#xff0c;是美国Golden Software公司编制的一款以画三维图的软件。该软件具有强大的插值功能和绘制图件能力&#xff0c;可用来处理XYZ数据&#xff0c;是地质工作者常用的专业成图软件&#xff08;来源于百度百科&#xff09;。 surfer可以用来绘制…

Linux文件与进程交互的窥探者lsof

lsof 是一个 Linux 和 UNIX 系统中的实用工具,用于列出系统中打开文件的所有信息。这个名字代表 “List Open Files”,但它也可以显示进程相关的其他信息,如: 打开的文件描述符列表 打开网络连接的列表 被进程使用的信号和内核对象等 在Linux系统中,有一个经典的概念: …

NOSQL - Redis的简介、安装、配置和简单操作

目录 一. 知识了解 1. 关系型数据库与非关系型数据库 1.1 关系型数据库 1.2 非关系型数据库 1.3 区别 1.4 非关系型数据库产生背景 1.5 NOSQL 与 SQL的数据记录对比 2. 缓存相关知识 2.1 缓存概念 2.2 系统缓存 2.3 缓存保存位置及分层结构 二 . redis 相关知识 1.…

【MySQL】13. 索引(重点)

1. 没有索引&#xff0c;可能会有什么问题 索引&#xff1a;提高数据库的性能&#xff0c;索引是物美价廉的东西了。 不用加内存&#xff0c;不用改程序&#xff0c;不用调sql&#xff0c;只要执行正确的 create index &#xff0c;查询速度就可能提高成百上千倍。 但是天下没…

如何提高小红书笔记的收录率?

在小红书平台上&#xff0c;笔记的收录率是衡量一篇笔记是否受欢迎和有价值的重要因素。为了提高笔记的收录率&#xff0c;有几个关键点需要注意&#xff1a; 1.内容不涉及广告 在发布笔记前要先确保笔记内容不包含任何形式的广告或推广信息。小红书平台对于广告性质的内容有…

关于 HEAP CORRUPTION DETECTED:after Normal block 错误的原因及解析

目录 一、HEAP CORRUPTION DETECTED:after Normal block 出现的报错情况&#xff1a; 二、问题原因&#xff08;重要&#xff09;&#xff1a; 三、举例 1.错误代码如下&#xff1a; 2.错误原因及分析&#xff08;重要&#xff09;&#xff1a; 3.解决方法 ​编辑 4.正…

OMP压缩感知仿真(MATLAB)

clc; clearvars; close all;% 读文件 Ximread(mandrill256.bmp); tic; Xdouble(X); [m,n]size(X);% % 小波变换矩阵生成 [LL1, LH1, HL1, HH1] dwt2(X, haar); [LL2, LH2, HL2, HH2] dwt2(LL1, haar); % [LL3, LH3, HL3, HH3] dwt2(LL2, haar); % [LL4, LH4, HL4, HH4] d…

Demis Hassabis,这位被封为爵士的AI领域的杰出研究者和神经科学家,是否能成为Google的救星?

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Jquery——js库

1. jQuery 基础操作 jQuery 是一个快速、小巧的 JavaScript 库&#xff0c;设计用于简化 HTML 文档的遍历、事件处理、动画设计和 Ajax 交互。jQuery 使用户能够更快地编写 JavaScript 代码&#xff0c;并且能够更容易地处理 HTML 文档、事件、动画和 Ajax。 加载 jQuery 要…

HDLbits 刷题 -- Alwaysblock2

学习&#xff1a; For hardware synthesis, there are two types of always blocks that are relevant: Combinational: always (*)Clocked: always (posedge clk) Clocked always blocks create a blob of combinational logic just like combinational always blocks, but…

【DETR系列目标检测算法代码精讲】01 DETR算法03 Dataloader代码精讲

与一般的Dataloader的区别在于我们对图像进行了随机裁剪&#xff0c;需要进行额外的操作才能将其打包到dataloader里面 这一段的代码如下&#xff1a; if args.distributed:sampler_train DistributedSampler(dataset_train)sampler_val DistributedSampler(dataset_val, shu…

LeetCode-48. 旋转图像【数组 数学 矩阵】

LeetCode-48. 旋转图像【数组 数学 矩阵】 题目描述&#xff1a;解题思路一&#xff1a;一行代码&#xff01;Python zip函数图一乐【zip函数实现主对角线翻转&#xff0c;[::-1]实现垂直翻转】解题思路二&#xff1a;其实我们也可以先水平轴翻转&#xff0c;让后主对角线翻转。…

Linux之用户账号、用户组和与账号有关的系统文件

目录 一、基本介绍 1.用户和用户组 2.UID和GID 二、 账户管理 1.查看用户的UID和GID 2.添加账户 3.删除账号 4.修改账号 5.账户口令 三、分组管理 1.新增用户组 2.删除用户组 3.修改用户组 4.用户组切换 四、与账号有关的系统文件 1./etc/passwd 2./etc/shado…