数据库系列之分布式数据库下误删表怎么恢复?

数据的完整性是数据库可用性的基本功能,在实际应用数据库变更操作过程中可能因为误操作导致误删表或者truncate操作影响业务的正常访问。本文介绍了分布式数据库中在误删表场景下的数据恢复方案,并进行了对比。


1、数据库误删表恢复方案

应用数据的完整性是保证应用系统正常服务的重要基础,在实际应用DDL部署过程或数据库变更过程中,可能因为误操作导致应用关键表被误删除或truncate,影响业务的正常访问。分布式数据库中当误删表时有不同的数据恢复方案:

  1. 基于数据库备份+增量日志:该方案的前提是数据库有一份全量的备份数据,在这个全量备份数据的基础之上应用增量的数据库日志,并且跳过误操作的日志,进而完成表数据的恢复。基于数据库备份的恢复方案在库数据量大或者增量日志多的时候耗时较长,在这个恢复的过程中应用是无法正常访问的。
  2. 基于闪回技术:数据库闪回技术是基于回收站和数据库undo日志完成数据库的恢复操作,undo数据用于记录数据修改之前的状态信息,数据库会将这部分数据写入undo段中用于回滚事务,或者发生错误时恢复数据到修改前的状态。对于误删表等操作,数据库中实际上是一个rename操作,将表移动到回收站,只要回收站中的空间足够且未被清理,就可以使用闪回删除来恢复被删除的表。
  3. 基于延迟复制方案:延迟复制一般是在主备部署架构的数据库中通过备节点延迟复制主节点的数据,当主节点出现逻辑上的误操作如误删表时,利用备节点延迟同步和跳过特定的误操作事务日志来恢复数据。延迟复制通常是在生产集群之外再建一个单独的最小化备集群,需要额外的部署成本,同时依赖数据库厂商实现延迟复制并跳过特定的事务。

在误删表的故障场景下业务访问误删除的表会报错,业务对其它表的访问仍然正常。下文将简要介绍分布式数据库下以上三种误删表操作下的数据恢复方法。

2、分布式数据库下误删表恢复方法
2.1 基于备份+增量日志的恢复

数据库的完整备份数据和增量日志是保证数据库完整性的基础,一些重要的应用系统每天会进行全量或增量的数据库备份,在数据恢复的过程中首先基于这些备份数据恢复到备份时点的数据,再通过增量日志追加的方式将数据恢复到PITR一致时间点。在误删表等特殊场景下,增量追加日志的时候需要将这一特殊的操作跳过,而在分布式数据库中还需要恢复多个实例的数据和以及计算节点层的元数据信息。以下以GoldenDB分布式数据库为例介绍这种误删表恢复方案的恢复过程。

在这里插入图片描述

1)恢复误删表的表结构
从保存的DDL中恢复出表结构信息,用于后续表结构恢复。

2)登录到每个分片的主节点,解析binlog并获取到删表操作的gtidX信息

#执行命令
$mysqlbinlog -vv mysql-bin.xxx |grep -i -B20 ‘drop table’

找到类似如下信息:

SET @@SESSION.GTID_NEXT=’xxxx’/*!*/;
DROP TABLE xx.xx /*generated by server*/

3)选取待恢复的备节点,并使用全量备份数据恢复备节点

##停止备节点
$dbmoni -stop
##使用restore命令恢复备节点
$restory.py --full_backup_filename=xx --my_cnf=xx.cnf --db_user=xx --db_password=xx

4)追binlog到当前状态,并跳过删表的gtid
检查备节点状态,dbagent非启动,并且数据库实例是启动的

$dbstate

设置gtid_next并手动执行空事务,跳过drop table对应的操作,gtid_next为之前解析binlog找到的

> set @@session_gtid_next=’xxxx’;
> begin;
> commit;

启动dbagent,将备机接入集群,开启自动主从复制

##启动备节点
$dbmoni -start

5)检查主备同步的状态,确认备机已追上主机

$show slave status \G
$show tables like ‘xx’

此时备机中之前误删除的表数据已经恢复。

6)发起主备切换,将恢复的备机作为主节点对外提供服务
此时虽然主备切换成功,备节点作为新主,但是原主节点作为备机,和新主节点之间数据是不一致的,需要通过修复备机的方式恢复。

7)登录Proxy节点,更新元数据信息。
此时虽然数据节点已经恢复了表数据,但是在计算节点层没有该表的元数据信息,需要通过恢复的元数据信息更新计算层的元数据。

8)修复其它备机状态
新发起全量备份,通过备份数据恢复其它备机。注意在主节点发起备份时候对性能会有部分损耗,比如响应时间增加、IO影响等。

基于全量备份+增量日志的误删表恢复方法,在表数据恢复期间业务访问这部分表会报错,整个故障的RTO时间依赖于全量备份的恢复加上增量日志追平。在单主节点对外提供服务的时候,需要调整相关的配置,比如调整高低水位和主计数等,优先可用性。

2.2 基于闪回空间的恢复

基于闪回空间的恢复是利用了回收站的机制,当用户执行DROP表操作时,数据库并不会立即从磁盘上删除表的物理文件,而是将其移动到回收站中。回收站中的对象可以被视为被“软删除”,即它们仍然存在于数据库中,但不再对用户可见。多个分布式数据库已支持闪回功能,比如TiDB、GaussDB、OceanBase、GoldenDB等。以GaussDB数据库为例,回收站功能通过数据库参数enable_recyclebin来启用或禁用。回收站中对象的保留时间由参数recyclebin_retention_time来控制,超过该时间的对象将被自动清理。利用闪回恢复只需要秒级,并且恢复时间和数据库大小无关。

#闪回被删除的表
TIMECAPSULE TABLE { table_name } TO BEFORE DROP [RENAME TO new_tablename]
#闪回截断的表
TIMECAPSULE TABLE { table_name } TO BEFORE TRUNCATE

1)查看回收站,删除的表被放入回收站

gaussdb=# SELECT * FROM gs_recyclebin;rcybaseid | rcydbid | rcyrelid |           rcyname            |    rcyoriginname     | rcyoperation | rcytype | rcyrecyclecsn |        rcyrecycletime         | rcycreatecsn | rcychangecs
n | rcynamespace | rcyowner | rcytablespace | rcyrelfilenode | rcycanrestore | rcycanpurge | rcyfrozenxid | rcyfrozenxid64 | rcybucket 
-----------+---------+----------+------------------------------+----------------------+--------------+---------+---------------+-------------------------------+--------------+------------
--+--------------+----------+---------------+----------------+---------------+-------------+--------------+----------------+-----------18591 |   12737 |    18585 | BIN$42C23EB5699$9737$0==$0   | test            | d            |       0 |      79352606 | 2024-09-13 20:01:28.640664+08 |     79352595 |     7935259
5 |         2200 |       10 |             0 |          18585 | t             | t           | 225492       |         225492 |

2)闪回drop表

gaussdb=# TIMECAPSULE TABLE test to before drop;

查看表数据已经恢复

闪回功能是一种强大的数据恢复技术,在使用上受到闪回时间点和旧版本保留时间的限制。

  • 闪回时间点限制:闪回功能只能回滚到开启闪回功能后的某个时间点,且只能回滚到最近的一个事务提交点。这意味着,如果数据库在开启闪回功能之前已经发生了错误操作,那么这些操作将无法通过闪回功能来恢复。
  • 旧版本保留时间:闪回功能依赖于旧版本的保留时间。如果旧版本数据被清理或删除,那么将无法回滚到这些时间点。因此,用户需要合理配置旧版本保留时间,以确保能够回滚到所需的时间点。

另外闪回功能只支持部分DDL操作,比如drop表、truncate表等,对于误删库、drop某个字段,以及因为硬件故障导致的数据不一致是无法恢复的。

2.3 基于延迟复制的恢复

基于延迟复制的误删表数据恢复方案在“国产分布式数据库延迟复制实现”一文中做过介绍,如OceanBase数据库的物理备库方案、GoldenDB数据库的DRSP灾备集群方案。实现上主要是依赖分布式数据库的灾备架构建立一套延迟备库集群,主备集群之间通过设置合理的延迟时间,当主集群出现误操作时,通过在备集群跳过对应操作的事务,完成主库的数据同步,再切换到备集群对外提供服务。从实现机制上看和基于备份和增量日志的方式原理类似,少了全量备份数据恢复的动作,减少了恢复的RTO时间。相对应的是部署建设成本的增加,需要在生产站点单独再部署一套备库集群用于故障场景下的数据恢复,成本和收益的权衡,毕竟有更多的措施来预防这一类的故障场景。

2.4 不同恢复方案对比

总结以上三种针对误删表场景下的不同的数据恢复方案,在恢复RTO时间、技术复杂度、部署成本和使用限制等方面进行了对比如下:

方案全量备份+增量日志闪回空间延迟复制
恢复RTO通过全量备份加上增量日志方式,数据恢复时间长秒级恢复依赖于增量日志同步回放时间,较长
部署复杂度方案成熟但操作复杂,数据恢复为数据库的基本功能操作简单,依赖于数据库本身的功能实现不成熟并且操作复杂,依赖于数据库的高可用架构实现
部署成本低,基于现有的部署架构,不会增加额外的成本一般,增加额外的存储空间,并且开启闪回功能会影响一定性能高,需要额外部署一套
技术限制逻辑上恢复,只支持部分DDL操作;保留时间上限制延迟时间上限制
  • 恢复RTO
    • 全量备份+增量日志:先基于全量备份恢复表,再加上增量日志追加方式,数据恢复时间长
    • 闪回空间:支持秒级恢复
    • 延迟复制:基于日志同步回放,时间较长
  • 部署复杂度
    • 全量备份+增量日志:PITR恢复是数据库的基本功能,方案成熟但操作复杂,需要找到drop操作的gtid、指定备机跳过gtid先恢复备机
    • 闪回空间:操作简单,依赖于数据库本身的功能实现
    • 延迟复制:不成熟并且操作复杂,依赖于数据库的高可用架构实现
  • 部署成本
    • 全量备份+增量日志:低,基于现有的部署架构,不会增加额外的成本
    • 闪回空间:一般,增加额外的存储空间,并且开启闪回功能会影响一定性能
    • 延迟复制:高,需要额外部署一套备集群
  • 技术限制
    • 全量备份+增量日志:无
    • 闪回空间:逻辑上恢复,只支持部分DDL操作;保留时间上也存在限制
    • 延迟复制:延迟时间设置上有限制,超过时间后已经同步到备机

在实际应用过程中,如果数据库本身支持闪回功能优先使用该恢复方案,能够满足快速的RTO恢复要求。在闪回功能不成熟或没有该功能时,选择全量备份的恢复方式,方案成熟并且通用性强。


参考资料

  1. GoldenDB分布式数据库备份恢复
  2. GaussDB数据库闪回恢复
  3. 国产分布式数据库延迟复制实现

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

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

相关文章

论文阅读:Towards Faster Deep Graph Clustering via Efficient Graph Auto-Encoder

论文地址:Towards Faster Deep Graph Clustering via Efficient Graph Auto-Encoder | ACM Transactions on Knowledge Discovery from Data 代码地址: https://github.com/Marigoldwu/FastDGC 摘要 深度图聚类(Deep Graph Clustering, DGC…

Python爬虫教程——7个爬虫小案例(附源码)_爬虫实例

本文介绍了7个Python爬虫小案例,包括爬取豆瓣电影Top250、猫眼电影Top100、全国高校名单、中国天气网、当当网图书、糗事百科段子和新浪微博信息,帮助读者理解并实践Python爬虫基础知识。 包含编程资料、学习路线图、源代码、软件安装包等!【…

BMS存储模块的设计

目的 电池管理系统中存在着数据本地存储的要求,保证控制器重新上电后能够根据存储器中的一些参数恢复控制状态,和信息的下电存储1.继电器故障信息的存储。2. 系统性故障的存储。3.SOC、SOH相关信息的存储。4.均衡参数的存储。5.系统时间信息。6.出厂信息…

Python爬取城市天气信息,并存储到csv文件中

1.爬取的网址为:天气网 (weather.com.cn) 2.需要建立Weather.txt文件,并在里面加入如下形式的字段: 101120701济宁 101010100北京 3.代码运行后,在命令行输入Weather.txt文件中添加过的城市,如:济宁。 …

MySQL线上事故:使用`WHERE`条件`!=xxx`无法查询到NULL数据

前言 在一次 MySQL 的线上查询操作中,因为 ! 的特性导致未能正确查询到为 NULL 的数据,险些引发严重后果。本文将详细解析 NULL 在 SQL 中的行为,如何避免类似问题,并提供实际操作建议。 1. 为什么NULL会查询不到? 在…

Solidworks打开无法获得许可,提示(-15,10,10061)错误解决办法

参考文章: https://blog.csdn.net/2301_81263647/article/details/140904773

【电路理论四】正弦电流电路

正弦电流 正弦量是随时间按正弦规律变动的电路变量。 随时间按正弦规律变动的电流称为正弦电流。 正弦电流的瞬时值表达式: 称为正弦电流的三要素。 分别为振幅/幅值,角频率,初相。 幅值为正弦电流的最大值,恒为正。 为正弦电…

解决Windows无法同时使用有线网和无线网WIFI的问题

参考资料 电脑无线网wifi和有线网同时使用(内网外网同时使用)用route命令解决Wifi和网卡不能同时上内外网问题 解决方法 对于Windows系统同时连接有线网和无线网Wifi时,只会有一个网关生效,因此我们需要手动通过route命令设置网…

FOC控制原理-ADC采样时机

0、文章推荐 SimpleFOC移植STM32(五)—— 电流采样及其变换_极对数对电流采样的影响-CSDN博客 FOC 电流采样方案对比(单电阻/双电阻/三电阻) - 知乎 (zhihu.com) FOC中的三种电流采样方式,你真的会选择吗?…

uniapp:编译微信、h5都正常的,编译钉钉小程序无法找到页面

我们在做uniapp的开发的时候遇到很多莫名其妙的问题,其中就有个很奇葩的问题,我们开发的过程中使用微信小程序/h5调试都是正常编译正常跳转,然后在要上架的时候,编译钉钉小程序成功,但是访问页面无法访问, …

zentao ubuntu上安装

#下载ZenTaoPMS-21.2-zbox_amd64.tar.gz(https://www.zentao.net/downloads.html) https://dl.zentao.net/zentao/21.2/ZenTaoPMS-21.2-zbox_amd64.tar.gzcd /opt tar -zxvf ZenTaoPMS-21.2-zbox_amd64.tar.gz#启动 /opt/zbox/zbox start /opt/zbox/zbox…

REDIS2.0

string list hash set 无序集合 声明一个key,键里面的值是元素,元素的类型是string 元素的值是唯一的,不能重复 多个集合类型之间可以进行并集,交集,集查的运算 sadd test1 a b c c d :添加5个元素&am…

【论文阅读】DebSDF:深入研究神经室内场景重建的细节和偏差

【论文阅读】DebSDF:深入研究神经室内场景重建的细节和偏差 Abstract3.METHOD3.1 Preliminaries3.2 Uncertainty Guided Prior Filtering3.3 Uncertainty-Guided Ray Sampling3.4 Uncertainty-Guided Smooth Regularization3.5 Bias-aware SDF to Density Transform…

微服务SpringCloud分布式事务之Seata

视频教程:https://www.bilibili.com/video/BV16P63Y3ESq 效果演示 准备的微服务项目调用的链路如下: 文字描述: gateway模块接收到请求,并发送到order订单模块order订单模块接收到请求,新增一个订单数据后发送一个…

Pyhton知识分享-利用KNN算法实现手写数字识别

利用KNN算法实现手写数字识别 MNIST手写数字识别 是计算机视觉领域中 "hello world"级别的数据集 1999年发布,成为分类算法基准测试的基础随着新的机器学习技术的出现,MNIST仍然是研究人员和学习者的可靠资源。 本次案例中,我们的…

多点通信、流式域套接字

一、广播 1.1广播的发送端模型&#xff1a; #include<myhead.h>#define BEN_IP "192.168.191.129" #define BEN_PORT 8888#define PORT 6666int main(int argc, const char *argv[]) {int oldfd socket(AF_INET,SOCK_DGRAM,0);if(oldfd -1){perror("soc…

AMBA-APB

目录 1.APB 协议 2.APB信号列表 3.数据传输 3.1写传输&#xff08;2种&#xff09; 3.1.1 无等待状态的写传输 3.1.2有等待状态的写传输 3.2写选通信号 (PSTRB) 字节通道映射 3.3读传输&#xff08;2种&#xff09; 3.3.1 无等待状态的读传输 3.3.2有等待状态的读传…

linux自动化一键批量检查主机端口

1、准备 我们可以使用下面命令关闭一个端口 sudo iptables -A INPUT -p tcp --dport 端口号 -j DROP我关闭的是22端口&#xff0c;各位可以关其它的或者打开其它端口测试&#xff0c;谨慎关闭22端口&#xff01;不然就会像我下面一样握手超时&#x1f62d;&#x1f62d;&…

【服务器】上传文件到服务器并训练深度学习模型下载服务器文件到本地

前言&#xff1a;本文教程为&#xff0c;上传文件到服务器并训练深度学习模型&#xff0c;与下载服务器文件到本地。演示指令输入&#xff0c;完整的上传文件到服务器&#xff0c;并训练模型过程&#xff1b;并演示完整的下载服务器文件到本地的过程。 本文使用的服务器为云服…

从零开始开发纯血鸿蒙应用之逻辑封装

从零开始开发纯血鸿蒙应用 一、前言二、逻辑封装的原则三、实现 FileUtil1、统一的存放位置2、文件的增删改查2.1、文件创建与文件保存2.2、文件读取2.2.1、读取内部文件2.2.2、读取外部文件 3、文件删除 四、总结 一、前言 应用的动态&#xff0c;借助 UI 响应完成&#xff0…