【资源损坏类故障】:详细了解坏块
目录
1、物理坏块与逻辑坏块
1.1、物理坏块
1.2、逻辑坏块
2、两个坏块相关的参数
2.1、db_block_checksum
2.2、db_block_checking
3、检测坏块
3.1、告警日志
3.2、RMAN
3.3、ANALYZE
3.4、数据字典
3.5、DBVERIFY
4、修复坏块
4.1、RMAN修复
4.2、DBMS_REPAIR修复
4.3、BBED
5、写在最后
1、物理坏块与逻辑坏块
将数据库比喻成一本书,每一页看作是一个数据块。当我们看不懂书中某页的内容可能有3种原因:该页缺损、该页内容逻辑有错误、智商不够。我们的智商显然不是问题,这点首先排除。
所以书页缺损、书页上的内容逻辑错误是最可能的两点原因。其中页书缺损就好比数据库中的物理坏块,直接粗暴的破坏了这一页;书页上的内容逻辑错误就像是数据库中的逻辑坏块,写的内容驴头不对马嘴。
如果现在写的这篇文章让您读着不通顺或者读不懂,那这篇文章也属于是个逻辑坏块。
1.1、物理坏块
存储介质导致的数据块损坏,常见的场景是磁盘损坏、网络故障导致数据块在传输时发生损坏,突然断电导致数据块的元数据损坏。
1.1.1、物理坏块的常见错误表现
1.1.1.1、Fractured Block(断块)
断块是指数据块不完整,块头信息与块尾信息不匹配。
Corrupt block relative dba: 0x0380e573 (file 14, block 58739)
Fractured block found during buffer read
Data in bad block -
type: 6 format: 2 rdba: 0x0380e573
last change scn: 0x0288.8e5a2f78 seq: 0x1 flg: 0x04
consistency value in tail: 0x00780601
check value in block header: 0x8739, computed block checksum: 0x2f00
spare1: 0x0, spare2: 0x0, spare3: 0x0
***
Reread of rdba: 0x0380e573 (file 14, block 58739) found same corrupted data
1.1.1.2、Bad checksum
这个错误是指checksum不一致。
checksum是数据块的校验和,它是Oracle将数据块中的内容通某种算法进行计算生成的一个唯一的校验值。checksum存储在数据块的头部;当读取数据块时,Oracle会重新计算checksum,与存储在数据块头部的checksum进行比较,如果不一致,就判断数据块发生了损坏。
Corrupt block relative dba: 0x0380a58f (file 14, block 42383)
Bad check value found during buffer read
Data in bad block -
type: 6 format: 2 rdba: 0x0380a58f
last change scn: 0x0288.7784c5ee seq: 0x1 flg: 0x06
consistency value in tail: 0xc5ee0601
check value in block header: 0x68a7, computed block checksum: 0x2f00
spare1: 0x0, spare2: 0x0, spare3: 0x0
***
Reread of rdba: 0x0380a58f (file 14, block 42383) found same corrupted data
1.1.1.3、Block Misplaced
Oracle检测到正在读取的数据块的内容属于另一个块,但是checksum有效。
Corrupt block relative dba: 0x0d805a89 (file 54, block 23177)
Bad header found during buffer read
Data in bad block -
type: 6 format: 2 rdba: 0x0d805b08 ----> Block is different than expected 0x0d805a89
last change scn: 0x0692.86dc08e3 seq: 0x1 flg: 0x04
consistency value in tail: 0x08e30601
check value in block header: 0x2a6e, computed block checksum: 0x0
spare1: 0x0, spare2: 0x0, spare3: 0x0
1.1.1.4、Zeroed out blocks
如果Oracle数据库发生了Zeroed out blocks,那么基本可以判断是操作系统或者存储系统发生了故障。
根据Oracle官方文档描述,在设计的时候,Oracle就被确定不会写全零块,目的是为了识别底层操作系统或者存储中的故障。
Corrupt block relative dba: 0x014000a0 (file 5, block 160)
Completely zero block found during multiblock buffer read
1.2、逻辑坏块
逻辑坏块是指数据块的内容或者结构不符合Oracle内部规范,但是在物理存储介质方面没有问题。虽然发生了逻辑坏块,但其checksum很可能并无问题,只是数据块中的内容发生了损坏。
逻辑坏块的详细损坏描述通常不会输出到告警日志中,这点是和物理坏块不同的。
1.2.1、逻辑坏块常见错误表现:
1.2.1.1、ORA-600 [4512]
ORA-600 [4512],被不存在的事务锁定了行。
1.2.1.2、不符合自然逻辑
日期数据类型字段,存入了2025-03-32 25:61:61这种不符合自然逻辑的数据。
1.2.1.3、数据字典逻辑损坏
Oracle数据字典字典表发生了字典数据与实际不一致的情况;例如:dba_tables显示某表存在,但是实际的数据文件没有这个表段。
执行DDL操作时,触发ORA-00600 [kdsgrp1],或者元数据查询失败。
1.2.1.4、索引失效
索引指向了无效的ROWID,比如说数据行已经被删除了,但是索引没有更新。
索引扫描时,返回ORA-01410(无效的ROWID),或者查询结果不匹配。
1.2.1.5、数据块头部元数据损坏
数据块的头部信息,例如块的类型、SCN、事务槽遭到损坏。例如数据块的类型本来是表段块,但是实际存储的却是索引,这种错误就属于是Oracle软件的bug了。
访问到这种逻辑坏块时,触发ORA-00600 [kddummy_blkchk]内部错误。
2、两个坏块相关的参数
2.1、db_block_checksum
这个参数是用来控制checksum的生成.
checksum是数据块的校验和,它是Oracle将数据块中的内容通某种算法进行计算生成的一个唯一的校验值。checksum存储在数据块的头部;当读取数据块时,Oracle会重新计算checksum,与存储在数据块头部的checksum进行比较,如果不一致,就判断数据块发生了损坏。
可以通过show parameter来查看当前数据库对于此参数的配置情况。
SQL> show parameter db_block_checksumNAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_block_checksum string TYPICAL
db_block_checksum参数有3种选项:FULL、TYPICAL、OFF,下面对这三种选项进行简单说明。
参数选项 | 简单说明 |
FULL | 对所有数据块,包括数据文件、控制文件、日志文件生成校验和。 |
TYPICAL | 默认值,对数据文件、控制文件生成校验和,不会作用于临时表空间。 |
OFF | 不生成checksum,这个是不推荐的。 |
可以修改db_block_checksum参数,但因为是静态参数,修改完参数需要重启数据库。
ALTER SYSTEM SET db_block_checksum = FULL SCOPE=SPFILE;
2.2、db_block_checking
这个参数是对数据块的逻辑一致性检查,当数据块在被读取或者修改时,自动检测数据块内部结构的逻辑错误,从而防止因为逻辑损坏导致数据丢失。
db_block_checking参数有4种选项:HIGH、MEDIUM、LOW、OFF,下面对这4种选项进行简单的说明。
参数选项 | 简单说明 |
HIGH | 执行完整的逻辑检查,包括索引块、事务槽,覆盖数据库所有的修改操作。 |
MEDIUM | 对所有表空间的数据块执行基本检查,例如块头等。 |
LOW | 只对数据库的系统表空间执行数据块检查。 |
OFF | 不对任何数据块执行检查,这是个默认值。 |
可以修改db_block_checking参数,但因为是静态参数,修改完参数需要重启数据库。
ALTER SYSTEM SET db_block_checking=HIGH SCOPE=SPFILE;
db_block_checksum与db_block_checking参数的不同点在于db_block_checksum是用来检测物理完整性的,主要是服务于物理坏块问题处理;db_block_checking是用来检测逻辑一致性的,主要是服务于逻辑坏块问题处理。
db_block_checksum与db_block_checking参数的相同点是当启用参数时,启用的级别的越高,对性能的影响就会越大。所以在使用这两个参数时,需要在数据库性能和数据安全这两方面做好平衡。
3、检测坏块
Oracle数据库提供了几种手段可以对坏块进行监测,下面对这些手段进行逐一介绍。这些手段侧重点和使用场景都有不同,有的也可以组合使用,效率效果更佳。
3.1、告警日志
告警日志是DBA最常看的日志,每次巡检如果绕开它,个人觉得都不算一次标准的巡检。Oracle在检测到数据坏块时,会在告警日志中记录错误信息。通过检查告警日志,可以及时发现数据坏块错误。
确定告警日志位置,以下两个方法都可以。
SQL> show parameter dumpNAME TYPE VALUE
------------------------------------ ----------- ------------------------------
background_core_dump string partial
background_dump_dest string /oracle/app/diag/rdbms/htbase/htbase1/trace
core_dump_dest string /oracle/app/diag/rdbms/htbase/htbase1/cdump
max_dump_file_size string unlimited
shadow_core_dump string PARTIAL
user_dump_dest string /oracle/app/diag/rdbms/htbase/htbase1/traceSQL> SELECT value FROM v$diag_info WHERE name = 'Diag Trace';VALUE
--------------------------------------------------------------------------------
/oracle/app/diag/rdbms/htbase/htbase1/trace
检索坏块错误记录
在告警日志中搜索“ORA-01578”,或者搜素“Corrupt block“关键字。这个大家可以看上文物理坏块介绍那里就知道为什么检索两个了。
3.2、RMAN
RMAN也是官方推荐坏块检测工具,支持对数据文件、控制文件、归档日志文件等进行完整性检查,个人觉得RMAN比较适合作为一种定期健康检查的手段。RMAN有下面几种检查方式。
3.2.1、检查整个数据库
可以输出所有数据文件、控制文件、日志文件的坏块信息。
RMAN> VALIDATE DATABASE;
3.2.2、检查指定的数据文件
可以输出数据文件内每个块的物理和逻辑一致性。
RMAN> VALIDATE DATAFILE 28; -- 文件号为28的数据文件
3.2.3、逻辑一致性检查
不仅检查数据块的物理完整性,还会检查数据块的逻辑结构。
RMAN> VALIDATE CHECK LOGICAL DATABASE;
3.2.4、检查备份集
这个命令,无论是新手还是老手都不陌生,备份常用命令,检查备份文件是否损坏,确保恢复的时候是可用的。
RMAN> VALIDATE BACKUPSET <备份集编号>;
3.3、ANALYZE
ANALYZE命令可以检查表、索引的逻辑一致性。
3.3.1、检查表结构
如果存在坏块,会抛出ORA-01498错误。此时可能是数据块头部的元数据信息出错、索引对应数据块的关联关系有误(这些都在上文的逻辑坏块部分介绍过);如果是物理坏块,还会伴随着ORA-01578。
ANALYZE TABLE hr.zqd VALIDATE STRUCTURE;
3.3.2、检查索引的一致性
如果索引与表数据不匹配,会抛出ORA-01499错误。这可能是索引和表数据没同步,例如删除大量数据后,没有重建索引;事务异常中断导致索引条目没有正常更新等等。如果是物理损坏的话,会伴随着ORA-01578错误。
此时比较高效的修复操作是重建索引,但不一定能解决所有场景下的此类问题。
ANALYZE INDEX HR.zqd_idx VALIDATE STRUCTURE;
3.4、数据字典
3.4.1、V$DATABASE_BLOCK_CORRUPTION
SELECT * FROM V$DATABASE_BLOCK_CORRUPTION;
这个视图会记录Oracle数据库中检测到坏块信息。这个视图的数据写入触发机制包含以下几种途径。
操作 | 具体操作 |
RAMN | 1、使用RMAN进行备份的时候,会验证数据块的完整性,若发现坏块,会写入该视图。 2、使用RMAN进行VALIDATE验证时,若发现坏块,会写入该视图。 3、使用RMAN进行RECOVER恢复时,若发现坏块,会写入该视图。 |
进程检测 | 1、读取数据时,checksum不一致,会将坏块信息写入该视图。 2、SELECT语句访问到坏块时,会将坏块信息写入该视图。 |
工具检查 | 1、DBVERIFY作为外部工具,不会直接将坏块信息写入视图,但可以通过日志文件手动确认坏块后,需要通过数据库操作才会将坏块信息写入视图。 2、ANALYZE命令若检测到坏块可能会将坏块信息写入视图。 |
3.4.2、DBA_EXTENTS
通过这个Oracle系统基础表,可以定位到具体的坏块所在对象,可能是表、索引、大字段。
SELECT owner, segment_name, segment_type
FROM dba_extents
WHERE file_id = 5 -- 文件号AND 1234 BETWEEN block_id AND block_id + blocks -1; -- 块号
3.5、DBVERIFY
DBVERIFY是Oracle数据库提供的命令行工具,用于检查数据文件物理和逻辑一致性,重点检查数据块的完整性。
3.5.1、DBVERIFY有几个特点,主要包含以下几个方面。
3.5.1.1、只读方式打开
它以只读的方式打开数据文件,不会修改数据文件,确保了数据文件的安全性。
3.5.1.2、在线检查
它支持在线检查数据文件,不需要关闭数据库。当然离线时对数据文件的检查速度更快。
3.5.1.3、支持对ASM文件的检查
在数据库是正常打开的情况下,通过userid参数指定用户权限,即可检查ASM文件。
dbv file=+DG1/orcl/datafile/system01.dbf userid=system/sys
3.5.2、DBVERIFY是有局限性的,主要包含以下几个方面:
3.5.2.1、只检查数据文件
它只能检查数据文件;不能检查控制文件和日志文件。
3.5.2.2、不检查逻辑关联性
只会检查数据块内部的结构,不会检查索引与表数据的匹配关系。
3.5.2.3、文件大小限制
在某些平台下,不能检查超过2G的数据文件(但这一点我自己没有实际验证过)。
3.5.3、常用与帮助
DBVERIFY工具的命令参数有很多,但常用的就是FILE、BLOCKSIZE、LOGFILE等。如果有特殊需要可以查看帮助:dbv help=y
dbv FILE=/oradata/users01.dbf BLOCKSIZE=8192 LOGFILE=/tmp/dbv.log
4、修复坏块
4.1、RMAN修复
最理想的是使用RMAN恢复,进而实现修复坏块的目的。但这是需要当前数据库有备份,并且备份可用无坏块的情况下。
4.1.1、使用RMAN进行块恢复
检测到数据库的坏块、坏块所在数据文件后,可以指定坏块进行块恢复。建议是在数据库坏块不多的情况下使用块恢复,这种修复效率很高;如果是恢复整个数据文件,恢复效率会相对很低。
RMAN> VALIDATE BACKUPSET ALL; --检查所有备份集是否可用,且有无坏块。RMAN> VALIDATE BACKUPSET <备份集编号>; --指定备份集进行检查,检查是否可用,且有无坏块。
RMAN> VALIDATE DATABASE; --检测坏块位置
RMAN> blockrecover datafile 4 block 1798; --进行块恢复--也可以一次修复同一数据文件中的多个坏块
RMAN> blockrecover datafile 4 block 1798,1799; --进行多个坏块恢复
VALIDATE DATAFILE 4 BLOCK 1798; --验证修复结果
4.1.2、使用RMAN进行数据文件恢复
如果数据库中的坏块很多,或者进行RMAN块恢复失败时,可以尝试使用RMAN进行数据文件恢复。
使用RMAN进行数据文件恢复会有几点事项需要注意:恢复期间,数据库部分不可用,因为坏块所在的数据文件需要OFFLINE;需要确保归档日志完整以支持完全恢复;如果坏块所在的数据文件比较大,恢复效率不会很高。
RMAN> VALIDATE BACKUPSET ALL; --检查所有备份集是否可用,且有无坏块。RMAN> VALIDATE BACKUPSET <备份集编号>; --指定备份集进行检查,检查是否可用,且有无坏块。
RMAN> VALIDATE DATABASE; --检测坏块位置
SQL> ALTER DATABASE DATAFILE 4 OFFLINE; --离线坏块所在的数据文件
RMAN> RESTORE DATAFILE 4; --从备份恢复数据文件
RMAN> RECOVER DATAFILE 4; --还原坏块所在的数据文件
SQL> ALTER DATABASE DATAFILE 4 ONLINE; --切换数据文件为ONLINE状态。
4.1.3、补充
上文的备份集检查是建议每次备份完就执行检查,定期巡检也加入这类检查。如果备份集不可用或者存在坏块,那么使用RMAN进行坏块修复的这条路就断掉了。
4.2、DBMS_REPAIR修复
Oracle数据库提供了DBMS_REPAIR包用于修复坏块。但这个方法在修复坏块方面往往是不奏效的。拟人化的讲,我个人觉得这个DBMS包有点 “打的过就打,打不过就跑” 的感觉。因为它虽然很多时候修不好坏块,但是它能让Oracle的增删改查操作跳过坏块;这也就导致了使用DBMS_REPAIR方法非常可能会丢失数据。但是在没有备份的情况下,这也是发生坏块时,能拯救部分数据的方法之一。
下图是DBMS_REPAIR的常用方法总结。
现在Oracle数据库中HR.ZQD0318表有个坏块,接下来详细描述下DBMS_REPAIR修复/跳过坏块的步骤。
SQL> SELECT COUNT(*) FROM HR.ZQD0318;COUNT(*)
----------72594
4.2.1、创建REPAIR表
REPAIR表用于记录需要被修复的表。REPAIR表创建完后,是不会立刻有数据的;在检查完对象的数据块受损情况后,REPAIR表才会有数据。
BEGIN
DBMS_REPAIR.ADMIN_TABLES(TABLE_NAME => 'REPAIR_TABLE',TABLE_TYPE => DBMS_REPAIR.REPAIR_TABLE,ACTION => DBMS_REPAIR.CREATE_ACTION,TABLESPACE => 'ZQD');
END;
--如果在SQLPLUS中执行PLSQL代码块,需要在代码块末尾加上“/”
4.2.2、 创建ORPHAN表
ORPHAN表是用来存放在表出现坏块后的孤立(OPRHAN)索引相关信息,也就是指向那些坏块的索引信息。ORPHAN表创建完后,不会立刻有数据;在使用DUMP_ORPHAN_KEYS过程后,才会有指向坏块的索引相关信息。
BEGINDBMS_REPAIR.ADMIN_TABLES(TABLE_NAME => 'ORPHAN_KEY_TABLE',TABLE_TYPE => DBMS_REPAIR.ORPHAN_TABLE,ACTION => DBMS_REPAIR.CREATE_ACTION,TABLESPACE => 'ZQD');
END;
--如果在SQLPLUS中执行PLSQL代码块,需要在代码块末尾加上“/”
4.2.3、检查对象的数据块受损情况
检查完后,坏块信息会写入REPAIR表。
DECLAREcorruptnum INT;
BEGINcorruptnum := 0;DBMS_REPAIR.CHECK_OBJECT(SCHEMA_NAME => 'HR',OBJECT_NAME => 'ZQD0318',REPAIR_TABLE_NAME => 'REPAIR_TABLE',CORRUPT_COUNT => corruptnum);DBMS_OUTPUT.PUT_LINE('坏块数量:' || TO_CHAR(corruptnum));
END;
--如果在SQLPLUS中执行PLSQL代码块,需要在代码块末尾加上“/”
4.2.4、查看坏块信息
SELECT OBJECT_NAME,BLOCK_ID,CORRUPT_TYPE,MARKED_CORRUPT,REPAIR_DESCRIPTION FROM REPAIR_TABLE;
4.2.5、尝试修复坏块
如果输出是0,则说明修复了0个坏块,修复无效,此时可以选择跳过坏块。
DECLARE
fixnum number;
BEGINDBMS_REPAIR.FIX_CORRUPT_BLOCKS(SCHEMA_NAME => 'HR',OBJECT_NAME => 'ZQD0318',FIX_COUNT => fixnum);DBMS_OUTPUT.PUT_LINE('修复坏块的数量:' || TO_CHAR(fixnum));
END;
--如果在SQLPLUS中执行PLSQL代码块,需要在代码块末尾加上“/”
4.2.6、 记录指向坏块的索引相关信息
执行完如下的PLSQL代码块后,失效索引相关信息(指向坏块的索引相关信息)会写入ORPHAN表。PLSQL代码块中的OBJECT_NAME是索引的名字,不是表名;如果有多个索引,需要为每个索引执行DUMP_ORPHAN_KEYS操作。
DECLAREDATAS NUMBER;
BEGINDBMS_REPAIR.DUMP_ORPHAN_KEYS(SCHEMA_NAME => 'HR',OBJECT_NAME => 'IDX_ZQD',OBJECT_TYPE => DBMS_REPAIR.INDEX_OBJECT,REPAIR_TABLE_NAME => 'REPAIR_TABLE',ORPHAN_TABLE_NAME => 'ORPHAN_KEY_TABLE',KEY_COUNT => COUNTS);DBMS_OUTPUT.PUT_LINE('孤立索引数量:' || TO_CHAR(COUNTS));
END;
4.2.7、跳过坏块
执行下面PLSQL代码块后,坏块已被标记跳过。此时增删改查都不会报错,但坏块上的这部分数据也就丢失了。但丢失的数据的ROWID依然可以在ORPHAN表找到。
BEGINDBMS_REPAIR.SKIP_CORRUPT_BLOCKS(SCHEMA_NAME => 'HR',OBJECT_NAME => 'ZQD0318',OBJECT_TYPE => DBMS_REPAIR.TABLE_OBJECT,FLAGS => DBMS_REPAIR.SKIP_FLAG);
END;
--如果在SQLPLUS中执行PLSQL代码块,需要在代码块末尾加上“/”
4.2.8、重建索引
ALTER INDEX HR.IDX_ZQD REBUILD
4.2.9、验证结果
SQL> SELECT COUNT(*) FROM HR.ZQD0318;COUNT(*)
----------72542
4.2.10、后续
上面的一套组合拳打完,表虽然恢复了访问、但是也丢失了部分数据。即使丢失的数据可以通过其他方式补回来(例如数据仓库可以再重新抽取数据),也存在一个问题:坏块依然存在。
此时,将表中的数据全部导出(导出时跳过了坏块数据),然后重建表;再将导出的数据重新导入到数据库中;这个过程建议是使用数据泵expdp/impdp操作。操作完毕后,可以彻底消除坏块。
4.3、BBED
BBED:Block Browser and Editor(块浏览器和编辑器)
BBED直接操作底层数据块,风险很高,需要非常专业的人士来操作。且操作不可逆,是作为坏块修复的最后一种手段使用。
5、写在最后
上面简单介绍了坏块的3种修复手段;但当真在生产上遇到了坏块情况,仅凭这篇文章的描述,很难高效解决问题。这篇文章只是基础了解,想要高效解决坏块问题,除了基础以外,需要平时多做模拟演练,定期总结,才能在遇到坏块时,快速给出最完美的解决方案。
相关文章:
【资源损坏类故障】:详细了解坏块
目录 1、物理坏块与逻辑坏块 1.1、物理坏块 1.2、逻辑坏块 2、两个坏块相关的参数 2.1、db_block_checksum 2.2、db_block_checking 3、检测坏块 3.1、告警日志 3.2、RMAN 3.3、ANALYZE 3.4、数据字典 3.5、DBVERIFY 4、修复坏块 4.1、RMAN修复 4.2、DBMS_REPA…...
Django系列教程(13)——Cookie和Session应用场景及案例
目录 什么是cookie,cookie的应用场景及缺点 Django中如何使用cookie Cookie使用示例 什么是session及session的工作原理 Django中如何使用会话session Session使用示例 小结 HTTP协议本身是”无状态”的,在一次请求和下一次请求之间没有任何状态保…...
给管理商场消防安全搭建消防安全培训小程序全过程
一、需求沟通 “我是管理商场消防安全的嘛,做这个的作用呢,1是商场的所有商户员工可以看平面或者视频随时自学, 2是我们定期培训必修课程、考试,这个需要留存他们的手签字的签到表确认我们讲给他们听了(免责很重要&am…...
YOLOv11 目标检测
本文章不再赘述anaconda的下载以及虚拟环境的配置,博主使用的python版本为3.8 1.获取YOLOv11的源工程文件 链接:GitHub - ultralytics/ultralytics: Ultralytics YOLO11 🚀 直接下载解压 2.需要自己准备的文件 文件结构如下:红…...
数据库原理实验报告:Powerdesigner建模E-R模型并转换表
注:此实验并不完整,仅供参考,如需完整版请私我留言 一、实验目的: 二、实验工具: 三、实验要求: 四、实验过程: 图文并茂,每一步都包含详细图片,总共11页word!…...
【愚公系列】《高效使用DeepSeek》018-错题本整理
🌟【技术大咖愚公搬代码:全栈专家的成长之路,你关注的宝藏博主在这里!】🌟 📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主! 👉 江湖人称"愚公搬代码",用七年如一日的精神深耕技术领域,以"…...
面试八股 —— Redis篇
重点:缓存 和 分布式锁 缓存(穿透,击穿,雪崩) 降级可作为系统的保底策略,适用于穿透,击穿,雪崩 1.缓存穿透 2.缓存击穿 3.缓存雪崩 缓存——双写一致性 1.强一致性业务(…...
maven的安装配置
目录 一、官网下载压缩包 二、配置环境变量 设置 MAVEN_HOME 添加 MAVEN_HOME\bin 到 PATH 三、配置本机仓库和远程仓库 四、配置idea 一、官网下载压缩包 Download Apache Maven – Maven 如上图。选择这个压缩包 选择好文件,下载完后,配置环境变…...
SpringCloud系列教程(十四):Sentinel持久化
Sentinel之前已经搭建和应用成功了,但是它有一个很大的缺点就是官方没有提供持久化的方案,从项目源码上看感觉这款工具也没有完成的太好,所以需要我们去对它进行二次开发。要补充的功能大概如下: 1、将Sentinel接入nacos中&#…...
深度学习处理时间序列(1)
不同类型的时间序列任务 时间序列(timeseries)是指定期测量获得的任意数据,比如每日股价、城市每小时耗电量或商店每周销售额。无论是自然现象(如地震活动、鱼类种群的演变或某地天气)还是人类活动模式(如…...
微前端 qiankun vite vue3
文章目录 简介主应用 qiankun-main vue3 vite子应用 qiankun-app-vue2 webpack5子应用 qiankun-react webpack5子应用 quankun-vue3 vite遇到的问题 简介 主要介绍以qiankun框架为基础,vite 搭建vue3 项目为主应用,wepack vue2 和 webpack react 搭建的…...
【ArduPilot】Windows下使用Optitrack通过MAVProxy连接无人机实现定位与导航
Windows下使用Optitrack通过MAVProxy连接无人机实现定位与导航 配置动捕系统无人机贴动捕球配置无人机参数使用MAVProxy连接Optitrack1、连接无人机3、设置跟踪刚体ID4、校正坐标系5、配置IP地址(非Loopback模式)6、启动动捕数据推流 结语 在GPS信号弱或…...
【GPT入门】第24课 langfuse介绍
【GPT入门】第24课 langfuse介绍 1. langfuse概念与作用2. 代码3. 页面效果4. 设计模式1. 装饰器模式2. 上下文管理模式1. langfuse概念与作用 Langfuse是一款专为大规模语言模型(LLM)应用开发设计的开源平台。其作用主要包括以下几个方面: 提升开发效率:通过消除LLM应用构…...
基于javaweb的SpringBoot食品溯源系统设计与实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…...
SVN简明教程——下载安装使用
SVN教程目录 一、开发中的实际问题二、简介2.1 版本控制2.2 Subversion2.3 Subversion的优良特性2.4 工作原理2.5 SVN基本操作 三、Subversion的安装与配置1. 服务器端程序版本2. 下载源码包3. 下载二进制安装包4. 安装5. 配置版本库① 为什么要配置版本库?② 创建目…...
AJAX的理解和原理还有概念
你想问的可能是 AJAX(Asynchronous JavaScript and XML) ,它并不是一门新的编程语言,而是一种在无需重新加载整个网页的情况下,能够与服务器进行异步通信并更新部分网页的技术。以下从基本概念、原理、优点、使用场景等…...
利用AI让数据可视化
1. 从问卷星上下载一份答题结果。 序号用户ID提交答卷时间所用时间来源来源详情来自IP总分1、《中华人民共和国电子商务法》正式实施的时间是()。2、()可以判断企业在行业中所处的地位。3、()是指店铺内有…...
FOC——Butterworth (巴特沃斯)数字滤波器(2025.03.18)
参考链接1: [DSP] Butterworth (巴特沃斯)数字滤波器设计参考 参考链接2: 陈佩青《数字信号处理教程》 参考链接3: ButterWorthFIlter(巴特沃斯滤波器) 在此感谢各位前辈大佬的总结,写这个只是为了记录学习大佬资料的过程,内容基本…...
Redis如何实现持久化
Redis如何实现持久化 Redis默认将所有数据存储在内存中,虽然读写效率极高,但存在两大风险 数据易失性:进程重启或服务器宕机导致内存数据丢失。恢复成本高:无法直接通过内存重建大规模数据集。 Redis作为高性能的键值数据库&…...
docker安装rabbitmq并配置hyperf使用
为满足您的高标准需求,我将分步骤为您详细解释如何通过Docker安装RabbitMQ服务器,并展示如何配置PHP的Hyperf框架来使用RabbitMQ。 安装RabbitMQ: 获取RabbitMQ镜像在终端中运行以下命令来拉取RabbitMQ的官方Docker镜像: docker …...
极空间NAS部署gitea教程
极空间NAS部署gitea步骤教程 背景1. 准备镜像1.1 极空间官方1.2 Win系统docker再上传1.3 镜像转录 2. MySql配置2.1 容器配置2.2 命令行配置 3. gitea配置3.1 容器配置3.2 打开网页3.3 网页配置安装 参考资料 背景 极空间Nas和别的Nas不同的地方就在于,他不是那种标…...
大模型学习-从零开始在colab训练大模型
目录 写这篇文章的目的 1.准备训练所需的文件 2.将压缩包上传到谷歌云盘 使用colab 3.训练 写这篇文章的目的 这篇文章是对:大模型学习-在colab中训练并更换模型_colab调整模型-CSDN博客的一个优化,因为在之前的博文中,我是提供了一个现…...
【商城实战(38)】Spring Boot:从本地事务到分布式事务,商城数据一致性的守护之旅
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配…...
漏洞知识点《PHP数组绕过深入解析》
在PHP中,通过数组绕过安全限制的核心原理与PHP语言特性和底层实现机制密切相关。以下是具体原因及技术细节分析: 一、PHP参数解析机制的特性 PHP的$_GET、$_POST等超全局变量支持将用户输入自动解析为数组。例如,通过URL参数?username[0]a…...
【极光 Orbit·STC8x】05. GPIO库函数驱动LED流动
【极光 OrbitSTC8】05. GPIO库函数驱动LED流动 七律 逐光流转 八灯列阵若星河,状态为舟渡长波。 寄存器中藏玄机,Switch语句定山河。 循环往复如潮涌,步骤变量掌沉浮。 单片机前展锋芒,代码织就光之舞。 摘要 本文基于STC8H8K6…...
SSH配置过程及无法正常链接问题的解决【小白教学】
1.尝试克隆github上的项目,发现无法正常下载【之前有些是可以的】 git clone https://github.com/mogualla/PythonRobotics.git --depth 3 出现下面的提示【错误】: Cloning into PythonRobotics... fatal: unable to access https://github.com/mogua…...
总结 HTTP 协议的基本格式, 相关知识以及抓包工具fiddler的使用
目录 1 HTTP是什么 2 HTTP协议格式 3 HTTP请求(Request) 3.1 认识URL 3.2 方法 3.3 认识请求"报头"(header) 3.3.1 Host 3.3.2 Content-Length 3.3.3 Content-Type 3.3.4 User-Agent (简称UA) 3.3.5 Referer 3.3.6 Cookie和Session 4 HTTP响应详解 4.…...
Conda 虚拟环境创建:加不加 Python 版本的深度剖析
在 conda 中创建虚拟环境时,是否指定 Python 具体版本会直接影响环境构建的底层逻辑、依赖管理方式以及后续开发的可控性。 一、核心机制对比 不指定 Python 版本 (conda create -n env_name) 默认继承基础环境版本 Conda 会使用当前基础环境(如 base&am…...
docker的anythingllm和open-webui压缩包分享(国内镜像拉取,百度云压缩包分享)
文章目录 前言第一部分:镜像获取🚀 方式一:切换国内下载镜像✅1. 下载anythingllm✅ 2. 下载open-webui 🚀方式二:下载我分享的百度云✅ anythingllm压缩包百度云链接❎ open-webui压缩包 第二部分:下载之后…...
C#命令行参数用法
C#命令行参数用法 static void Main(string[] args){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);// 解析命令行参数if (args.Length > 0){// 这里处理命令行参数,例如:打开文件、设置配置等// 例如&…...
Unity3D开发AI桌面精灵/宠物系列 【二】 语音唤醒 ivw 的两种方式-Windows本地或第三方讯飞等
Unity3D 交互式AI桌面宠物开发系列【二】ivw 语音唤醒 该系列主要介绍怎么制作AI桌面宠物的流程,我会从项目开始创建初期到最终可以和AI宠物进行交互为止,项目已经开发完成,我会仔细梳理一下流程,分步讲解。 这篇文章主要讲有关于…...
Matlab概率区间预测全家桶更新了,新增光伏出力区间预测,4种分布可供预测
基本介绍 适用于matlab2020及以上。可任意选择置信区间,区间覆盖率picp、区间平均宽度百分比等等,可用于预测不确定性,效果如图所示,采用KDE,4种分布进行预测,有对比,可以替换成自己的数据。 …...
第2章:容器核心原理:深入理解Namespace、Cgroup与联合文件系统
第2章:容器核心原理:深入理解Namespace、Cgroup与联合文件系统 作者:DogDog_Shuai 阅读时间:约20分钟 难度:中级 目录 1. 引言2. Linux容器核心技术3. Namespace详解4. Cgroup详解5. 联合文件系统6. 容器运行时原理...
用css绘制收银键盘
最近需求说需要自己弄个收银键盘,于是乎直接上手搓 主要基于Vue3写的,主要是CSS <template><view class"container"><view class"info"><image class"img" src"" mode"">&l…...
aws训练快速入门教程
AWS 相关核心概念 简洁地介绍一下AWS训练云服务的核心关联概念: AWS核心服务层: 基础设施层: EC2(计算), S3(存储), RDS(数据库)等人工智能层: SageMaker(训练平台), AI服务等 机器学习服务分级: 高层: 预构建AI服务(开箱即用)中层: SageMaker(主要训练平台)底层: 框架和基…...
基于FPGA轨道交通6U机箱CPCI脉冲板板卡
板卡简介: 本板为脉冲板,脉冲板主要执行CPU下达的指令,通过实现各种控制算法来调节PWM,然后输出光纤PWM信号来驱动变频器功率模块以达到控制电机的目的。 性能规格: 电源:DC5V;15V FPGA&…...
数据库GreenDao的使用、升级、以及相关常用注释说明
目录 一、使用GreenDao的流程 添加GreenDao依赖配置greendao的generator生成文件使用GreenDao生成bean类 3.1 创建实体类 3.2 生成dao文件创建GreenDaoManager来进行统一管理,并初始化 4.1 创建GreenDaoManager 4.2 在Application中进行初始化GreenDao使用GreenDa…...
【C++】 —— 笔试刷题day_6
刷题day_6,继续加油哇! 今天这三道题全是高精度算法 一、大数加法 题目链接:大数加法 题目解析与解题思路 OK,这道题题目描述很简单,就是给我们两个字符串形式的数字,让我们计算这两个数字的和 看题目我…...
PostgreSQL:语言基础与数据库操作
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
cmake 之 CMakeLists.txt 中的函数是从哪里来的
我们都知道,cmake会解释执行 CMakeLists.txt 以及其他 *.cmake 脚本, 这里先给出一个“先验” 的知识点: 任何一个独立脚本或脚本函数命令的执行,都是通过 CPP 函数 RunListFile(...) 调用的 void cmMakefile::RunListFile(cmL…...
谷歌or-tools开源库入门
1.命令行编译程序 这里要说明下,直接用qt或者VS2022打开cmake工程,编译没有成功。所以,老老实实的按照官方教程来,使用命令行编译。 (1)准备 1)安装cmake,版本3.18以上࿰…...
深入解析 C++ Vector:全面掌握 STL 核心容器的原理与高效实践
一、Vector 的核心概念与特性 Vector 是 C 标准库中最常用的动态数组容器,其底层基于连续内存存储元素,兼具数组的高效访问与动态扩容的灵活性。以下是其核心特性: 1.1 核心特性对比 特性普通数组Vector 容器内存分配静态固定动态增长访问效…...
【MySQL】MySQL数据存储机制之存储引擎
目录 1.如何理解存储引擎? 2.MySQL 提供的存储引擎 3.存储引擎的功能特性 (1)存储介质 (2)事务处理能力 (3)锁定 (4)备份和恢复 (5)优化…...
OpenCV旋转估计(1)用于估计图像间仿射变换关系的类cv::detail::AffineBasedEstimator
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 基于仿射变换的估计器。 这种估计器使用匹配器估算的成对变换来为每个相机估算最终的变换。 cv::detail::AffineBasedEstimator 是 OpenCV 库中…...
小红书不绑定手机号会显示ip吗
小红书作为一个生活方式分享平台,拥有庞大的用户群体。在小红书上,用户可以分享自己的生活点滴、购物心得、美食体验等,与其他用户进行互动交流。最近,不少用户对于小红书是否会在不绑定手机号的情况下显示IP属地产生了疑问&#…...
网络空间安全(36)数据库权限提升获取webshell思路总结
一、获取数据库访问权限 寻找漏洞: SQL注入:这是最常见的方法之一。攻击者通过SQL注入漏洞,可以在数据库执行任意SQL语句,从而获取数据库中的数据,甚至可能获取数据库的访问权限。配置文件泄露:有时&#x…...
OceanBase 中,如何抓包分析应用连接超时的问题
本文作者:胡呈清,爱可生 DBA 团队成员,擅长故障分析、性能优化 与MySQL这类单机数据库相比,OceanBase分布式数据库的访问链路相对较长,因此在遇到连接异常时,排查过程需要额外考虑更多环节。接下来…...
用uv管理python环境/项目(各种应用场景)
一、安装uv 有python的情况 pip install uvWindows powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"linux或macOS curl -LsSf https://astral.sh/uv/install.sh | sh二、换镜像源 uv不会读取pip的镜像源配置,所…...
Linux——进程(5)进程地址空间
先看一个程序和现象 预期现象是,子进程和父进程相互独立,子进程的gval是100,101,102....而父进程一直都是100. 结果我们并不意外,只是我们发现,父子进程的gval的地址是一样的,这有点颠覆我们的认…...
docker(1) -- centos镜像
1. 前言 我在WSL中运行的系统是ubuntu2024,并安装了docker,想要在docker中运行一个centos的系统。 2. 下载并运行镜像 # 下载centos最新版镜像 $ docker pull centos Using default tag: latest latest: Pulling from library/centos a1d0c7532777: P…...