热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

经典故障:四个雷,3*2*2*3种随机方法的特殊恢复案例

前言最近我们公司恢复大牛翔宇哥给我们精心准备了个故障,埋了四个雷,整个恢复过程感觉像是过山车,起起伏伏,觉得很有意思。跟翔
前言

最近我们公司恢复大牛翔宇哥给我们精心准备了个故障,埋了四个雷,整个恢复过程感觉像是过山车,起起伏伏,觉得很有意思。跟翔宇哥和roger老板学了点皮毛,文章中有描述不太清楚的地方,还请各位看官多多担待。今天把记录总结出来,供大家分享。

恢复文件

就给一个压缩的system,起库。
image.png
image.png

恢复过程

首先,获取system文件的字符集,数据库名,然后创建参数文件,重建控制文件,这里就不过多介绍,话不多说,先尝试启动数据库。

第一个雷

SQL> startup nomount pfile='/gauss/init.ora'; ORACLE instance started. Total System Global Area 396668928 bytes Fixed Size 2253624 bytes Variable Size 125832392 bytes Database Buffers 264241152 bytes Redo Buffers 4341760 bytes SQL> @cf Control file created. ORA-00279: change 4936537 generated at 04/21/2020 00:03:57 needed for thread 1 ORA-00289: suggestion : /guass/app/oracle/product/11.2.0/db_1/dbs/arch1_41_1033397865.dbf ORA-00280: change 4936537 for thread 1 is in sequence #41 Specify log: {=suggested | filename | AUTO | CANCEL} cancel Media recovery cancelled. SQL> alter database open resetlogs; alter database open resetlogs * ERROR at line 1: ORA-01092: ORACLE instance terminated. Disconnection forced ORA-00704: bootstrap process failure ORA-00704: bootstrap process failure ORA-00604: error occurred at recursive SQL level 1 ORA-01578: ORACLE data block corrupted (file # 1, block # 338)--坏块 ORA-01110: data file 1: '/gauss/system.dbf' Process ID: 32245 Session ID: 1 Serial number: 3

数据启动报file 1, block 338存在坏块的错误,我们来查一下这个块对应的对象。

TABLESPACE_NAME SEGMENT_TYPE OWNER SEGMENT_NAME ------------------ --------------- ------------- -------------- SYSTEM INDEX SYS I_OBJ1

这个对象是I_OBJ1,I_OBJ1是什么?

SQL> select * from bootstrap$ where SQL_TEXT like '%I_OBJ1%' order by LINE#; LINE# OBJ# SQL_TEXT ---------- ---------- -------------------------------------------------------------------------------- 36 36 CREATE UNIQUE INDEX I_OBJ1 ON OBJ$(OBJ#,OWNER#,TYPE#) PCTFREE 10 INITRANS 2 MAXT RANS 255 STORAGE ( INITIAL 64K NEXT 1024K MINEXTENTS 1 MAXEXTENTS 2147483645 PC TINCREASE 0 OBJNO 36 EXTENTS (FILE 1 BLOCK 336))

I_OBJ1是核心基表OBJ$的一个索引&#xff0c;当普通的索引出现坏块&#xff0c;我们可以通过重建去处理&#xff0c;但是OBJ#<59 的索引出现坏块&#xff0c;是不能够通过rebuild的方式处理。数据库open的情况下可以通过swap的方式处理&#xff0c;不过这里我们数据库都没打开。

首先我们先来介绍下数据库启动的过程&#xff1a;

1、在system 表空间的第一个数据文件的特定偏移位置&#xff0c;找到root dba变量 2、root dba变量的值就是指向sys.bootstrap$表的物理位置的指针 3、sys.bootstrap$表中记录了数据库基础字典表的物理位置 4、基础字典表内记录了用户段段头的物理存储位置 下一步就是要通过某个段的segment header block从数据文件中直接读出表的数据。 在sys.bootstrap$表中记录的数据字典表的create语句&#xff0c;还有一部分是没有直接指定存储位置的&#xff0c;比如簇成员。

那么怎么去爬过第一个雷&#xff1f;这里有两个方案&#xff1a;

  1. 方法一
    最简单的方法就是通过bbed cp同平台同版本的相同块去覆盖。

BBED> copy file 6 block 338 to file 1 block 338

但是如果I_OBJ1存在大量的坏块情况下&#xff0c;cp的效率比较低。

  1. 方法二
    删除I_OBJ1&#xff0c;但是我们这里不是删除IND$里的I_OBJ1索引&#xff0c;再次重启的时候又创建了&#xff0c;这里我们需要删除sys.bootstrap里的索引。

BBED> x /rnnc *kdbr[1] rowdata[3681] &#64;7322 ------------- flag&#64;7322: 0x2c (KDRHFL, KDRHFF, KDRHFH) lock&#64;7323: 0x01 cols&#64;7324: 3 col 0[2] &#64;7325: 36 col 1[2] &#64;7328: 36 col 2[208] &#64;7331: CREATE UNIQUE INDEX I_OBJ1 ON OBJ$(OBJ#,OWNER#,TYPE#) P CTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE ( INITIAL 64K NEXT 1024K MINEXTE NTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 OBJNO 36 EXTENTS (FILE 1 BLOCK 33 6)) BBED> assign /x offset 7322 &#61;0x3c --删除索引 ub1 rowdata[0] &#64;7322 0x3c BBED> x /rnnc dba 1,523 *kdbr[1] rowdata[3681] &#64;7322 ------------- flag&#64;7322: 0x3c (KDRHFL, KDRHFF, KDRHFD, KDRHFH) lock&#64;7323: 0x01 cols&#64;7324: 0 --已经删除 BBED> sum apply Check value for File 1, Block 523: current &#61; 0x7e06, required &#61; 0x7e06

  1. 方法三

[ora11&#64;zdata bin]$ strings $ORACLE_HOME/bin/oracle |wc -l 1341571

11.2.0.4的执行文件包含1341571个函数&#xff0c;可以通过修改oracle执行文件指定&#xff0c;绕过索引I_OBJ1来处理。

第二个雷

通过上面两种方式排了第一个雷&#xff0c;我们顺利到达第二关。赶紧尝试打开&#xff0c;看看又会报什么错。

SQL> oradebug event 10046 trace name context forever,level 12; Statement processed. SQL> alter database open resetlogs; alter database open resetlogs * ERROR at line 1: ORA-01092: ORACLE instance terminated. Disconnection forced ORA-00704: bootstrap process failure ORA-00704: bootstrap process failure ORA-00604: error occurred at recursive SQL level 1 ORA-01555: snapshot too old: rollback segment number 27 with name "$" too small Process ID: 17397 Session ID: 1 Serial number: 5

ORA-01555快照过旧的报错&#xff0c;这个故障熟悉又陌生&#xff0c;尝试去推荐推进低位的scn&#xff0c;发现并没有效果&#xff0c;看来这个雷埋的还是很深的。
当oracle读取一个块&#xff0c;是否需要undo来完成一致性读&#xff0c;有很多种情况&#xff1a;
1.itl有活动事务&#xff0c;回查undo段头发现事务确实是活动状态&#xff0c;那么肯定要undo来做一致性读
2.itl有活动事务&#xff0c;回查undo段头发现事务已经提交或者回滚&#xff0c;那么需要做块清除来确定commit scn&#xff0c;如果query scn 3.itl事务已经提交 flag为C/U/CU&#xff0c;则扫描itl的commit scn&#xff0c;如果发现有query scn

WAIT #140193663907536: nam&#61;&#39;db file sequential read&#39; ela&#61; 788 file#&#61;1 block#&#61;241 blocks&#61;1 obj#&#61;18 tim&#61;1587333670688800 &#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61; PARSING IN CURSOR #140193661586512 len&#61;142 dep&#61;2 uid&#61;0 oct&#61;3 lid&#61;0 tim&#61;1587333670689091 hv&#61;361892850 ad&#61;&#39;775596a0&#39; sqlid&#61;&#39;7bd391hat42zk&#39; select /*&#43; rule */ name,file#,block#,status$,user#,undosqn,xactsqn,scnbas,scnwrp,DECODE(inst#,0,NULL,inst#),ts#,spare1 from undo$ where us#&#61;:1 END OF STMT PARSE #140193661586512:c&#61;242,e&#61;243,p&#61;0,cr&#61;0,cu&#61;0,mis&#61;1,r&#61;0,dep&#61;2,og&#61;3,plh&#61;0,tim&#61;1587333670689090 BINDS #140193661586512:

event 10046 trace 发现在访问块241的时候出现故障&#xff0c;这里我们就去看看这个块到底有什么问题。

BBED> p ktbbh .........省略 ub2 kxidusn &#64;44 0x001b ub2 kxidslt &#64;46 0x000b ub4 kxidsqn &#64;48 0x00000186 struct ktbituba, 8 bytes &#64;52 ub4 kubadba &#64;52 0x00c00a97 ub2 kubaseq &#64;56 0x0219 ub1 kubarec &#64;58 0x26 ub2 ktbitflg &#64;60 0x2001 (KTBFUPB) union _ktbitun, 2 bytes &#64;62 sb2 _ktbitfsc &#64;62 0 ub2 _ktbitwrp &#64;62 0x0000 ub4 ktbitbas &#64;64 0xffffffff --这里被改成0xffffffff

这里低位scn都改成最大值了&#xff0c;难怪怎么poke scn都没效果。。这个雷特么阴险&#xff0c;太坏了。

好了我们知道问题所在了&#xff0c;就是ktbitbas被人工改成0xffffffff&#xff0c;那么恢复方案也有两种。

  1. 方法一
    修改scn&#xff0c;我们手动修改ktbitbas的值。

BBED> assign ktbbhitl[0].ktbitbas&#61;0x004b531f ub4 ktbitbas &#64;64 0x004b531f

  1. 方法二
    既然低位已经最大了&#xff0c;再怎么推也不会超过0xffffffff&#xff0c;那么我们就尝试poke推进高位scn。

SQL> oradebug setmypid SQL> oradebug dumpvar sga kcsgscn_ kcslf kcsgscn_ [06001AE70, 06001AEA0) &#61; 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 6001AB50 00000000 SQL> oradebug poke 0x06001AE74 4 0x50 BEFORE: [06001AE70, 06001AE78) &#61; 00000000 00000000 AFTER: [06001AE70, 06001AE78) &#61; 004B60E0 00000000

第三个雷

SQL> alter database open resetlogs; alter database open resetlogs * ERROR at line 1: ORA-01092: ORACLE instance terminated. Disconnection forced ORA-01173: data dictionary indicates missing data file from system tablespace Process ID: 26639 Session ID: 1 Serial number: 3

看到这个报错&#xff0c;说明顺利进入第三关。

  1. 方法一
    通过一键脚本设置*._corrupted_rollback_segments隐患参数&#xff0c;屏蔽回滚段。

*._corrupted_rollback_segments&#61;&#39;_SYSSMU28_79026890$&#39;,&#39;_SYSSMU24_100127047$&#39;,&#39;_SYSSMU28_79026890$&#39;,&#39;_SYSSMU21_1449495591$&#39;,&#39;_SYSSMU24_100127047$&#39;,&#39;_SYSSMU21_1449495591$&#39;,&#39;_SYSSMU30_493042799$&#39;,&#39;_SYSSMU30_493042799$&#39;,&#39;_SYSSMU23_1725104698$&#39;,&#39;_SYSSMU23_1725104698$&#39;,&#39;_SYSSMU22_3628056578$&#39;,&#39;_SYSSMU22_3628056578$&#39;,&#39;_SYSSMU25_3360715651$&#39;,&#39;_SYSSMU22_3628056578$&#39;,&#39;_SYSSMU25_3360715651$&#39;,&#39;_SYSSMU22_36280565.......

  1. 方法二

SQL> select OWNER,SEGMENT_NAME,FILE_ID,BLOCK_ID from dba_extents where segment_name&#61;&#39;UNDO$&#39;; OWNER SEGMENT_NAME FILE_ID BLOCK_ID ---------- --------------- ---------- ---------- SYS UNDO$ 1 224 BBED> p ktetb struct ktetb[0], 8 bytes &#64;108 ub4 ktetbdba &#64;108 0x004000e1--extent的首地址 ub4 ktetbnbk &#64;112 0x00000007--连续7个块 BBED> x /rnc *kdbr[0 rowdata[2337] &#64;8146 ------------- flag&#64;8146: 0x2c (KDRHFL, KDRHFF, KDRHFH) lock&#64;8147: 0x00 cols&#64;8148: 17 col 0[1] &#64;8149: 0 col 1[6] &#64;8151: SYSTEM col 2[1] &#64;8158: . col 3[2] &#64;8160: .. ......省略 BBED> x /rnc *kdbr[1 rowdata[2267] &#64;8076 ------------- flag&#64;8076: 0x2c (KDRHFL, KDRHFF, KDRHFH) lock&#64;8077: 0x00 cols&#64;8078: 17 col 0[2] &#64;8079: 1 col 1[19] &#64;8082: _SYSSMU1_770609302$ --需要删除 col 2[2] &#64;8102: .. col 3[2] &#64;8105: .. col 4[3] &#64;8108: ... ......省略

Oracle数据库服务进程在定位某行数据时&#xff0c;采用了数据字典&#43;段头extent map的“集中—分散”存储模式&#xff0c;具体为&#xff1a;
1、在数据字典中存放数据段&#xff08;对应表或分区&#xff09;头的物理位置
2、在数据段头存放段中所有extent&#xff08;即连续的block集合&#xff09;的物理位置
ktetb其实就是UNDO$的extent map&#xff0c;该结构体记录了segment中的extent的首地址
通过一键脚本找到dba 0x004000e1&#xff0c;也就是1,225&#xff0c;然后连续7个块&#xff0c;删除里面除了system的其他所有回滚段&#xff0c;这种方法实际操作太麻烦&#xff0c;大家有兴趣可以挑战下。

第四个雷

趟过前三个雷&#xff0c;恭喜顺利达到第四个雷。这个雷来者不善&#xff0c;毕竟是终极BOSS&#xff0c;处理完这个就要顺利通关了&#xff0c;胜利在望。

SQL> alter database open resetlogs; alter database open resetlogs * ERROR at line 1: ORA-03113: end-of-file on communication channel Process ID: 26280 Session ID: 1 Serial number: 3

这个报错&#xff0c;数据库直接挂了&#xff0c;并没有出现什么错误,设置个10046事件去追踪下。

SQL> oradebug event 10046 trace name context forever,level 12; SQL> alter database open resetlogs; alter database open resetlogs --后台alert的报错 SMON: enabling cache recovery Exception [type: SIGSEGV, Address not mapped to object] [ADDR:0xD0C5CD7] [PC:0x97DF62E, kgebse()&#43;776] [flags: 0x2, count: 2] Fri Apr 24 06:42:13 2020 PMON (ospid: 19501): terminating the instance due to error 397 --file#&#61;1 block#&#61;140需要关注 WAIT #140452738872120: nam&#61;&#39;db file sequential read&#39; ela&#61; 670 file#&#61;1 block#&#61;140 blocks&#61;1 obj#&#61;0 tim&#61;1587681730297305 Exception [type: SIGSEGV, Address not mapped to object] [ADDR:0xD0C5CD7] [PC:0x97E0BBA, kgegpa()&#43;40] [flags: 0x0, count: 1] DDE previous invocation failed before phase II DDE was called in a &#39;No Invocation Mode&#39; ----- Start Diag Diagnostic Dump ----- Diag diagnostic dump is performed due to an error in the diagfw code during error handling. DDE is switched to protected mode during the diagnostic dump to prevent recursive errors in the error hadnling code.

从SMON: enabling cache recovery这里其实也能看出来&#xff0c;数据库正在做一些回滚操作&#xff0c;file 1 block 140 对应的是system回滚段&#xff0c;访问到140块的时候数据库直接宕机。

TABLESPACE_NAME SEGMENT_TYPE OWNER SEGMENT_NAME -------------------- ------------------ ---------- --------------- SYSTEM ROLLBACK SYS SYSTEM

我来看窥探file 1 block 140 到底有什么问题。

BBED> p dba 1,140 ktubh struct ktubh, 22 bytes &#64;20 struct ktubhxid, 8 bytes &#64;20 ub2 kxidusn &#64;20 0x0000 ub2 kxidslt &#64;22 0x003b ub4 kxidsqn &#64;24 0x0000002b ub2 ktubhseq &#64;28 0x0025 --seq 是0x0025 ub1 ktubhcnt &#64;30 0x03 ub1 ktubhirb &#64;31 0x03 ub1 ktubhicl &#64;32 0x00 ub1 ktubhflg &#64;33 0x00 BBED> p dba 1,128 ktuxc struct ktuxc, 104 bytes &#64;4148 struct ktuxcscn, 8 bytes &#64;4148 ub4 kscnbas &#64;4148 0x004996f7 ub2 kscnwrp &#64;4152 0x0000 .....省略 struct ktuxcfbp[0], 12 bytes &#64;4192 struct ktufbuba, 8 bytes &#64;4192 ub4 kubadba &#64;4192 0x0040008c ub2 kubaseq &#64;4196 0x0030 --seq 是0x0030 ub1 kubarec &#64;4198 0x03 sb2 ktufbext &#64;4200 1 sb2 ktufbspc &#64;4202 7340

这里感觉是人为把128块的offset 4196由0x0025改成了0x0030

有三种方案恢复

  1. 方法一
    把128块的offset 4196从0x0030改成了0x0025

BBED> assign dba 1,128 4196&#61;0x0025

  1. 方法二
    需要修改ktuxcnfb和ktuxcfbp[1] 即可。其中将ktuxcnfb修改为0&#xff0c;ktuxcfbp[1]中的uba修改为0&#xff0c;表示回滚的时候让oracle认为没有可以分配的undo块&#xff0c;相当于不回滚。

BBED> modify /x 00 offset 4168 BBED> modify /x 000000 offset 4192

  1. 方法三
    通过strace跟踪&#xff0c;得到如下的trace。

01:13:27 write(14, "[32]: ktuiup []", 15) &#61; 15 <0.000012> --ktuiup 01:13:27 write(15, "!gF\n", 4) &#61; 4 <0.000011> 01:13:27 lseek(14, 0, SEEK_CUR) &#61; 3425947 <0.000009> 01:13:27 write(14, "\n", 1) &#61; 1 <0.000011> 01:13:27 write(15, "!A1\n", 4) &#61; 4 <0.000012> 01:13:27 lseek(14, 0, SEEK_CUR) &#61; 3425948 <0.000010> 01:13:27 write(14, "[33]: ktuini []", 15) &#61; 15 <0.000012> ------注意这里ktuini函数 01:13:27 write(15, "!gF\n", 4) &#61; 4 <0.000011> 01:13:27 lseek(14, 0, SEEK_CUR) &#61; 3425963 <0.000009> 01:13:27 write(14, "\n", 1) &#61; 1 <0.000012> 01:13:27 write(15, "!A1\n", 4) &#61; 4 <0.000012> 01:13:27 lseek(14, 0, SEEK_CUR) &#61; 3425964 <0.000010> 01:13:27 write(14, "[34]: adbdrv []", 15) &#61; 15 <0.000011> 01:13:27 write(15, "!gF\n", 4) &#61; 4 <0.000012> 01:13:27 lseek(14, 0, SEEK_CUR) &#61; 3425979 <0.000009> 01:13:27 write(14, "\n", 1) &#61; 1 <0.000012> 01:13:27 write(15, "!A1\n", 4) &#61; 4 <0.000011> 01:13:27 lseek(14, 0, SEEK_CUR) &#61; 3425980 <0.000009> 01:13:27 write(14, "[35]: opiexe []", 15) &#61; 15 <0.000012> 01:13:27 write(15, "!gF\n", 4) &#61; 4 <0.000011> 01:13:27 lseek(14, 0, SEEK_CUR) &#61; 3425995 <0.000009> 01:13:27 write(14, "\n", 1) &#61; 1 <0.000012>

注意这里ktuini函数&#xff0c;SEEK_CUR表示文件的相对当前位置&#xff0c;这里也能看出来数据库再做一些recovery的动作&#xff0c;调用ktuiup函数&#xff0c;开始恢复回滚段上的死事务。

既然数据库调用函数ktuini报错&#xff0c;那我们就通过再这个函数设置断点&#xff0c;然后导出数据。

--session 1 (gdb) break ktuini Breakpoint 1 at 0xf21352 (gdb) c Continuing. --session 2 导出数据 export NLS_LANG&#61;AMERICAN_AMERICA.AL32UTF8 exp \&#39;/ as sysdba \&#39; file&#61;/home/ora11/meta.dmp ROWS&#61;n buffer&#61;102400000


推荐阅读
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
author-avatar
mobiledu2402851203
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有