ORACLE数据库备份入门:第四部分:2-备份场景举例
下面以4个常见的场景为例,介绍如何规划备份方案。备份方案没有标准答案,需要根据实现情况来制定,也和管理员的个人使用习惯有很大相关性。
1 交易型数据库备份
以银行的交易系统为例,除了前一章节提到的关于RPO和RTO的指标外,很多企业内部或着其它相关监管也会有不同的要求。例如人民银行对商业银行数据备份的要求:1)有RPO要求≤4小时;2)RTO要求≤4小时。备份的策略:数据库打开归档模式,分别设置全量备份、增量备份和日志备份。
1) 全量备份耗时较长,选择在周末的业务空闲的时间段进行,每周一次。之前也接触过一些更密集的备份频率,3天一次全量备份,也遇到过每天1次全量备份的策略。就目前的主流备份系统性能来看,数据量在1TB以下的数据库,基本可以保证在半小时内完成备份。结合现有的备份系统的性能,以及数据量因素,首先制定测试计划。经过几次测试后,最终确定全量备份的频率。
我经历过最大的交易型数据库,约50TB,在数据库服务器、存储资源,以及备份系统性能卓越的环境下,整体备份耗时11小时,仅供参考。
2) 除全量备份执行的日期之外的日期,每天一次,在业务空闲的时间段进行增量备份。打开BCT功能,提升备份速度。
3) 按照RPO要求,4小时等间隔进行日志备份。在运行初期,不必直接设置成4小时间隔,可以从12小时开始间隔开始试运行。运行期间收集数据库性能信息,确定日志备份对数据库的影响。如果日志备份对数据库性能影响较大,说明现有业务环境不能胜任4小时RPO。需要对业务系统的性能进行升级,再逐步提升日志备份的频率。
4) 计算恢复速度
恢复速度与备份速度有很大相关性,在前几个步骤进行备份测试的同时,也要进行恢复测试,来检测备份计划对应的恢复方法是否满足RTO要求。恢复由两部分组成,第一部分是恢复数据文件和归档文件,第二部分是应用归档日志。需要恢复的归档日志数据量,与整个数据文件备份的耗时相关。在前面的一致性备份章节,我们介绍过,如果要使数据库恢复到一致状态,最小要求是保证所有数据文件一致。如果数据文件备份耗时2小时(从每1个数据文件备份开始到最后一个数据文件备份结束),那基本上恢复的归档跨度也大约是2小时。根据不同的业务情况,归档的数据量变化范围较大,不能推算时间,必须进行测试。
举例说明:一套数据库全量约5TB,在工作时间段每小时的归档量约10GB,其它时间段归档每小时约1GB。采用的策略是每周日一次全量备份,每天进行增量备份(共6次),时间都在每天的零点,在些基础上每4小时一次归档备份(满足RPO4小时要求)。全量备份耗时约2小时;增量备份耗时约15分钟,归档日志备份耗时约20分钟。一次全量数据文件恢复需要2.5小时,一次增量数据文件需要20分钟,恢复4小时的归档大约需要20分钟。按照最严重的情况来计算,假设周六增量备份结束后的晚上10点发现故障,需要全库恢复到最新的时间点,耗时计算如下:
一次全量恢复,约2.5小时;六次增量恢复约2小时;22小时的归档恢复+应用约1小时;整体耗时约5.5小时。显然这超出了RTO要求的4小时。我们按照最严重的情况来计算,当然我们也必须要按照最严重的情况来计算,因为RTO指标就是要求在任何情况下都能满足。所以我们要对备份方案进行优化。
总体恢复时间的5.5小时,这里面归档的恢复和应用耗时1小时,可提升的空间不大,这是由业务特性决定的,所以要优化的就是全量和增量的恢复速度。全量恢复要2.5小时,需要通过系统环境综合分析。限制恢复速度的因素包括:参数设置、数据库磁盘性能、备份存储性能、网络传输速度。除了参数设置的调整外,其它因素都和成本相关。不必疑惑,RTO和RPO本来就是决定着备份系统成本的关键因素,在做架构设计的时候就应该考虑到这些问题。但是成本问题在短期内往往无法解决,我们可以把焦点放到其它层面,分析是否可以暂时地解决问题,给成本问题的彻底解决赢得更多时间。
1) 方法一:增量可以使用积累方式,这样不论是恢复哪一天的数据,最多只需要恢复一次增量备份数据。修改后,增量的恢复速度从20分钟到1小时不等。在上述的场景下,恢复速度可从5.5小时降低到4.5小时。
2) 方法二:备份周期由一周缩短为3天,即一次全量备份,后续2天进行增量备份。在相同的场景中,恢复速度可从5.5小时降低到4小时以下。这肯定是可以满足RTO≤4小时要求,但是也带来了新的问题,就是每三天一次全量备份,这会增大备份对系统的性能影响。是否选择这个方案,要考虑每天凌晨是否有大量的业务交易。如果每天凌晨的交易量都很小,选择这个方案是可以满足要求的。貌似这个方法可以满足需求,其实还存在很大的风险。方案虽然满足了4小时恢复的要求,但是不具备扩展能力,没有预留缓冲的时间。并且,数据量如果继续增长,后续将很难满足要求。
3) 方法三:目前恢复耗时大的首要因素是数据量大,关键是要设计出方案来提升速度,或者减少数据量,才能更可靠的满足要求。
提升速度的办法:
恢复的过程,是数据从备份存储读出,写入数据库生产存储中。以目前的存储技术,生产库后端的设备写速度完全可以满足5TB/小时,特别是目前SSD作为主流的时代。备份的存储,即便是普通的NAS,也能满足5TB/小时的读速度。因此,速度的瓶颈肯定在于网络。从单纯的带宽计算来看,至少要满足2条万兆链路才能满足5TB/小时的要求。考虑到交换机层面的问题,如果数据库部署了4条万兆,网络资源是足够使用的。但是有些企业对于硬件资源的调整阻力较大,优化网络带宽可能短期无法实现。我们可以考虑其它方法,利用现有资源。例如,数据库连接生成存储通常会使用多条SAN链路,这些链路仅是为了高可用(MPIO)设计,带宽消耗其实不高,可以用于备份服务。一些主流的备份软件,支持数据库通过SAN网络连接备份设备,数据流不通过LAN网络,大大提升备份速度。
减少数据量的办法:
这听起来不现实,难道有些数据不备份了吗?事实是极有可能的,特别是在大数据量场景下。交易型数据,如果数据量大很有可能是存在大量的历史数据。最佳实践是要求交易库和历史库分离的,但是现实中很多场景由于各种原因,特别是历史原因、责任原因没有进行分离,导致数据库越来越大。我曾经遇到过交易库50T,支持多套应用,并且有超过40T是历史数据。改造的逻辑很简单,首先尽可以为应用部署独立的数据库(或者尽量少的应用共享一套数据库);其次,部署单独的数据仓库来保存历史数据。这样改造的结果,每个交易库的数据量控制在2、3T,备份将无压力。但是改造方案阻力很大,有历史原因,也有责任划分原因。
在我看来,方法三才是解决问题的根本办法,其它方法只能是过渡。
2 大型数据库(VLDB)备份
当数据量到达几十TB后,备份耗时会很长,通常可以达到10到20小时(取决于备份系统环境的性能),恢复速度比备份速度会更长,用户很难接受。必须使用更为优化的方式提升备份速度。目前,已经使用的比较成熟的方式是借助存储快照。
这里需要先介绍一下数据库的BACKUP MODE。首先,它不需要关闭数据库,应用可正常写入数据库。开启BACKUP MODE,数据库会进行一次Checkpoint,将全部数据写入到数据文件。此后,应用写入的数据只保存到REDO日志中,并不会写入数据文件,数据文件始终处于一致状态。
打开BACKUP MODE,对数据文件在存储层对应的卷进行快照。快照完成后,关闭BACKUP MODE,数据库恢复正常运转。还需要手工备份控制文件。将存储快照挂载到数据库服务之外的操作系统中(此步骤是避免备份对数据库服务器性能产生影响),将数据文件进行备份。由于是在BACKUP MODE状态下拷贝的数据,因此它们具备一致性。操作过程举例,
1) 打开备份模式
RMAN> alter database begin backup;
2) 创建存储快照
在存储设备,或操作系统中对数据卷进行快照。
3) 关闭备份模式
RMAN> alter database end backup;
4) 备份控制文件
控制文件需要使用RMAN来备份
RMAN> backup format ‘/bk/ctrl_%U’ current controlfile;
5) 备份参数文件
RMAN> backup format ‘/bk/spfile_%U’ spfile;
6) 备份数据库
将快照卷挂载到指定的操作系统中,对数据文件进行备份。
7) 恢复操作
恢复时,首先恢复参数文件和控制文件,如果按照原路径恢复,不需要做任何修改。如果路径或者其它参数变更,需要修改修改参数文件后重建SPFILE;第二步将备份的数据文件拷贝到指定路径下。
有一点需要注意的是,当打开和关闭BACKUP MODE这中间的一段时间内,如果有大量的业务写入数据,在关闭BACKUP MODE后,会产生大量的REDO写数据到数据文件,数据库可能会产生性能下降的现象,持续的时间由REDO中保存的数据量决定。
既然这种备份方式速度快,是不是其它数据库也应该使用它?这种方式有它的弊端,就是需要过多的手工介入。备份时需要手工配置存储,拷贝文件,并记录备份信息。恢复时,要确保备份信息存在,找到备份数据,手工配置存储资源。人工操作的步骤越多,失误的概率越大,因此,非必要不使用这种方法,RMAN的自动备份才是上上之选。
3 数据仓库备份
数据仓库保存着历史数据,通常数据量会很大,但是它又区别前一章节提到的大型数据库(VLDB)场景。数据库仓库的作用是从一个或多个交易型数据库收集并数据,并且进行整理,最终按照业务要求展现结果,如报表等。它定时通过ETL工具写入数据,并非实时更新。有些用户场景中,交易库和仓库使用同一个数据库,这给备份带来很大的麻烦。这样的场景,首先要建议用户“拆库”,也就是交易库和仓库分离,不仅是为了备份,也是数据库厂商和应用厂商给出的最佳实践方案。
数据仓库备份,首先要考虑是归档日志问题。这里有一个矛盾点需要平衡:关闭归档将不支持在线备份,只能将数据库置成MOUNT状态进行备份,所以业务也要停止;打开归档,数据仓库写入海量数据会产生大量的归档日志,而备份又必须包括归档日志,给备份系统带来了很大的压力。
Oracle给出了官方的最佳实践方法:保持数据库处于归档模式,手工关闭用户数据对应的表的归档,这样即可以进行在线备份(不需要关闭数据库),也不会产生过多的日志。这种方案有一个前提,就是需要对SQL语句进行改造,让它跳过REDO,直接写入数据文件。
例如,
SQL> insert /*+ APPEND */ into table2 nologging select * from table1;
看到这儿,是不是会有疑问?关闭了表的日志,那恢复的时候怎么办?不用担心,我们关闭的是表级的归档,不是数据库级的归档,因此可以保护数据库是可以恢复的。ETL软件,按照业务逻辑从交易库中抽取数据,写入数据仓库并进行加工处理,提供报表和查询业务。数据仓库备份作业执行,必须要避开ETL的运行时间窗口,在没有数据写入的时段得到数据一致性。因为数据库级的日志是打开的,因此不用担心数据库不一致而无法恢复。如果在ETL运行期间,也就是有数据写入的时候进行备份,数据库依然可以恢复,但是表会提示有坏块,不能恢复。
在一些用户中,数据仓库创建初期数据量小,因此在设计上没有考虑归档的问题。后期数据量激增,加载速度和备份都暴露出问题,再回过头来对SQL进行改造,阻力非常大。遇到过这样的案例,每天备份的归档量巨大,而且归档日志本身就是压缩格式,很难再进一步压缩或消重,备份存储资源消耗非常严重。数据仓库为什么归档量巨大?试想一下,企业的所有交易库,可能是10几个,也可能是几十上百个,每天定时抽出数据进行加工并写入数据仓库。这么大的数据量写入,必须要产生巨大的归档数据量。有很多企业因此交易库多,仅一套数据仓库根本无法承担,因此部署了多个数据仓库。
因此,在数据仓库初期就规划好,这是非常重要的。后期如果想改造,会遇到很多历史遗留问题,阻力重重。
4 容灾场景备份
Oracle官方提供Data Guard工具,通过REDO的复制,创建备库。备库的设计,是为了解决主库故障时可以快速切换,保证业务的最大连续性。备库在实际使用中,也可以发挥更大的作用。例如,备库在“只读”状态下提供报表功能,也可以作为备份的源,充分的利用资源,同时分担主库的压力。
在Data Guard场景中,建议在备库端进行备份,避免备份操作影响业务的性能。通过RMAN在备库端进行备份,系统自动识别状态,自动与主库联动,不需要人工进行干预,与在主库操作备份完全相同。区别在于,从备库创建的备份集,控制文件状态为Standby,数据库不能直接打开。因此,在进行恢复时,需要管理员将控制文件状态修改为Primary,按照独立的数据库打开。
相关文章:
ORACLE数据库备份入门:第四部分:2-备份场景举例
下面以4个常见的场景为例,介绍如何规划备份方案。备份方案没有标准答案,需要根据实现情况来制定,也和管理员的个人使用习惯有很大相关性。 1 交易型数据库备份 以银行的交易系统为例,除了前一章节提到的关于RPO和RTO的指标外&am…...
STL中emplace实现原理是什么?
template <class... Args>void emplace_back (Args&&... args);这个是vector的emplace_back方法,用到的c11的语法有三个,分别是万能引用、完美转发、参数包。 参数包中的参数是用来构造vector<T>中的T对象。 假如我直接传的就是一个…...
血泪之arduino库文件找不到ArduinoJSON.h: No such file or directory错误原因
#include <ArduinoJson.h> 始终报这个错误, C:\techxixi_project\Arduino\test\camer\camertoserver\camertoserver.ino:6:10: fatal error: ArduinoJSON.h: No such file or directory 6 | #include <ArduinoJSON.h> | ^~~~~~~~~…...
通过门店销售明细表用PySpark得到每月每个门店的销冠和按月的同比环比数据
假设我在Amazon S3上有销售表的Parquet数据文件的路径,包含ID主键、门店ID、日期、销售员姓名和销售额,需要分别用PySpark的SparkSQL和Dataframe API统计出每个月所有门店和各门店销售额最高的人,不一定是一个人,以及他所在的门店…...
【前后端分离项目】Vue+Springboot+MySQL
文章目录 1.安装 Node.js2.配置 Node.js 环境3.安装 Node.js 国内镜像4.创建 Vue 项目5.运行 Vue 项目6.访问 Vue 项目7.创建 Spring Boot 项目8.运行 Spring Boot 项目9.访问 Spring Boot 项目10.实现 Vue 与 Spring Boot 联动11.安装 axios12.编写请求13.调用函数请求接口14.…...
图解 Redis 事务 ACID特性 |源码解析|EXEC、WATCH、QUEUE
写在前面 Redis 通过 MULTI、EXEC、WATCH 等命令来实现事务功能。Redis的事务是将多个命令请求打包,然后一次性、按照顺序的执行多个命令的机制,并且在事务执行期间,服务器不会中断事务而该去执行其他客户端的命令请求。 就像下面这样&#…...
w~嵌入式C语言~合集3
我自己的原文哦~ https://blog.51cto.com/whaosoft/13870307 一、单片机多任务事件驱动 单片机的ROM与RAM存贮空间有限,一般没有多线程可用,给复杂的单片机项目带来困扰。 经过多年的单片机项目实践,借鉴windows消息机制的思想ÿ…...
CMCC RAX3000M CH EC 算力版刷机(中国移动 RAX3000M 算力版)刷机
刷机前面的工作参考: https://blog.csdn.net/asdcls/article/details/147434218 刷机 eMMC Flash instructions: 1. SSH to RAX3000M, and backup everything, especially factory part. (data partition can be ignored, its useless.) 2. Write new GPT tabl…...
cron定时任务
cron定时任务 一、Cron表达式的定义 基础结构 Cron表达式是由空格分隔的6或7个字段组成的字符串,格式为: 秒 分 时 日 月 星期 [年]其中,年通常可以被省略 字段说明: 秒(0-59) 秒字段表示每分钟的哪一…...
1.4 大模型应用产品与技术架构
目录 一,产品架构 1.1 AI Embedded产品架构 1.2 AI Copilot产品架构 1.3 AI Agent产品架构 二,技术架构 2.1 纯Prompt 2.2 Agent Function Calling 2.3 RAG (Retrieval-Augmented Generation 检索增强生成) 2.4 Fine-tu…...
Android HAL HIDL
1 Android HAL HIDL 1.1 Android中查看有哪些HIDL HAL HIDL是Treble Interface的一部分。 adb root adb shell # lshal 1.2 Android打印C调用栈 #include <utils/CallStack.h> 在需要打印的地方加如下的定义。 android::CallStack stack("oem"); logcat | g…...
std::mutex底层实现原理
std::mutex是一个用于实现互斥访问的类,其具备两个成员函数——lock和unlock 锁的底层实现原理 锁的底层实现是基于原子操作的,这些原子操作是由指令支持的,因为单个指令是不能被中断的 一些与锁的实现有关的原子指令为: 待补充…...
性能提升手段--池化技术
看到hadoop代码里有ByteBufferPool,使用池子来避免频繁创建、销毁ByteBuffer,减轻GC压力,提高性能。 顺便总结一下池化技术 一、什么是池化技术? 池化(Pooling) 是一种资源管理策略,通过预先创建并复用资源(如数据库连接、线程、内存对象等)来提…...
精益数据分析(28/126):解读商业模式拼图与关键指标
精益数据分析(28/126):解读商业模式拼图与关键指标 在创业和数据分析的探索旅程中,每一次深入研究都可能带来新的启发和突破。今天,我们依旧带着共同进步的初心,深入解读《精益数据分析》中关于商业模式的…...
QT6 源(52)篇二:存储 c 语言字符串的类 QByteArray 的使用举例,
(3) (4) 谢谢...
工业摄像头通过USB接口实现图像
工业摄像头系列概览:类型与应用 工业摄像头系列涵盖了多种类型,以满足不同行业和应用的需求。以下是对工业摄像头系列的一些介绍: 一、主要类型与特点 USB工业摄像头 :这类摄像头通常通过USB接口与计算机连接,适用于…...
【BBDM】main.py -- notes
命令行接口 python main.py [OPTIONS]参数 参数类型默认值说明-c, --configstr"BBDM_base.yml"配置文件路径-s, --seedint1234随机种子,用于结果复现-r, --result_pathstr"results"结果保存目录-t, --trainflagFalse训练模式开关:…...
X86物理机安装iStoreOS软路由
目录 安装前准备 制作启动盘 安装系统到硬盘 启动与初始配置 常见问题与注意事项 参考资料 安装前准备 硬件设备 X86物理机(如普通电脑、J4125/N5105等小主机) U盘(建议容量≥2GB) 显示器、键盘(用于初始配置…...
QML Date:日期处理示例
目录 引言相关阅读QML Date对象知识概要格式化选项 DateExamples示例解析代码解析示例1:日期格式化示例2:不同地区的日期显示示例3:日期解析示例4:自定义格式示例5:日期与时间戳转换 运行效果总结下载链接 引言 在Qt …...
python 与Redis操作整理
以下是使用 Python 操作 Redis 的完整整理,涵盖基础操作、高级功能及最佳实践: 1. 安装与连接 (1) 安装库 pip install redis(2) 基础连接 import redis# 创建连接池(推荐复用连接) pool redis.ConnectionPool(hostlocalhost, …...
【Linux】环境监控系统软件框架
目录 tasks.h type.h main.c tasks.c makefile 运行结果 调用多线程框架,在主函数写好环境监控文件的函数,使用结构体封装环境指标的参数 最后使用makefile管理工程文件 tasks.h #include<pthread.h>#ifndef __TASK_H__ #define __TASK_H_…...
WPF实现数字孪生示例
WPF 数字孪生系统实现示例 数字孪生(Digital Twin)是通过数字化手段在虚拟空间中构建物理实体的精确数字模型,并实现虚实映射、实时交互和智能决策的技术。本文将展示如何使用WPF实现一个基础的数字孪生系统示例。 一、系统架构设计 1. 整体架构 +-------------------+ | …...
对卡尔曼滤波的理解和简单示例实现
目录 一、概述 二、基本公式解释 1)状态转移方程 2)状态更新方程 3)卡尔曼系数更新方程 4)误差协方差估计方程 三、一个简单示例 一、概述 经典卡尔曼滤波算法在线性系统中运用非常广泛,可以对数据实现很好的平…...
Linux基础命令总结
Linux系统命令 1. systemctl 1. 基本语法 systemctl start | stop | restart | status 服务名 2. 经验技巧查看服务的方法:/usr/lib/systemd/system 3. 案例实操 (1)查看防火墙服务的状态 systemctl status firewalld (2)停止防火墙服务 systemctl stop firewalld (…...
视觉大模型专栏导航
关于视觉大模型专栏,暂时还没有比较明确的更新计划,最近会在本专栏上更新关于Sam模型的基本原理,包括Image Encoder、Prompt Encoder及Mask Decoder等模块的实现;还有记录下如何利用Sam代码跑通一个demo。 后期接触了其他视觉大模…...
Eigen的主要类及其功能
Eigen 是一个高性能的 C 模板库,主要用于线性代数、矩阵和向量运算。它提供了许多类来支持各种数学运算,以下是 Eigen 的主要类及其功能分类。 1. 核心矩阵和向量类 这些是 Eigen 中最常用的类,用于表示矩阵和向量: Matrix - 通用…...
深入理解TransmittableThreadLocal:原理、使用与避坑指南
一、ThreadLocal与InheritableThreadLocal回顾 在介绍TransmittableThreadLocal之前,我们先回顾一下Java中的ThreadLocal和InheritableThreadLocal。 1. ThreadLocal ThreadLocal提供了线程局部变量,每个线程都可以通过get/set访问自己独立的变量副本…...
大模型奖励建模新突破!Inference-Time Scaling for Generalist Reward Modeling
传统的RM在通用领域面临准确性和灵活性挑战,而DeepSeek-GRM通过动态生成principle和critic,结合并行采样与meta RM引导的投票机制,实现了更高质量的奖励信号生成。论文通过Self-Principled Critique Tuning (SPCT)方法,显著提升了…...
C++:string 1
练习题: 这个题的思路是从前往后,从后往前同时找,不是字母的话就继续,是的话就交换。 代码: #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> #include <string> using namespace std; //1、4个…...
C语言学习之调试
在C语言的编程学习中,我们能不可避免的要遇到bug。通常我们面对编译错误等问题是很容易发现的,但是当我们面对代码结果不满足预期等情况下是很难去改的,因此我们就要学习如何调试代码。 bug与调试 什么是bug? bug本意是“昆虫”和…...
【project】--模拟搭建一个中小型校园网的网络平台
文章目录 项目介绍设备及IP地址分配node01配置网卡配置DHCP配置路由转发 node02配置网卡配置安装并配置授权 Unbound DNS node03配置网卡配置安装防火墙SNAT配置DNAT配置(端口转发)纯缓存 Unbound DNS 配置 node04配置node05配置node06配置 项目介绍 本项目通过1台物理机和VMw…...
DeepSeek 的长上下文扩展机制
DeepSeek 在基础预训练完成后,引入 YaRN(Yet another RoPE extensioN method)技术,通过额外的训练阶段将模型的上下文窗口从默认的 4K 逐步扩展至 128K。整个过程分为两个阶段:第一阶段将上下文窗口从 4K 扩展到 32K;第二阶段则进一步从 32K 扩展到 128K。每个阶段均采用…...
AQS条件队列源码详细剖析
AQS条件队列源码详细剖析 0.简介 欢迎来到我的博客:TWind的博客 最好先看过我博客中的 ReentrantLock的超详细源码解析 ,不然想要理解条件队列的源码会非常困难。 AQS中的条件队列相比同步队列略显简单,但依然优异且高效,复杂而…...
LeetCode --- 446 周赛
题目列表 3522. 执行指令后的得分 3523. 非递减数组的最大长度 3524. 求出数组的 X 值 I 3525. 求出数组的 X 值 II 一、执行指令后的得分 照着题目要求进行模拟即可,代码如下 // C class Solution { public:long long calculateScore(vector<string>&…...
ngrok 内网穿透技术系统性文档
ngrok 内网穿透技术系统性文档—目录 1. 概述与背景1.1 内网穿透的需求背景1.2 ngrok的核心定义1.3 定位与核心价值 2. 核心原理与技术架构2.1 技术架构图2.2 核心原理详解2.2.1 隧道建立流程2.2.2 多协议支持机制2.2.3 动态DNS与路由 3. 功能体系与配置详解3.1 基础功能3.1.1 …...
C++ 为什么建议类模板定义在头文件中,而不定义在源文件中
类模板 XXXX 模板的编译模式模板不是实际的代码,而是一个“代码生成模板” 分离定义会导致链接错误补充为什么普通类可以分离定义?对比C11的export关键字(已弃用) 模板的编译模式 C模板采用两阶段编译(Two-Phase Tran…...
Android studio学习之路(八)---Fragment碎片化页面的使用
fragment的用法很常见,你可能经常看见这样的画面: 通过滑动来进行切换页面,今天我们就来实现这样的形式 介绍 使用 Fragment 的核心价值在于 模块化设计 和 动态适配能力,尤其适合以下场景: 需要…...
数据结构和算法(九)--红黑树
一、红黑树 1、红黑树 前面介绍了2-3树,可以看到2-3树能保证在插入元素之后,树依然保持平衡状态,它的最坏情况下所有子结点都是2-结点,树的高度为IgN,相比于我们普通的二叉查找树,最坏情况下树的高度为N,确…...
字节跳动开源数字人模型latentsync1.5,性能、质量进一步优化~
项目背景 LatentSync1.5 是由 ByteDance 开发的一款先进的 AI 模型,专门针对视频唇同步(lip synchronization)任务设计,旨在实现音频与视频唇部动作的高质量、自然匹配。随着 AI 技术的快速发展,视频生成和编辑的需求…...
Pygame入门:零基础打造你的第一个游戏窗口
Pygame入门:零基础打造你的第一个游戏窗口 大家好,欢迎来到本期的技术分享!今天,我们将一起探索如何使用Python中的Pygame库来创建一个简单的游戏窗口。无论你是编程新手,还是对游戏开发感兴趣的朋友,这篇文章都将帮助你迈出第一步。让我们开始吧! 什么是Pygame? 在…...
《ATPL地面培训教材13:飞行原理》——第13章:高速飞行
翻译:刘远贺;工具:Cursor & Cluade 3.7;过程稿 第13章:高速飞行 目录 引言声速马赫数恒定指示空速爬升对马赫数的影响恒定马赫数下真空速随高度的变化恒定飞行高度和指示空速下温度对马赫数的影响气动流动的细分…...
【C语言练习】004. 使用各种运算符进行计算
【C语言练习】004. 使用各种运算符进行计算 004. 使用各种运算符进行计算1. 算术运算符2. 关系运算符3. 逻辑运算符4. 位运算符5. 赋值运算符6. 逗号运算符综合示例输出结果004. 使用各种运算符进行计算 在C语言中,运算符用于执行各种数学和逻辑运算。以下是一些常见的运算符…...
Pygame事件处理详解:键盘、鼠标与自定义事件
Pygame事件处理详解:键盘、鼠标与自定义事件 在游戏开发中,玩家的交互是至关重要的。无论是移动角色、触发动作还是暂停游戏,都需要通过各种输入来实现。Pygame作为一个功能强大的Python库,提供了丰富的API来处理这些输入,包括键盘、鼠标以及自定义事件。本文将详细介绍如…...
16. LangChain自主智能体(Autonomous Agent):模拟人类工作流的进阶设计
引言:当AI学会"思考"与"行动" 2025年某跨国律所的合同审查智能体,通过自主规划任务流,将平均处理时间从8小时缩短至23分钟。本文将基于LangChain的AgentExecutor与Deepseek-R1,揭示如何构建能自主决策、动态…...
直接映射例题及解析
目录 基本单位换算 例题一 📁 Tag Directory(标签目录) 是什么? 例题二 例题三 例题四 串行访问还是并行访问的选择 例题五 例题六 例题七 🔵 P1:(按行访问) …...
MAVLink协议:原理、应用与实践
目录 1. 前言 2. MAVLink 协议的基本概念 2.1 协议概述 2.2 消息格式 2.3 协议版本 3. MAVLink 协议的适应场景 3.1 无人机地面站与飞行器通信 3.2 飞行器与传感器通信 3.3 无人机集群通信 3.4 飞行模拟与测试 4. 基于 Python 的 MAVLink 协议编程实践 4.1 开发环境…...
【记一次亚马逊普华永道审计流程】
1、2025年2月21日 收到审计邮件 2、2025年2月25日未及时关注注册开发者的邮箱导致一直未回复 3、2025年3月4日亚马逊警告邮件-依旧未回复 4、2025年3月13日APP正式被亚马逊开发者商店下架 停用影响: APP从官方商店下架,不能授权新店铺 停用原因: 由于此邮箱为注册…...
Java 异常处理全解析:从基础到自定义异常的实战指南
Java 异常处理全解析:从基础到自定义异常的实战指南 一、Java 异常体系:Error 与 Exception 的本质区别 1. 异常体系核心架构 Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。 在Java API中已经定义了许…...
二、UI自动化测试02--元素定位方法
目录 一、定位⼀组元素⽅法二、XPath 定位⽅法1. 路径策略1.1 路径值获取⽅法 2. 利⽤元素属性策略利⽤元素属性策略的注意事项 3. 属性和逻辑结合4. 层级和属性结合策略5. XPath 延伸⽅法 三、CSS 定位⽅法1. CSS 策略: id选择器/class选择器/元素选择器/属性选择器2. 属性选择…...
第二章 信息技术发展(2.1 信息技术及其发展)
2.1 信息技术及其发展 2.1.1 计算机软硬件 计算机硬件 (Computer Hardware) 是指计算机系统中由电 、机械和光电元件等组成 的各 种物理装置的总称计算机软件 (Computer Software) 是指计算机系统中的程序及其文档,程序是计 算任务的处理对象和处理规则的描述;文档是为了便千…...