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

【Oracle资源损坏类故障】:详细了解坏块

目录

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种修复手段;但当真在生产上遇到了坏块情况,仅凭这篇文章的描述,很难高效解决问题。这篇文章只是基础了解,想要高效解决坏块问题,除了基础以外,需要平时多做模拟演练,定期总结,才能在遇到坏块时,快速给出最完美的解决方案。

相关文章:

【Oracle资源损坏类故障】:详细了解坏块

目录 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…...

数据分析处理库-Pandas

1.1 Pandas概述 核心概念&#xff1a; Pandas 是基于 NumPy 的数据分析库&#xff0c;核心数据结构&#xff1a;Series&#xff08;一维&#xff09;和 DataFrame&#xff08;二维&#xff09;。 应用场景&#xff1a;数据清洗、转换、统计分析、时间序列处理。 特点&#x…...

阿里云平台Vue项目打包发布

目录&#xff1a; 1、vue项目打包2、通过ngixn发布vue的打包文件 1、vue项目打包 在你的vue项目下执行npm run build命令进行打包。 2、通过ngixn发布vue的打包文件 直接将打包的dist文件拷贝到nginx目录下即可。 修改nginx.conf的配置文件的相关配置&#xff0c;如端口或者ro…...

2025/03/19 Cursor使用方法(Java方向,适合Java后端把家从idea搬家到cursor)

Cursor介绍 官网:Cursor - The AI Code Editor 中文教程网:学习 Cursor &#xff0c;拥抱 AI 编程 | Cursor 101 Cursor 是一款专为程序员打造的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它结合了大语言模型的能力&#xff0c;旨在提高开发效率. 与传统的 IDE&…...

平台与架构:深度解析与开发实践

平台与架构&#xff1a;深度解析与开发实践 1. 什么是平台与架构&#xff1f; 平台&#xff08;Platform&#xff09;&#xff1a;指操作系统或运行环境&#xff0c;例如 linux、windows、darwin&#xff08;macOS&#xff09;、android 等。架构&#xff08;Architecture&…...

xss-labs第八、九关卡以及XSS GAME的Ok,Boomer关卡

第八关 靶场代码 <!DOCTYPE html><!--STATUS OK--><html> <head> <meta http-equiv"content-type" content"text/html;charsetutf-8"> <script> window.alert function() { confirm("完成的不错&#…...

electron框架(1.0)认识electron和基础创建

----什么是electron框架 中文网地址&#xff08;https://electronjs.p2hp.com/docs/latest/tutorial/quick-start&#xff09; ----electron流程模型 ----项目搭建 --起步&#xff08;需下载&#xff09;&#xff1a; node -v npm -v--创建初始文件&#xff1a; mkdir my-e…...

考OCP认证要交哪些费用?

考OCP认证要交哪些费用? 考OCP认证&#xff0c;指的是Oracle数据库管理员中级认证 Oracle Certified Professional&#xff0c;这是Oracle非常有名的一个认证&#xff0c;对于个人帮助巨大。 OCP认证要交不少钱&#xff0c;些费用因考试版本、培训机构和地区差异而有所不同&a…...

基于漂浮式海上风电场系统的浮式风力发电机matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于漂浮式海上风电场系统的浮式风力发电机matlab仿真&#xff0c;通过MATLAB数值仿真对浮式风力发电机的性能做模拟与仿真。 2.系统仿真结果 3.核心程序与模型 版本&#x…...

Jupyter Notebook 常用命令(自用)

最近有点忘记了一些常见命令&#xff0c;这里就记录一下&#xff0c;懒得找了。 文章目录 一、文件操作命令1. %cd 工作目录2. %pwd 显示路径3. !ls 列出文件4. !cp 复制文件5. !mv 移动或重命名6. !rm 删除 二、代码调试1. %time 时间2. %timeit 平均时长3. %debug 调试4. %ru…...

RabbitMQ 详细原理解析

RabbitMQ 是一个基于 AMQP&#xff08;Advanced Message Queuing Protocol&#xff09; 协议的开源消息代理中间件&#xff0c;广泛用于分布式系统中的异步通信、服务解耦、流量削峰等场景。其核心设计围绕生产者、消费者、队列、交换机和虚拟主机等组件&#xff0c;结合 AMQP …...

HTTP状态码全解析

1. 状态码分类 类别范围含义1xx100-199信息性&#xff1a;请求被接收&#xff0c;需进一步处理&#xff08;临时响应&#xff09;2xx200-299成功&#xff1a;请求被正确处理3xx300-399重定向&#xff1a;需后续操作完成请求&#xff08;如跳转到新URL&#xff09;4xx400-499客…...

从零实现本地文生图部署(Stable Diffusion)

1. 依赖安装 文件打包下载地址&#xff08;Stable Diffusion&#xff09; # git &#xff1a; 用于下载源码 https://git-scm.com/downloads/win # Python 作为基础编译环境 https://www.python.org/downloads/ # Nvidia 驱动&#xff0c;用于编译使用GPU显卡硬件 https://ww…...

手撕算法——链表

算法基础——链表-CSDN博客 一、排队顺序 题⽬来源&#xff1a;洛⾕ 题⽬链接&#xff1a;B3630 排队顺序 - 洛谷 难度系数&#xff1a;★ 1. 题目描述 2. 算法原理 本题相当于告诉了我们每⼀个点的后继&#xff0c;使⽤静态链表的存储⽅式能够很好的还原这个队列。 数组中 [1,…...

css-grid布局

文章目录 1、布局2、网格轨道3、间距Gap4、网格线5、网格别名 当一个 HTML 元素将 display 属性设置为 grid 或 inline-grid 后&#xff0c;它就变成了一个网格容器&#xff0c;这个元素的所有直系子元素将成为网格元素。 1、布局 启用grid布局类似与flex布局&#xff0c;不过g…...

1.企业级AD活动目录核心解析:架构、组件与集成实践

在当今数字化时代&#xff0c;企业级网络环境日益复杂&#xff0c;高效、安全的资源管理和用户认证成为企业 IT 运营的关键。AD&#xff08;Active Directory&#xff09;活动目录作为微软 Windows 系列服务器中的重要目录服务&#xff0c;为企业级网络管理提供了强大的解决方案…...

哈尔滨工业大学DeepSeek公开课人工智能:大模型原理 技术与应用-从GPT到DeepSeek|附视频下载方法

导 读INTRODUCTION 今天继续哈尔滨工业大学车万翔教授带来了一场主题为“DeepSeek 技术前沿与应用”的报告。 本报告深入探讨了大语言模型在自然语言处理&#xff08;NLP&#xff09;领域的核心地位及其发展历程&#xff0c;从基础概念出发&#xff0c;延伸至语言模型在机器翻…...

ChatGPT vs DeepSeek vs Copilot vs Claude:谁将问鼎AI王座?

李升伟 整理 2025年的人工智能领域创新涌动&#xff0c;ChatGPT、DeepSeek、Copilot和Claude四大模型各领风骚。这些AI系统各具特色&#xff0c;分别专注于编程、创意写作、技术推理和AI伦理等不同领域。本文将深入解析这些AI模型的功能特性及其优势领域。 核心AI模型解析 C…...

【嵌入式Linux】基于ArmLinux的智能垃圾分类系统项目

目录 1. 功能需求2. Python基础2.1 特点2.2 Python基础知识2.3 dict嵌套简单说明 3. C语言调用Python3.1 搭建编译环境3.2 直接调用python语句3.3 调用无参python函数3.4 调用有参python函数 4. 阿里云垃圾识别方案4.1 接入阿里云4.2 C语言调用阿里云Python接口 5. 香橙派使用摄…...

Vue3中router最佳封装落地

文章目录 前言一、拆分路由文件夹&#xff1f;二、main.ts中注册路由总结 前言 router在使用过程中如果我们直接在一个文件的一个数组中配置&#xff0c;最后路由越来越多会导致不易管理&#xff0c;我们可以将一个页面的路由配置在一个数组中最后统一导入&#xff0c;这样就会…...

[Linux] make自动化构建

目录 一.什么是make 二.Makefile结构 2.1 典型结构 2.2 变量 1. 普通变量&#xff08;User-Defined Variables&#xff09; 2. 自动变量&#xff08;Automatic Variables&#xff09; 3. 预定义变量&#xff08;Built-in Variables&#xff09; 4. 函数变量&#xff0…...

剑指 Offer II 113. 课程顺序

comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20113.%20%E8%AF%BE%E7%A8%8B%E9%A1%BA%E5%BA%8F/README.md 剑指 Offer II 113. 课程顺序 题目描述 现在总共有 numCourses 门课需要选&#xff0c;记为 0 到 n…...

蓝桥杯 小球反弹

问题描述 有一个长方形&#xff0c;长为 343720 单位长度&#xff0c;宽为 233333 单位长度。 在其内部左上角顶点有一小球&#xff08;无视其体积&#xff09;&#xff0c;其初速度方向如图所示&#xff0c;且保持运动速率不变。分解到长宽两个方向上的速率之比为&#xff1…...

Python 监听模式(Observer Pattern)

1. 监听模式技术方案 监听模式&#xff08;Observer Pattern&#xff09;是一种行为设计模式&#xff0c;允许对象&#xff08;称为“观察者”或“监听者”&#xff09;在另一个对象&#xff08;称为“被观察者”或“主题”&#xff09;的状态发生变化时接收通知。这种模式的核…...

蓝桥备赛(25)算法篇【差分】

一、差分 前缀和和差分的核心思想是预处理 &#xff0c; 可以在暴力枚举的过程中 &#xff0c; 快速给出查询结果 &#xff0c; 从而优化时间复杂度 。 最经典的用空间替换时间的做法。 学完差分之后 &#xff0c; 大家会发现 &#xff0c; 前缀和与差分是一对互逆的运算 二、一…...

Linux|fork命令及其使用的写时拷贝技术

fork复制进程 fork通过以下步骤来复制进程&#xff1a; 分配新的进程控制块&#xff1a;内核为新进程分配一个新的进程控制块&#xff08;PCB&#xff09;&#xff0c;用于存储进程的相关信息&#xff0c;如进程 ID、状态、寄存器值、内存指针等。复制进程地址空间&#xff1…...

sgpt 终端使用指南

1. 什么是 sgpt&#xff1f; sgpt 是一个基于 OpenAI API 的命令行工具&#xff0c;允许用户在终端中与 AI 进行交互&#xff0c;支持自然语言对话、代码生成、Shell 命令生成等功能。本文将介绍 sgpt 的安装方法、基本用法、配置文件路径及修改方式&#xff0c;并提供完整的配…...

python如何提取html中所有的图片链接

在Python中&#xff0c;你可以使用BeautifulSoup库来解析HTML内容&#xff0c;并提取其中所有的图片链接&#xff08;即<img>标签的src属性&#xff09;。以下是一个示例代码&#xff0c;展示了如何做到这一点&#xff1a; 首先&#xff0c;确保你已经安装了BeautifulSo…...

第十一章 | 智能合约主网部署与验证详解

&#x1f4da; 第十一章 | 智能合约主网部署与验证详解 ——让你的合约真正上线、公开、透明&#xff01; ✅ 本章导读 前面我们写了各种合约&#xff0c;ERC20、NFT、DAO…… 但只在本地测试或测试网上部署运行&#xff0c;项目还没“上链”&#xff01; 主网上线部署&#…...

一文读懂Python之json模块(33)

一、json模块介绍 json模块的功能是将序列化的json数据从文件里读取出来或者存入文件。json是一种轻量级的数据交换格式&#xff0c;在大部分语言中&#xff0c;它被理解为数组&#xff08;array&#xff09;。 json模块序列化与反序列化的过程分别是 encoding和 decoding。e…...

TextView、AppCompatTextView和MaterialTextView该用哪一个?Android UI 组件发展史与演进对照表

在 Android 开发中&#xff0c;UI 组件一直在不断演进&#xff0c;从最初的原生组件&#xff0c;到 Support Library&#xff08;AppCompat 兼容库&#xff09;&#xff0c;再到如今的 Material Design 组件。这篇文章将梳理 Android UI 组件的发展历史&#xff0c;并提供详细的…...

三层网络 (服务器1 和 服务器2 在不同网段)

服务器1 和 服务器2 在不同网段&#xff0c;并且通过三层交换机实现通信 1. 网络拓扑 假设网络拓扑如下&#xff1a; 服务器1&#xff1a; mac0&#xff1a;IP 地址 192.168.1.10/24&#xff0c;网关 192.168.1.1 mac1&#xff1a;IP 地址 10.0.1.10/24&#xff0c;网关 10.0…...

23种设计模式-创建型模式-工厂方法

文章目录 简介场景问题1. 直接依赖具体实现2. 违反开闭原则3. 条件分支泛滥4. 代码重复风险 解决根本问题完整类图完整代码说明核心优势代码优化静态配置表动态策略 总结 简介 工厂方法是一种创建型设计模式&#xff0c;它提供了在父类中创建对象的接口&#xff0c;但允许子类…...

el-table单元格编辑,动态增删行,回车/上下左右箭头切换单元格

🤵 作者:coderYYY 🧑 个人简介:前端程序媛,目前主攻web前端,后端辅助,其他技术知识也会偶尔分享🍀欢迎和我一起交流!🚀(评论和私信一般会回!!) 👉 个人专栏推荐:《前端项目教程以及代码》 基于 Element UI 实现表格单元格编辑与键盘导航功能 Element UI …...

基于springboot的新闻推荐系统(045)

摘要 随着信息互联网购物的飞速发展&#xff0c;国内放开了自媒体的政策&#xff0c;一般企业都开始开发属于自己内容分发平台的网站。本文介绍了新闻推荐系统的开发全过程。通过分析企业对于新闻推荐系统的需求&#xff0c;创建了一个计算机管理新闻推荐系统的方案。文章介绍了…...

解决Selenium滑动页面到指定元素,点击失效的问题

White graces&#xff1a;个人主页 &#x1f649;专栏推荐:Java入门知识&#x1f649; &#x1f439;今日诗词:君失臣兮龙为鱼&#xff0c;权归臣兮鼠变虎&#x1f439; ⛳️点赞 ☀️收藏⭐️关注&#x1f4ac;卑微小博主&#x1f64f; ⛳️点赞 ☀️收藏⭐️关注&#x1f4…...

医学图像白血病分割数据集labelme格式245张5类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;245 标注数量(json文件个数)&#xff1a;245 标注类别数&#xff1a;5 标注类别名称:["basophil Leukemia","Lymphocyte…...

深度学习Python编程:从入门到工程实践

第一章 Python语言概述与生态体系 1.3 Python在工业界的应用场景 # 示例:使用FastAPI构建RESTful接口 from fastapi import FastAPI from pydantic import BaseModelapp = FastAPI()class Item(BaseModel):name: strprice: float@app.post("/items/") async def cr…...

DHCPv6 Stateless Vs Stateful Vs Stateless Stateful

DHCPv6常见配置模式 在 IPv6 网络中,DHCPv6 的 Stateless(无状态)、Stateful(有状态) 和 Stateless + Stateful(混合模式) 是三种常见的配置模式。它们的主要区别在于客户端如何获取 IPv6 地址和其他网络配置信息(如 DNS 服务器)。 Stateless(无状态)模式 Statele…...

Redis Cluster 详解

Redis Cluster 详解 1. 为什么需要 Redis Cluster&#xff1f; Redis 作为一个高性能的内存数据库&#xff0c;在单机模式下可能会遇到以下问题&#xff1a; 单机容量受限&#xff1a;Redis 是基于内存存储的&#xff0c;单机的内存资源有限&#xff0c;单实例的 Redis 只能…...

Spring(8)——MyBatis入门(2)

一、Mybatis的xml配置文件 Mybatis的开发有两种方式&#xff1a; 注解xml 上一篇博客介绍了用注解的方式操作数据库&#xff0c;这一篇介绍通过xml配置文件的方式操作数据库。 1.1 xml配置文件规则 在Mybatis中使用XML映射文件方式开发&#xff0c;需要符合一定的规范&…...

解析DeepSeek的技术内核:混合专家架构如何重塑AI效能

解析DeepSeek的技术内核&#xff1a;混合专家架构如何重塑AI效能 在当今大型语言模型&#xff08;LLM&#xff09;竞争激烈的赛道上&#xff0c;中国AI企业DeepSeek凭借其独特的技术路线脱颖而出。其核心优势之一&#xff0c;便是对混合专家&#xff08;Mixture of Experts&…...

Android在kts中简单使用AIDL

Android在kts中简单使用AIDL AIDL相信做Android都有所了解&#xff0c;跨进程通信会经常使用&#xff0c;这里就不展开讲解原理跨进程通信的方式了&#xff0c;最近项目换成kts的方式&#xff0c;于是把aidl也换成了统一的方式&#xff0c;其中遇到了很多问题&#xff0c;这里…...

【C++】类和对象(匿名对象)

匿名对象 用 类型(实参) 定义出来的对象叫做匿名对象&#xff0c;相比之前我们定义的 类型 对象名(实参) 定义出来叫有名对象匿名对象生命周期只在当前一行&#xff0c;一般临时定义一个对象当前用一下即可&#xff0c;就可以定义匿名对象。 class A { public:A(int a 0):_a…...

Spring boot 3.4 后 SDK 升级,暨 UI API/MCP 计划

PS 写这篇文章后看到 A Deep Dive Into MCP and the Future of AI Tooling | Andreessen HorowitzWe explore what MCP is, how it changes the way AI interacts with tools, what developers are already building, and the challenges that still need solving. https://a1…...

使用Helm安装、 升级、 回滚Kubernetes应用

前言 在我之前做的项目里&#xff0c;我们对Microk8s微服务的更新是通过自制tar包的方式做的, tar包存储了镜像和YAML文件。 每次升级时&#xff0c;我们需要先删除所有的YAML资源&#xff0c;然后重新创建新的资源。 这种方式存在以下问题&#xff1a; 服务中断&#xff1a;…...

Text-to-SQL将自然语言转换为数据库查询语句

有关Text-To-SQL方法&#xff0c;可以查阅我的另一篇文章&#xff0c;Text-to-SQL方法研究 直接与数据库对话-text2sql Text2sql就是把文本转换为sql语言&#xff0c;这段时间公司有这方面的需求&#xff0c;调研了一下市面上text2sql的方法&#xff0c;比如阿里的Chat2DB,麻…...

gin学习

gin学习笔记&#xff0c;不仅包含了基本的增删查改外&#xff0c;还包括参数传递&#xff0c;上传下载&#xff0c;模版、session与中间件等&#xff0c;方便收藏自习可用 文章目录 获得个请求get打印字符串get请求xmlget请求跳转http方法路由可以通过Context的Param方法来获取…...

【HarmonyOS NEXT】关键资产存储开发案例

在 iOS 开发中 Keychain 是一个非常安全的存储系统&#xff0c;用于保存敏感信息&#xff0c;如密码、证书、密钥等。与文件系统不同&#xff0c;Keychain 提供了更高的安全性&#xff0c;因为它对数据进行了加密&#xff0c;并且只有经过授权的应用程序才能访问存储的数据。那…...

高德终端技术总结:高可用架构如何练成?

前言 高德地图作为国民级应用&#xff0c;特别是出行场景的独特性&#xff0c;要确保在线导航高并发和交通安全级的超稳定性&#xff0c;这对技术团队提出异乎寻常的高要求&#xff0c;无论是终端、云端&#xff0c;还是“终端-云端”之间的连接&#xff0c;都必须实现“高可用…...