当前位置: 首页 > news >正文

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

数据的完整性是数据库可用性的基本功能,在实际应用数据库变更操作过程中可能因为误操作导致误删表或者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. 国产分布式数据库延迟复制实现

相关文章:

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

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

Beamer-LaTeX学习(教程批注版)【1】

该文档总体由beamer-latex的教程而来,由耳东小白以自身学习路径整理。因其中要点基本按照教程的顺序和结构整理,故而不能称之为完全原创,但也不是翻译,更不是抄袭,是个人自学笔记和批注,其中添加了小白个人…...

数据挖掘——关联规则挖掘

数据挖掘——关联数据挖掘 关联数据挖掘关联规则关联规则挖掘问题:具体挖掘过程Apriori 产生关联规则 关联数据挖掘 关联分析用于发现隐藏在大型数据集中的令人感兴趣的联系,所发现的模式通常用关联规则或频繁项集的形式表示。 关联规则反映一个事物与…...

六种主流服务器的选择与使用

网络的运行离不开各种服务器,它们各司其职,为我们提供稳定的网络服务。本文带大家了解6种常见服务器类型。 服务器的六大种类 第一种:Web服务器 Web服务器是互联网的核心。当你打开一个网站,比如百度或淘宝,浏览器会…...

springboot3 redis 常用操作工具类

在 Spring Boot 3 中,操作 Redis 通常使用 Spring Data Redis 提供的工具类,如 RedisTemplate 和 StringRedisTemplate。以下是一个详细的 Redis 操作工具类的实现,涵盖了常用功能。 完整的 Redis 工具类 以下工具类可以实现基本的 Redis 操…...

OJ随机链表的复制题目分析

题目内容: 138. 随机链表的复制 - 力扣(LeetCode) 分析: 这道题目,第一眼感觉非常乱,这是正常的,但是我们经过仔细分析示例明白后,其实也并不是那么难。现在让我们一起来分析分析…...

如何不修改模型参数来强化大语言模型 (LLM) 能力?

前言 如果你对这篇文章感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。 大语言模型 (Large Language Model, LLM, e.g. ChatGPT) 的参数量少则几十亿,多则上千亿,对其的训…...

Win11+WLS Ubuntu 鸿蒙开发环境搭建(二)

参考文章 penHarmony南向开发笔记(一)开发环境搭建 OpenHarmony(鸿蒙南向开发)——标准系统移植指南(一) OpenHarmony(鸿蒙南向开发)——小型系统芯片移植指南(二&…...

Qemu配置QXL显卡支持分辨率

默认情况下&#xff0c;创建的vm的视频RAM限制为16MB。在win操作系统中分辨率最高就只能调到1024x768。 <video><model typecirrus vram16384 heads1 primaryyes/><address typepci domain0x0000 bus0x00 slot0x02 function0x0/> </video>单单修改ram…...

Hack The Box-Starting Point系列Three

答案 How many TCP ports are open?&#xff08;靶机开了几个TCP端口&#xff09; 2What is the domain of the email address provided in the “Contact” section of the website?&#xff08;网站的“CONTACT”部分提供的电子邮件地址的域是什么&#xff1f;&#xff09…...

人工智能-Python多任务编程-进程、线程

多任务的实现方式 多进程 多线程 1 多任务的两种表现形式 并发: 在一段时间内交替去执行多个任务&#xff08;任务数大于CPU核心数&#xff09;并行: 在一段时间内真正的同时一起执行多个任务&#xff08;任务数小于等于CPU核心数&#xff09; 2 进程 进程&#xff08;Proc…...

智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之9 重新开始 之2

本文要点 对程序设计而言&#xff1a;前者基于一个自上而下的 分类体系--&#xff08;生物遗传基因&#xff09;&#xff0c;后者者需要一个收集差异的自下而上的差异继承路径--&#xff08;系统继承源流&#xff09; 就是 广义和狭义 分类学。 共性对齐 和 差异收集 正是两者…...

Postman[7] 内置动态参数及自定义的动态参数

postman 内置动态参数和自定义的动态参数 1.内置动态参数 格式&#xff1a;{{$参数名}} 1.1时间戳 {{$timestamp}} //生成当前时间的时间戳 1.2随机整数 {{$randomint}} //生成0-1000之间的随机数 1.3GUID字符串 {{$guid}} //生成随机GUID字符串 2.自定义动态参数 格式…...

04-c++类和对象(下)

一、友元 前面学习的类中&#xff0c;只能通过该类的公共方法访问私有数据。而如果将某个函数设置为类的友元&#xff0c;那么这个函数就可以直接访问该类的私有数据&#xff0c;破坏了类的封装性&#xff0c;只在某些特定的情况下使用。 友元的分类&#xff1a;普通全局函数…...

《解密奖励函数:引导智能体走向最优策略》

在强化学习领域&#xff0c;奖励函数是核心要素&#xff0c;它决定了智能体如何学习和决策。设计一个恰当的奖励函数&#xff0c;能让智能体在复杂环境中不断探索、优化&#xff0c;最终实现最优策略。 奖励函数的重要性 奖励函数就像是一个引导者&#xff0c;它告诉智能体什…...

AF3 AtomAttentionEncoder类的init_pair_repr方法解读

AlphaFold3 的 AtomAttentionEncoder 类中,init_pair_repr 方法方法负责为原子之间的关系计算成对表示(pair representation),这是原子转变器(atom transformer)模型的关键组成部分,直接影响对蛋白质/分子相互作用的建模。 init_pair_repr源代码: def init_pair_repr(…...

VScode 格式化代码空格记录

点击 -> “文件” -> “首选项" -> “设置” -> 按下图操作&#xff1a; 怎么格式化代码空格&#xff0c;先看下&#xff1a; 保存代码后&#xff0c;这代码自动格式化发&#xff0c;如下图&#xff1a; 你可以试试看就即可...

28.Marshal.PtrToStringAnsi C#例子

//怎么说呢&#xff0c;这个代码Marshal的英文意思有将军&#xff0c;控制等等&#xff0c; //我的理解是类似于console控制台。 //然后后面这个Ansi是一种ASCII的扩展&#xff0c;还有其他编码方式可选 就是一个把后面的指针转化为字符串的一个代码 这是用法…...

Git的使用流程(详细教程)

目录 01.Git是什么&#xff1f; 1.1 Git简介 1.2 SVN与Git的最主要的区别 1.3 GIt主要特点 02.Git是干什么的&#xff1f; 2.1.Git概念汇总 2.2 工作区/暂存区/仓库 2.3 Git使用流程 03.Git的安装配置 3.1 Git的配置文件 3.2 配置-初始化用户 3.3 Git可视化…...

第R3周:RNN-心脏病预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 文章目录 一、前言二、代码流程1、导入包&#xff0c;设置GPU2、导入数据3、数据处理4、构建RNN模型5、编译模型6、模型训练7、模型评估 电脑环境&#xff1a;…...

clickhouse Cannot execute replicated DDL query, maximum retries exceeded报错解决

报错信息 在clickhouse中执行DDL命令对表进行改动时&#xff0c;出现报错Cannot execute replicated DDL query, maximum retries exceeded 解决方案 一、官方解决方案 官方说这是一个特定版本的bug&#xff0c;但是实际我自己用的22.9.34版本&#xff0c;也存在这个问题&a…...

【时时三省】(C语言基础)常见的动态内存错误

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 对NULL指针的解引用操作 示例&#xff1a; malloc申请空间的时候它可能会失败 比如我申请一块非常大的空间 那么空间可能就会开辟失败 正常的话要写一个if&#xff08;p&#xff1d;&#x…...

【JVM】总结篇-字节码篇

字节码篇 Java虚拟机的生命周期 JVM的组成 Java虚拟机的体系结构 什么是Java虚拟机 虚拟机&#xff1a;指以软件的方式模拟具有完整硬件系统功能、运行在一个完全隔离环境中的完整计算机系统 &#xff0c;是物理机的软件实现。常用的虚拟机有VMWare&#xff0c;Visual Box&…...

二十三种设计模式-抽象工厂模式

抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一种方式&#xff0c;用于创建一系列相关或相互依赖的对象&#xff0c;而不需要指定它们具体的类。这种模式主要用于系统需要独立于其产品的创建逻辑时&#xff0c;并且…...

【docker】Dockerfile 中使用宿主机代理的方式

在Dockerfile中配置代理主要有这几种方式&#xff0c;让我系统地整理一下&#xff1a; 构建参数方式&#xff08;BUILD ARG&#xff09; # 方式1&#xff1a;在Dockerfile顶部定义 ARG HTTP_PROXYhttp://proxy:7890 ARG HTTPS_PROXYhttp://proxy:7890# 方式2&#xff1a;在构…...

现代无线通信接收机架构:超外差、零中频与低中频的比较分析

写在前面&#xff1a;本博客是对三种接收机架构的学习笔记&#xff0c;仅供个人学习记录使用。内容主要是上网查阅的资料&#xff0c;以及个人的一些理解。如有错误的地方请指出&#xff01; 文章目录 一、通信机基本架构 1、射频发射级的基本组成及完成功能2、射频接收级的基…...

CSS 图片廊:网页设计的艺术与技巧

CSS 图片廊&#xff1a;网页设计的艺术与技巧 引言 在网页设计中&#xff0c;图片廊是一个重要的组成部分&#xff0c;它能够以视觉吸引的方式展示图片集合&#xff0c;增强用户的浏览体验。CSS&#xff08;层叠样式表&#xff09;作为网页设计的主要语言之一&#xff0c;提供…...

Gemini和ChatGPT全面对比分析,有什么区别和优势?

当 AI 聊天机器人首次出现时&#xff0c;每个人都在竞相发布自己的足够好的第一版 AI 聊天机器人&#xff0c;很容易在 Gemini 与 ChatGPT 等应用程序之间进行比较。但随着 Google 和 OpenAI 不断添加新功能、模型和访问其聊天机器人的方式&#xff0c;差异变得不那么明显。 现…...

Ansys Discovery 中的网格划分方法:探索模式

本篇博客文章将介绍 Ansys Discovery 中可用于在探索模式下进行分析的网格划分方法。我们将在下一篇博客中介绍 Refine 模式下的网格划分技术。 了解 Discovery Explore 模式下的网格划分 网格划分是将几何模型划分为小单元以模拟系统在不同条件下的行为的过程。这是通过创建…...

前 5 名 IPhone 解锁工具/软件

设备已禁用并且您无法访问它&#xff1f;如果您无法通过密码解锁&#xff0c;尝试 iPhone 解锁软件可能是最好的解决方案。 虽然市场上有很多免费或付费的 iPhone 解锁工具&#xff0c;但您可能不知道它们之间的区别以及如何选择最适合您的工具。 本文将介绍 5 款iPhone 解锁…...

富士通 自动进纸 扫描仪 scan 按钮 触发设置

附赠光盘里的驱动和软件都先装好&#xff0c;然后3步&#xff0c; 1&#xff0c;控制面板&#xff0c;对着设备右键&#xff0c;详细设置&#xff0c;触发对应&#xff0c;选择stream capture软件。&#xff08;差不多就这意思&#xff0c;懂的自然懂&#xff09; 2&#xff…...

SpringCloud系列教程:微服务的未来 (五)枚举处理器、JSON处理器、分页插件实现

在现代 Java 开发中&#xff0c;我们常常需要处理各种通用的功能和需求&#xff0c;诸如枚举的处理、JSON 数据处理&#xff0c;以及分页查询等。这些功能虽然看似简单&#xff0c;但在实际开发中往往涉及到许多细节和优化。为了提高开发效率、减少重复代码的编写&#xff0c;我…...

dos2unix: command not found

如果你在终端或命令行界面中遇到了“dos2unix: command not found”的错误&#xff0c;这意味着你的系统中没有安装dos2unix工具。dos2unix是一个用于将文本文件中的DOS/Mac格式的行结束符转换为Unix/Linux格式的行结束符的工具。 以下是一些解决方法&#xff1a; 安装dos2un…...

使用 Docker 查看 Elasticsearch 错误日志

在使用 Elasticsearch&#xff08;简称 ES&#xff09;的过程中&#xff0c;我们可能会遇到各种问题。为了快速定位和解决这些问题&#xff0c;查看错误日志是关键。本文将介绍如何使用 Docker 查看 Elasticsearch 的错误日志&#xff0c;并提供一些实用技巧。 1. 安装 Docker…...

Scala 访问修饰符

Scala 访问修饰符 在编程语言中&#xff0c;访问修饰符是一种重要的语法元素&#xff0c;它用于控制类、对象、特质、接口、方法和变量的访问级别。Scala作为一种多范式编程语言&#xff0c;也提供了丰富的访问修饰符&#xff0c;以实现封装和隐藏内部实现细节。本文将详细介绍…...

VisualRules规则引擎语法介绍

VisualRules规则引擎是一款用于处理复杂业务规则的引擎&#xff0c;广泛应用于金融、保险、医疗等领域。它通过将业务逻辑从代码中分离出来&#xff0c;以可配置的方式管理和执行规则。以下是VisualRules规则引擎的基本语法和使用方法&#xff1a; 1. 规则定义 规则通常由 条件…...

UDP_TCP

目录 1. 回顾端口号2. UDP协议2.1 理解报头2.2 UDP的特点2.3 UDP的缓冲区及注意事项 3. TCP协议3.1 报头3.2 流量控制2.3 数据发送模式3.4 捎带应答3.5 URG && 紧急指针3.6 PSH3.7 RES 1. 回顾端口号 在 TCP/IP 协议中&#xff0c;用 “源IP”&#xff0c; “源端口号”…...

web端显示spine动画

一、说明 &#xff08;1&#xff09;这边使用的spine版本是3.8.99 spine包含3个部分,可以将三个文件上传到cdn&#xff0c;三个文件放在相同的目录中 test.atlas 、 test.json 、test.png &#xff08;2&#xff09;pixi.js - v7.0.4 https://github.com/pixijs/pixijs &…...

【74HC192减法24/20/72进制】2022-5-17

缘由用74ls192设计一个72进制的减法计数器&#xff0c;需要有逻辑电路图-硬件开发-CSDN问答...

前端安全措施:接口签名、RSA加密、反调试、反反调试、CAPTCHA验证

文章目录 引言I 设置防爬虫功能使用robots.txt文件通过配置HTTP头部中的X-Robots-TagII 禁止打开开发者工具反复清空控制台无限debugger反调试检查是否按下了F12或其他调试快捷键禁用右键监听调试快捷键例子III 屏蔽粘贴/复制/剪切/选中IV 知识扩展: javascript内置命令调试分…...

算法攻略:顺序表的进阶之路——移除元素

题目如下&#xff1a; 思路&#xff1a; 双指针法 nums[src] val&#xff0c;srcnums[src] ! val&#xff0c;src的值赋值给dst&#xff0c;src和dst都 注&#xff1a; 1&#xff09;双指针法&#xff1a;只是抽象出了两个指向数组的变量&#xff0c;并不是真的指针。 2&#…...

zookeeper+kafka

一、zookeeper 1.概述 zoo: 开源的分布式框架协调服务 zookeeper的工作机制&#xff1a;基于观察者模式设计的分布式结构&#xff0c;负责存储和管理架构当中的元信息&#xff0c;架构当中的应用接受观察者的监控&#xff0c;一旦数据有变化&#xff0c;通知对应的zookeeper&a…...

大循环引起CPU负载过高

一、问题背景 环境&#xff1a;jdk1.8 tomcat7 在一次发布时&#xff0c;cpu出现负载过高&#xff0c;其负载突破200%&#xff0c;并且响应时间也大幅度超时。 二、问题分析 【1】发布前做过压测&#xff0c;并没有发现cpu异常升高的现象&#xff0c;所以其可能与生产环境的请…...

xdoj ROT13加密

标题 ROT13加密 问题描述 ROT13是一种古典加密方法&#xff0c;其加密原理是把一个字母用字母表位置相距13的字母来进行 替换&#xff0c;例如字母‘a’用字母‘n’来替换&#xff0c;字母‘z’用字母‘m’来替换。 输入一段字符串&#xff0c;然后把其中的大小写字母按照上…...

图数据库 | 17、高可用分布式设计(上)

我们在前面的文章中&#xff0c;探索了多种可能的系统扩展方式&#xff0c;以及每种扩展方式的优劣。 本篇文章将通过具体的架构设计方案来对每一种方案的设计、投入产出比、各项指标与功能&#xff0c;以及孰优孰劣等进行评价。 在设计高性能、高可用图数据库的时候&#xf…...

五类推理(逻辑推理、概率推理、图推理、基于深度学习的推理)的开源库 (一)

在开发中&#xff0c;有一些开源库可以实现不同类型的推理&#xff0c;包括逻辑推理、概率推理、图推理、基于深度学习的推理等。以下是五类推理&#xff08;逻辑推理、概率推理、图推理、基于深度学习的推理&#xff09;的现成开源库&#xff0c;它们各自的功能、特点和适用场…...

java Redisson 实现限流每秒/分钟/小时限制N个

1.引入maven包: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.redisson</groupId><artifactId>red…...

麒麟操作系统服务架构保姆级教程(八)数据库拆分静态业务拆分和负载均衡

当我们网站的访问量提升上来了&#xff0c;平均每分钟上千条访问量&#xff0c;但是服务器的性能是有限的&#xff0c;所以就需要将单台的架构进行拆分了&#xff0c;但是web服务器的内容不同怎么办&#xff0c;就会用到咱们的共享存储&#xff0c;两台web服务器今天咱们将LNMP…...

LQ24fresh

目录 C. 录入成绩 D. 标记名字 E. 奖杯排列 C. 录入成绩 &#xff08;1&#xff09;以国特 G 为切入点&#xff0c;枚举每一个 G 单独时是否为合法字符串&#xff0c;若合法 G1 有多少个 &#xff08;2&#xff09;用到的两个 string 函数&#xff1a; s.erase( i, a ) &…...

Postman[8] 断言

1.常见的断言类型 status code: code is 200 //检查返回的状态码是否为200 Response body&#xff1a; contain string //检查响应中包含指定字符串包含指定的值 response body:json value check/ /检查响应中其中json的值 Response body&#xff1a; is equal to string …...