Oracle特殊恢复:异常掉电导致的ORA-600 [kfrValAcd30]故障处理

devtools/2024/9/19 0:47:05/ 标签: 程序人生, oracle, 数据库, 后端

一、 问题描述

现象:硬件掉电后,oracle集群无法启动。

[root@rac2 ~]# crsctl stat res -t
CRS-4535: Cannot communicate with Cluster Ready Services
CRS-4000: Command Status failed, or completed with errors.
[root@rac2 ~]# crsctl start crs
CRS-4640: Oracle High Availability Services is already active
CRS-4000: Command Start failed, or completed with errors.

二、 故障处理

查看集群组件发现ora.asm状态为offline

root@rac2 ~]# crsctl stat res -t -init
--------------------------------------------------------------------------------
NAME           TARGET  STATE        SERVER                   STATE_DETAILS       
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.asm1        ONLINE  OFFLINE                               Instance Shutdown   
ora.cluster_interconnect.haip1        ONLINE  ONLINE       rac2                                         
ora.crf1        ONLINE  ONLINE       rac2                                         
ora.crsd1        ONLINE  OFFLINE                                                   
ora.cssd1        ONLINE  ONLINE       rac2                                         
ora.cssdmonitor1        ONLINE  ONLINE       rac2                                         
ora.ctssd1        ONLINE  ONLINE       rac2                     OBSERVER            
ora.diskmon1        OFFLINE OFFLINE                                                   
ora.drivers.acfs1        ONLINE  ONLINE       rac2                                         
ora.evmd1        ONLINE  INTERMEDIATE rac2                                         
ora.gipcd1        ONLINE  ONLINE       rac2                                         
ora.gpnpd1        ONLINE  ONLINE       rac2                                         
ora.mdnsd1        ONLINE  ONLINE       rac2                                         

查看grid alert日志发现磁盘组没有mount

[ohasd(4329)]CRS-2769:Unable to failover resource 'ora.diskmon'.
2018-05-08 04:12:24.940:
[cssd(4576)]CRS-1707:Lease acquisition for node rac2 number 2 completed
2018-05-08 04:12:26.188:
[cssd(4576)]CRS-1605:CSSD voting file is online: /dev/asmdisk/oraasm-OCR_0000; details in /u01/app/11.2.0/grid/log/rac2/cssd/ocssd.log.
2018-05-08 04:12:28.723:
[cssd(4576)]CRS-1601:CSSD Reconfiguration complete. Active nodes are rac1 rac2 .
2018-05-08 04:12:30.617:
[ctssd(4660)]CRS-2401:The Cluster Time Synchronization Service started on host rac2.
2018-05-08 04:12:30.617:
[ctssd(4660)]CRS-2407:The new Cluster Time Synchronization Service reference node is host rac1.
2018-05-08 04:12:32.348:
[ohasd(4329)]CRS-2767:Resource state recovery not attempted for 'ora.diskmon' as its target state is OFFLINE
2018-05-08 04:12:32.348:
[ohasd(4329)]CRS-2769:Unable to failover resource 'ora.diskmon'.

查看asm_alert,出现ORA-00600 [kfrValAcd30]的报错

NOTE: GMON heartbeating for grp 2
GMON querying group 2 at 6 for pid 23, osid 5727
NOTE: cache opening disk 0 of grp 2: DATA_0000 path:/dev/asmdisk/oraasm-ASM_0000
NOTE: F1X0 found on disk 0 au 2 fcn 0.0
NOTE: cache opening disk 1 of grp 2: DATA_0001 path:/dev/asmdisk/oraasm-ASM_0001
NOTE: F1X0 found on disk 1 au 2 fcn 0.0
NOTE: cache opening disk 2 of grp 2: DATA_0002 path:/dev/asmdisk/oraasm-ASM_0002
NOTE: F1X0 found on disk 2 au 2 fcn 0.0
NOTE: cache opening disk 3 of grp 2: DATA_0003 path:/dev/asmdisk/oraasm-ASM_0003
NOTE: cache mounting (first) normal redundancy group 2/0x877A96CD (DATA)
* allocate domain 2, invalid = TRUE
NOTE: attached to recovery domain 2
NOTE: starting recovery of thread=1 ckpt=8.390 group=2 (DATA)
Errors in file /u01/app/grid/diag/asm/+asm/+ASM2/trace/+ASM2_ora_5727.trc  (incident=50111):
ORA-00600: internal error code, arguments: [kfrValAcd30], [DATA], [1], [8], [390], [9], [390], [], [], [], [], []
ORA-15017: diskgroup "ASM" cannot be mounted
ORA-15063: ASM discovered an insufficient number of disks for diskgroup "ASM"
Incident details in: /u01/app/grid/diag/asm/+asm/+ASM2/incident/incdir_50111/+ASM2_ora_5727_i50111.trc
Use ADRCI or Support Workbench to package the incident.
See Note 411.1 at My Oracle Support for error and packaging details.
Errors in file /u01/app/grid/diag/asm/+asm/+ASM2/trace/+ASM2_ora_5727.trc:
ORA-00600: internal error code, arguments: [kfrValAcd30], [DATA], [1], [8], [390], [9], [390], [], [], [], [], []
ORA-15017: diskgroup "ASM" cannot be mounted
ORA-15063: ASM discovered an insufficient number of disks for diskgroup "ASM"
Abort recovery for domain 2
NOTE: crash recovery signalled OER-600
ERROR: ORA-600 signalled during mount of diskgroup DATA
NOTE: cache dismounting (clean) group 2/0x877A96CD (DATA)
NOTE: messaging CKPT to quiesce pins Unix process pid: 5727, image: oracle@rac2 (TNS V1-V3)

查看ASM2_ora_5727_i50111.trc

kfdp_query(DATA): 6
----- Abridged Call Stack Trace -----
ksedsts()+465<-kfdp_query()+530<-kfdPstSyncPriv()+585<-kfgFinalizeMount()+1630<-kfgscFinalize()+1433<-kfgForEachKfgsc()+285<-kfgsoFinalize()+135<-kfgFinalize()+398<-kfxdrvMount()+5558<-kfxdrvEntry()+2207<-opiexe()+20624<-opiosq0()+3932<-kpooprx()+274<-kpoal8()+842
<-opiodr()+917<-ttcpip()+2183<-opitsk()+1710<-opiino()+969<-opiodr()+917<-opidrv()+570<-sou2o()+103<-opimai_real()+133<-ssthrdmain()+265<-main()+201<-__libc_start_main()+253
----- End of Abridged Call Stack Trace -----
2018-05-17 21:54:44.321623 : Start recovery for domain=2, valid=0, flags=0x4
NOTE: starting recovery of thread=1 ckpt=8.390 group=2 (DATA)
Incident 50111 created, dump file: /u01/app/grid/diag/asm/+asm/+ASM2/incident/incdir_50111/+ASM2_ora_5727_i50111.trc
ORA-00600: internal error code, arguments: [kfrValAcd30], [DATA], [1], [8], [390], [9], [390], [], [], [], [], []
ORA-15017: diskgroup "ASM" cannot be mounted
ORA-15063: ASM discovered an insufficient number of disks for diskgroup "ASM"recovery of group DATA failed due to the following error(s):
ORA-00600: internal error code, arguments: [kfrValAcd30], [DATA], [1], [8], [390], [9], [390], [], [], [], [], []
ORA-15017: diskgroup "ASM" cannot be mounted
ORA-15063: ASM discovered an insufficient number of disks for diskgroup "ASM"
2018-05-17 21:54:45.016907 : Abort recovery for domain 2, flags = 0x4
2018-05-17 21:54:45.017799 : kjb_abort_recovery: domain flags=0x0, valid=0
NOTE: messaging CKPT to quiesce pins Unix process pid: 5727, image: oracle@rac2 (TNS V1-V3)
kfdp_dismount(): 7
----- Abridged Call Stack Trace -----
ksedsts()+465<-kfdp_dismountInt()+389<-kfdp_dismount()+11<-kfgTermCache()+347<-kfgRecoverDismount()+373<-kfgRecoverMount()+277<-kfgscDelete()+2742<-kssdel()+155<-kfgscFinalize()+1211<-kfgForEachKfgsc()+285<-kfgsoFinalize()+135<-kfgFinalize()+398<-kfxdrvMount()+5558
<-kfxdrvEntry()+2207<-opiexe()+20624<-opiosq0()+3932<-kpooprx()+274<-kpoal8()+842<-opiodr()+917<-ttcpip()+2183<-opitsk()+1710<-opiino()+969<-opiodr()+917<-opidrv()+570<-sou2o()+103<-opimai_real()+133<-ssthrdmain()+265<-main()+201<-__libc_start_main()+253
----- End of Abridged Call Stack Trace -----
ASM name of disk 0x9f1d9488 (2:0:DATA_0000:/dev/asmdisk/oraasm-ASM_0000) is being cleared
ASM name of disk 0x9f1d9808 (2:1:DATA_0001:/dev/asmdisk/oraasm-ASM_0001) is being cleared
ASM name of disk 0x9f1d9108 (2:2:DATA_0002:/dev/asmdisk/oraasm-ASM_0002) is being cleared
ASM name of disk 0x9f1d8d88 (2:3:DATA_0003:/dev/asmdisk/oraasm-ASM_0003) is being cleared
NOTE: messaging CKPT to quiesce pins Unix process pid: 5727, image: oracle@rac2 (TNS V1-V3)
kfdp_dismount(): 8
----- Abridged Call Stack Trace -----
ksedsts()+465<-kfdp_dismountInt()+389<-kfdp_dismount()+11<-kfgTermCache()+347<-kfgRecoverDismount()+373<-kfgRecoverMount()+277<-kfgscDelete()+2742<-kssdct()+258<-kfgsoDelete()+721<-kssdel()+155<-kssdch()+6849<-ksures()+52<-opiosq0()+4721<-kpooprx()+274<-kpoal8()+842
<-opiodr()+917<-ttcpip()+2183<-opitsk()+1710<-opiino()+969<-opiodr()+917<-opidrv()+570<-sou2o()+103<-opimai_real()+133<-ssthrdmain()+265<-main()+201<-__libc_start_main()+253
----- End of Abridged Call Stack Trace -----

搜索mos也发现了几个Bug:

Bug 27288230 - ORA-600: [kfrvalacd30] in ASM SMON (Doc ID 27288230.8)	
Bug 19064132 : ORA-600 [KFRVALACD30] MOUNTING DISKGROUP AFTER RESTARTING SERVERS
ORA-600 [KFRVALACD30] in ASM (Doc ID 2123013.1)
bug在11.2.0.1/11.2.0.3/112.0.4/12.1/18.1 都存在。

Oracle认为这是存储或者OS问题导致asm acd block的元数据不一致了
可能导致ASM元数据的主辅扩展区都发生损坏。这个损坏会导致rebalance挂起或不断尝试失败,或者阻止磁盘组被挂载。

strace出现ORA 600 [kfrValAcd30]报错,但没发现其他可用的信息

write(25, "string_value", 12)           = 12
write(25, ">", 1)                       = 1
write(25, "ORA 600 [kfrValAcd30]", 21)  = 21
write(25, "</", 2)                      = 2
write(25, "string_value", 12)           = 12
write(25, ">", 1)                       = 1
write(25, "</", 2)                      = 2
write(25, "pkey_dbgristih", 14)         = 14
write(25, ">", 1)                       = 1
write(25, "\n", 1)                      = 1
write(25, "<", 1)                       = 1
write(25, "creatm_dbgristih", 16)       = 16
write(25, ">", 1)                       = 1
write(25, "<", 1)                       = 1
write(25, "time", 4)                    = 4
write(25, ">", 1)                       = 1

ASM的Active Change Directory(ACD)简单来说就相当于asm元数据重做记录,需要说明的是,每一个asm实例,都用有其自己的ACD目录,也就说,如果你是双节点的rac,那么就有84m的ACD 目录信息。
ACD主要是记录了这样一些数据:线程号,block号,opcode,sequences,记录长度等信息。
当处于运行的asm实例,突然crash后,那么重启asm实例以后,asm可以根据ACD信息去进行”instance recover”,从而保证能够正常启动asm实例。
如果acd的信息出现损坏,磁盘组将不能够被mount。

使用kfed来读取元数据,首先定位到active change directory 所在AU

[grid@rac2 ~]$  kfed read  /dev/dm-0  aun=2 blkn=3|grep .xptr.au |head -1
kfffde[0].xptr.au:                    4 ; 0x4a0: 0x00000004

从上面信息可以看出,ACD元数据和数据应该包含在其中一个AU 4

查看au 4的信息

grid@rac2 ~]$  kfed read /dev/dm-0 aun=4 blkn=1|more
kfbh.endian:                          1 ; 0x000: 0x01
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                            8 ; 0x002: KFBTYP_CHNGDIR
kfbh.datfmt:                          1 ; 0x003: 0x01
kfbh.block.blk:                       1 ; 0x004: blk=1
kfbh.block.obj:                       3 ; 0x008: file=3
kfbh.check:                    17400326 ; 0x00c: 0x01098206
kfbh.fcn.base:                        0 ; 0x010: 0x00000000
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000
kfbh.spare2:                          0 ; 0x01c: 0x00000000
kfracdb.aba.seq:                      2 ; 0x000: 0x00000002
kfracdb.aba.blk:                      0 ; 0x004: 0x00000000
kfracdb.ents:                         2 ; 0x008: 0x0002
kfracdb.ub2spare:                     0 ; 0x00a: 0x0000
kfracdb.lge[0].valid:                 1 ; 0x00c: V=1 B=0 M=0
kfracdb.lge[0].chgCount:              1 ; 0x00d: 0x01
kfracdb.lge[0].len:                  52 ; 0x00e: 0x0034
kfracdb.lge[0].kfcn.base:             1 ; 0x010: 0x00000001
kfracdb.lge[0].kfcn.wrap:             0 ; 0x014: 0x00000000
kfracdb.lge[0].bcd[0].kfbl.blk:       0 ; 0x018: blk=0
kfracdb.lge[0].bcd[0].kfbl.obj:       4 ; 0x01c: file=4
kfracdb.lge[0].bcd[0].kfcn.base:      0 ; 0x020: 0x00000000
kfracdb.lge[0].bcd[0].kfcn.wrap:      0 ; 0x024: 0x00000000
kfracdb.lge[0].bcd[0].oplen:          4 ; 0x028: 0x0004  ---表示长度,类似logfile dump的LEN
kfracdb.lge[0].bcd[0].blkIndex:       0 ; 0x02a: 0x0000
kfracdb.lge[0].bcd[0].flags:         28 ; 0x02c: F=0 N=0 F=1 L=1 V=1 A=0 C=0
kfracdb.lge[0].bcd[0].opcode:       212 ; 0x02e: 0x00d4  --opcode,类似数据库实例中的update/delete/insert操作的opcode编号
kfracdb.lge[0].bcd[0].kfbtyp:         9 ; 0x030: KFBTYP_COD_BGO  --操作类型,类似数据库实例中的update/delete/insert等类型
kfracdb.lge[0].bcd[0].redund:        17 ; 0x031: SCHE=0x1 NUMB=0x1  --这里表示冗余级别,17是unport,18是mirror,19表示high
kfracdb.lge[0].bcd[0].pad:        63903 ; 0x032: 0xf99f
kfracdb.lge[0].bcd[0].KFRCOD_CRASH:   1 ; 0x034: 0x00000001
kfracdb.lge[0].bcd[0].au[0]:         46 ; 0x038: 0x0000002e
kfracdb.lge[0].bcd[0].disks[0]:       0 ; 0x03c: 0x0000
kfracdb.lge[1].valid:                 1 ; 0x040: V=1 B=0 M=0
kfracdb.lge[1].chgCount:              1 ; 0x041: 0x01

check等信息属于hash值,每隔3s都会更新一次,可能是由于突然掉电,cache里的信息没有更新到磁盘中导致。

[grid@rac2 ~]$  kfed read /dev/dm-2 aun=4 blkn=0|grep ckpt
kfracdc.ckpt.seq:                     8 ; 0x018: 0x00000008
kfracdc.ckpt.blk:                   390 ; 0x01c: 0x00000186
[grid@rac2 ~]$  kfed read /dev/dm-0 aun=4 blkn=0|grep ckpt
kfracdc.ckpt.seq:                    70 ; 0x018: 0x00000046
kfracdc.ckpt.blk:                   255 ; 0x01c: 0x000000f

三、 问题解决

通过kfed merge手工修改的方法恢复

kfed read /dev/dm-2 aun=4 blkn=0 >acd.txt
kfed merge /dev/dm-2 aun=4 blkn=0  text=acd.txt

手工mount磁盘组

SQL>  alter diskgroup data mount;alter diskgroup data mount
*
ERROR at line 1:
ORA-00600: internal error code, arguments: [kfrValAcd30], [DATA], [1], [8],
[390], [9], [390], [], [], [], [], []SQL> alter diskgroup data mount;
Diskgroup altered.

如果kfed merge无法修复,请及时联系,以通过odu对asm底层进行恢复数据文件,从而最大限度恢复数据.

作者介绍:云和恩墨资深Oracle dba,专注于数据库运维、架构和行业发展,有12年左右的金融、保险、政府、地税、运营商等业务关键型系统的运维经验,曾担任公司异常恢复东区接口人,负责紧急异常恢复工作,技术二线专家。目前负责PG、openGauss/MogDB运维、国产化MogDB数据库的推广工作。


http://www.ppmy.cn/devtools/13111.html

相关文章

【大数据】LSM树,专为海量数据读写而生的数据结构

目录 1.什么是LSM树&#xff1f; 2.LSM树的落地实现 1.什么是LSM树&#xff1f; LSM树&#xff08;Log-Structured Merge Tree&#xff09;是一种专门针对大量写操作做了优化的数据存储结构&#xff0c;尤其适用于现代大规模数据处理系统&#xff0c;如NoSQL数据库&#xff…

《从零开始的Java世界》11网络编程

《从零开始的Java世界》系列主要讲解Javase部分&#xff0c;从最简单的程序设计到面向对象编程&#xff0c;再到异常处理、常用API的使用&#xff0c;最后到注解、反射&#xff0c;涵盖Java基础所需的所有知识点。学习者应该从学会如何使用&#xff0c;到知道其实现原理全方位式…

JUC与多线程基础详解

什么是JUC? JUC(Java Util Concurrent)是 Java 5 以后新增的一组并发编程工具包,提供了一系列高效、线程安全的并发集合,方便在多线程环境下处理共享数据。 JUC其实就是JDK中的三个包: java.util.concurrent 并发相关的 java.util.concurrent.atomic 原子性 java.util.c…

搜索+剪枝,LeetCode 216. 组合总和 III

目录 一、题目 1、题目描述 2、接口描述 python3 cpp 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 python3 cpp 一、题目 1、题目描述 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多…

蓝桥杯:日期问题(我的绝望题)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;每日一练 &#x1f337;追光的人&#xff0c;终会万丈光芒 目录 前言&#xff1a; &#x1f337;1.问题描述&#xff1a; 1.问题描述&#xff1a; 2.输入格式&#xff1a; 3.输出格式&#…

【库函数】Linux下动态库.so和静态库.a的生成和使用

目录 &#x1f31e;1. Linux下静态库和动态库的基本概念 &#x1f31e;2. 动态库 &#x1f30a;2.1 动态库如何生成 &#x1f30d;2.1.1 文件详情 &#x1f30d;2.1.2 编译生成动态库 &#x1f30a;2.2 动态库如何使用 &#x1f30d;2.2.1 案例 &#x1f30d;2.2.2 动态…

智能指针、单件模式、函数式编程、c/c++

智能指针的由来&#xff0c;是因为对对象指针的控制&#xff0c;除了问题。当一个对象有多个指针链接的时候&#xff0c;谁来delete 这个对象就成了问题。这种对象和指针的关系应是这样的。当第一个使用这个指针的时候&#xff0c;我们创建这个对象&#xff0c;那么什么时候删除…

<计算机网络自顶向下> 面向连接的传输:TCP

目录 TCP: 概述 TCP报文段结构 TCP往返延时&#xff08;RTT&#xff09;和超时 可靠数据传输 快速重传 流量控制 连接管理 TCP: 概述 点对点 一个发送方&#xff0c;一个接收方可靠的、按顺序的字节流 不出错&#xff0c;不重复&#xff0c;不丢失&#xff0c;不失序没有报…

MySQL-数据库基础

一、背景与基本使用 首先是登录方式&#xff0c;一般用 mysql -h 127.0.0.1 -P 3306 -u root -p mysql也是一种网络服务。 当然我们在本地登录时可以省去主机ip和端口号。 -h表示我们要登录mysql在哪个ip的主机上&#xff0c; -P表示端口号。 -u表示以谁的身份去登录。…

深圳南玻集团(二面)

不得不说这家公司的办事效率是真的高。我昨天下午3点面试的&#xff0c;4点结束。然后4点45分就跟我说面试通过了&#xff0c;叫我明天早上10点进行二面。二面聊了大概20分钟左右吧&#xff0c;那个面试官是信息部的&#xff0c;好像是个总监还是总经理&#xff0c;反正叫沈总。…

INSTALL_FAILED_USER_RESTRICTED:解决黑鲨/小米手机wifi debug安装apk时AS报错

android studio 信息如下: Android Studio Iguana | 2023.2.1 Build #AI-232.10227.8.2321.11479570, built on February 22, 2024 Runtime version: 17.0.107-b1000.50 amd64 VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o. Windows 10.0 GC: G1 Young Generation, G1 Ol…

JS打包工具 Vite

Vite是 JS 新一代的打包的工具&#xff0c;它所解决的问题&#xff0c;是前端打包慢的问题&#xff0c;随着前端应用复杂度越来越大&#xff0c;项目文件越来越多&#xff0c;通常项目中都是使用 Webpack 进行打包&#xff0c;Webpack是个静态的打包工具&#xff0c;每次改动都…

Windows下Git的使用

目录 一、克隆远程仓库到本地二、git的三板斧2.1 add-将代码添加到本地仓库2.2 commit-提交代码到本地仓库2.3 push-推送本次添加操作到远程仓库2.4 gitee只有三板斧吗&#xff1f; 三、推送后没有出现绿点四、push到远程时报错五、git图形化界面下载链接 一、克隆远程仓库到本…

LORA详解(史上最全)

LoRA 模型 LoRA模型&#xff0c;全称Low-Rank Adaptation of Large Language Models&#xff0c;是一种用于微调大型语言模型的低秩适应技术。它最初应用于NLP领域&#xff0c;特别是用于微调GPT-3等模型。LoRA通过仅训练低秩矩阵&#xff0c;然后将这些参数注入到原始模…

互联网轻量级框架整合之MyBatis动态SQL

MyBatis的动态SQL是一项强大且实用的功能&#xff0c;它允许开发者在XML映射文件中编写可灵活变化的SQL语句&#xff0c;这些语句能够根据传入参数的条件或值动态地调整其结构和内容。这样&#xff0c;程序可以在运行时生成适应特定业务场景的SQL&#xff0c;避免了手动拼接SQL…

js生成不同的阅读数分配到每一篇上面,不会因为刷新而变动

js生成不同的阅读数分配到每一篇上面,不会因为刷新而变动 {%- for article in blog.articles -%}<div class"blog-articles__article article">{%- render article-card,article: article,media_height: section.settings.image_height,media_aspect_ratio: a…

企业级开源版本管理系统GIT分析

作者:私语茶馆 1.开源版本管理各种易混淆概念 开源版本软件管理存在Git、GitHub、TortoiseGit等各种概念容易混淆,本文讲解这些系统的概念、用途和范围,以及如何基于开源软件搭建版本管理系统。GIT密切相关的几个软件概念和解释如下: gitHub:全球最大的代码托管和写作平台…

数字化转型安全运维:构建稳健的网络安全防线

数字化转型安全运维&#xff1a;构建稳健的网络安全防线 随着信息技术的迅猛发展&#xff0c;数字化转型已成为企业提升竞争力、实现创新发展的关键路径。然而&#xff0c;数字化转型过程中面临着诸多安全挑战&#xff0c;如何确保安全运维成为企业亟需解决的问题。本文将探讨…

Netty:介绍

文章目录 一、Netty介绍二、Netty简要体系图三、Netty的应用场景 一、Netty介绍 Netty是由JBOSS提供的一个Java开源框架&#xff0c;现为Github上的独立项目。它提供异步的、事件驱动的网络应用程序框架和工具&#xff0c;用于快速开发高性能、高可靠性的网络服务器和客户端程…

力扣HOT100 - 94. 二叉树的中序遍历

解题思路&#xff1a; 递归 class Solution {List<Integer> list new ArrayList<>();public List<Integer> inorderTraversal(TreeNode root) {recur(root);return list;}public void recur(TreeNode root) {if (root null) return;recur(root.left);lis…