新聞中心
在Oracle數(shù)據(jù)庫(kù)開(kāi)發(fā)和維護(hù)過(guò)程中,經(jīng)常會(huì)遇到數(shù)據(jù)庫(kù)中出現(xiàn)遞歸(Recursion)錯(cuò)誤的情況。遞歸錯(cuò)誤通常是數(shù)據(jù)庫(kù)內(nèi)部執(zhí)行故障或配置問(wèn)題導(dǎo)致的。遞歸錯(cuò)誤會(huì)給數(shù)據(jù)庫(kù)帶來(lái)一些不必要的風(fēng)險(xiǎn)和損失,因此對(duì)于遞歸錯(cuò)誤的解決措施需要及時(shí)、準(zhǔn)確地尋求。

創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),壽縣企業(yè)網(wǎng)站建設(shè),壽縣品牌網(wǎng)站建設(shè),網(wǎng)站定制,壽縣網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,壽縣網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
在本文中,我們將介紹遞歸錯(cuò)誤在Oracle數(shù)據(jù)庫(kù)中出現(xiàn)的原因、對(duì)業(yè)務(wù)的影響,以及如何解決遞歸錯(cuò)誤問(wèn)題。
1. 遞歸錯(cuò)誤簡(jiǎn)介
遞歸錯(cuò)誤是指在程序執(zhí)行過(guò)程中,一個(gè)函數(shù)不斷調(diào)用自己,直到嵌套的層數(shù)過(guò)多,導(dǎo)致程序無(wú)法正常執(zhí)行或崩潰的問(wèn)題。在Oracle數(shù)據(jù)庫(kù)中,遞歸錯(cuò)誤通常指的是PL/SQL執(zhí)行過(guò)程中出現(xiàn)的遞歸錯(cuò)誤,例如:遞歸調(diào)用存儲(chǔ)過(guò)程、遞歸執(zhí)行游標(biāo)、遞歸調(diào)用觸發(fā)器等等。
2. 遞歸錯(cuò)誤的影響
遞歸錯(cuò)誤會(huì)嚴(yán)重影響數(shù)據(jù)庫(kù)的性能和穩(wěn)定性。遞歸錯(cuò)誤會(huì)導(dǎo)致SQL語(yǔ)句無(wú)法執(zhí)行,讓數(shù)據(jù)庫(kù)無(wú)法響應(yīng)用戶請(qǐng)求,可能會(huì)導(dǎo)致業(yè)務(wù)系統(tǒng)的崩潰。同時(shí),遞歸錯(cuò)誤也會(huì)增加數(shù)據(jù)庫(kù)的負(fù)荷,降低數(shù)據(jù)庫(kù)的可用性和穩(wěn)定性。
3. 解決遞歸錯(cuò)誤的方法
針對(duì)遞歸錯(cuò)誤的解決方法主要有以下幾種:
(1) 查找PL/SQL存儲(chǔ)過(guò)程的遞歸問(wèn)題
如果出現(xiàn)存儲(chǔ)過(guò)程遞歸錯(cuò)誤,我們可以先嘗試使用PL/SQL的調(diào)試工具來(lái)定位和解決問(wèn)題。我們可以使用Oracle開(kāi)發(fā)工具(如SQL Developer)的調(diào)試工具,通過(guò)斷點(diǎn)調(diào)試、單步執(zhí)行等方式來(lái)查找遞歸調(diào)用的存儲(chǔ)過(guò)程,并排除問(wèn)題。
(2)配置控制遞歸調(diào)用深度
可以在Oracle數(shù)據(jù)庫(kù)的參數(shù)配置中控制遞歸調(diào)用的深度。當(dāng)達(dá)到深度閾值時(shí),系統(tǒng)會(huì)拋出異?;蚓妗?梢愿鶕?jù)業(yè)務(wù)需求設(shè)置適當(dāng)?shù)拈撝怠?/p>
(3)減少數(shù)據(jù)庫(kù)中的遞歸調(diào)用
對(duì)于遞歸調(diào)用深度較淺的存儲(chǔ)過(guò)程或觸發(fā)器,可以進(jìn)行遞歸調(diào)用的改進(jìn)或深度優(yōu)化。例如通過(guò)分解遞歸邏輯、控制遞歸調(diào)用的條件等方式來(lái)優(yōu)化遞歸查詢的性能。
(4)使用數(shù)據(jù)分區(qū)技術(shù)
對(duì)于大量遞歸調(diào)用和查詢的業(yè)務(wù)場(chǎng)景,可以通過(guò)數(shù)據(jù)分區(qū)技術(shù),減輕數(shù)據(jù)庫(kù)的負(fù)荷,提高查詢性能,從而降低出現(xiàn)遞歸錯(cuò)誤的概率。
4.
遞歸錯(cuò)誤是Oracle數(shù)據(jù)庫(kù)中常見(jiàn)的問(wèn)題,但是其危害性很大。針對(duì)遞歸錯(cuò)誤,我們可以通過(guò)控制遞歸深度、改進(jìn)存儲(chǔ)過(guò)程遞歸邏輯、使用數(shù)據(jù)分區(qū)等方式達(dá)到優(yōu)化性能、提高查詢效率和提高數(shù)據(jù)庫(kù)穩(wěn)定性的目的。在實(shí)際運(yùn)維中,我們需要注意監(jiān)控?cái)?shù)據(jù)庫(kù)的運(yùn)行情況,定期清理異常日志,并及時(shí)尋找和解決數(shù)據(jù)庫(kù)中的遞歸錯(cuò)誤問(wèn)題,保證正常的業(yè)務(wù)開(kāi)展。
相關(guān)問(wèn)題拓展閱讀:
- 在oracle數(shù)據(jù)庫(kù)中刪除用戶drop user username cascade; 但是現(xiàn)在報(bào)錯(cuò)啊就高人
在oracle數(shù)據(jù)庫(kù)中刪除用戶drop user username cascade; 但是現(xiàn)在報(bào)錯(cuò)啊就高人
好吧!我?guī)湍闼阉飨碌玫揭韵聝?nèi)容
1. drop user出現(xiàn)問(wèn)題
報(bào)出以下錯(cuò)誤后退出
ORA-00604: error occurred at recursive SQL level 1
ORA-00942: table or view does not exist .
關(guān)于 recursive SQL 錯(cuò)誤我們有必要做個(gè)簡(jiǎn)單說(shuō)明。
我們知道,當(dāng)我們發(fā)出一條簡(jiǎn)單的命令以后
Oracle數(shù)據(jù)庫(kù)要在后臺(tái)解析這條命令,并轉(zhuǎn)換為Oracle數(shù)據(jù)庫(kù)的一系列后臺(tái)操作。
這些后臺(tái)操作統(tǒng)稱為遞歸sql.
比如create table這樣一條簡(jiǎn)單的DDL命令,Oracle數(shù)據(jù)庫(kù)在后臺(tái),實(shí)際上要把這個(gè)命令轉(zhuǎn)換為對(duì)于obj$,tab$,col$等底層表的插入簡(jiǎn)穗操作。Oracle所作的工作可能比我們有時(shí)候想的要復(fù)雜的多。
2.跟蹤問(wèn)題
我們知道Oracle提供sql_trace的功能
可以用于跟蹤Oracle數(shù)據(jù)庫(kù)的后臺(tái)遞歸操作。
通過(guò)跟蹤文件,我們可以找到問(wèn)題的所在
以下是格式化(tkprof)后的輸出:
The following statement encountered a error during parse:
DELETE FROM SDO_GEOM_METADATA_TABLE WHERE SDO_OWNER = ‘WAPCOMM’
Error encountered: ORA-00942
Oracle把錯(cuò)誤信息首先呈現(xiàn)出來(lái),我們看到ORA-00942錯(cuò)誤是由于
SDO_GEOM_METADATA_TABLE表/視圖不存在所致,問(wèn)題由此可以定位。
對(duì)于這一類的錯(cuò)誤,定位問(wèn)題以后解決的方法就要依據(jù)具體問(wèn)題原攔則卜因而定了。
盯絕3.問(wèn)題定位
對(duì)于本案例,通過(guò)Metalink獲得以下解釋:
Problem Description
The Oracle Spatial Option has been installed and you are encountering
the following errors while trying to drop a user, who has no spatial tables,
connected as SYSTEM:
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-00942: table or view does not exist
ORA-06512: at line 7
A 942 error trace shows the failing SQL statement as:
DELETE FROM SDO_GEOM_METADATA_TABLE WHERE SDO_OWNER = ”
Solution Description
(1)
Create a synonym for SDO_GEOM_METADATA_TABLE under SYSTEM which points to
MDSYS.SDO_GEOM_METADATA_TABLE.
對(duì)于本例,為MDSYS.SDO_GEOM_METADATA_TABLE創(chuàng)建一個(gè)同義詞即可解決,是相對(duì)簡(jiǎn)單的情況。
(2)
Now the user can be dropped connected as SYSTEM.
Related Documents
ORA-604 and ORA-942 Reported During DROP USER CASCA
4.實(shí)際處理
MDSYS.SDO_GEOM_METADATA_TABLE為Spatial對(duì)象,如果未使用Spatial選項(xiàng),可以刪除
SQL> connect / as sysdbaConnected.
SQL> select * from dba_sdo_geom_metadata order by owner;
select * from dba_sdo_geom_metadata order by owner
*
ERROR at line 1:
ORA-00942: table or view does not exist
ORA-04063: view “MDSYS.DBA_SDO_GEOM_METADATA” has errors
SQL> select object_name from dba_objects where object_name like ‘%SDO%’;
OBJECT_NAME
ALL_SDO_GEOM_METADATA
ALL_SDO_INDEX_INFO
ALL_SDO_INDEX_METADATA
DBA_SDO_GEOM_METADATA
DBA_SDO_INDEX_INFO
DBA_SDO_INDEX_METADATA
….
DBA_SDO_GEOM_METADATA
DBA_SDO_INDEX_INFO
…
SDO_WITHIN_DISTANCE
USER_SDO_GEOM_METADATA
USER_SDO_INDEX_INFO
USER_SDO_INDEX_METADATA
88 rows selected.
SQL> drop user MDSYS cascade;
User dropped.
SQL> select owner,type_name from dba_types where type_name like ‘SDO%’;
no rows selected
SQL>
SQL> alter session set sql_trace=true;
Session altered.
SQL> drop user wapcomm;
User dropped.
SQL> alter session set sql_trace=false;
Session altered.
SQL> exit
Disconnected from Oracle8i Enterprise Edition Release 8.1.7.4.0 – 64bit Production
With the Partitioning option
erver Release 8.1.7.4.0 – 64bit Production
這時(shí)用戶得以順利drop
5.一點(diǎn)總結(jié)
使用sql_trace可以跟蹤數(shù)據(jù)庫(kù)的很多后臺(tái)操作有利于我們發(fā)現(xiàn)問(wèn)題的所在,很多時(shí)候,我們想要研究Oracle的內(nèi)部活動(dòng)或后臺(tái)操作,也可以通過(guò)sql_trace跟蹤,sql_trace/10046 是Oracle提供的最為有效的診斷工具之一。
案例四:表更新時(shí)發(fā)生遞歸SQL2級(jí)失敗錯(cuò)誤
問(wèn)題描述:表更新的時(shí)候失敗了,并且生成了一條ORA錯(cuò)誤信息。這個(gè)錯(cuò)誤發(fā)生在遞歸SQL 2級(jí)。
解決方案:不幸的是,這個(gè)錯(cuò)誤并不能告訴你Oracle數(shù)據(jù)庫(kù)在錯(cuò)誤發(fā)生的時(shí)候正要做什么。當(dāng)你執(zhí)行一條SQL語(yǔ)句的時(shí)候,Oracle數(shù)據(jù)庫(kù)會(huì)為你在幕后做很多事情。例如,考慮下面的SQL語(yǔ)句:
UPDATE emp SET sal = sal*1.05 WHERE empno=1001;
這條SQL語(yǔ)句給號(hào)碼為1001的雇員漲5%的工資。當(dāng)你執(zhí)行這條語(yǔ)句的時(shí)候,Oracle查詢數(shù)據(jù)目錄來(lái)確定是否有這個(gè)表或者你是否使用了同義字。一旦它找到了數(shù)據(jù)庫(kù)對(duì)象,Oracle查詢數(shù)據(jù)字典來(lái)判斷你是否擁有訪問(wèn)這個(gè)對(duì)象的權(quán)限。那么,Oracle到底是如何與數(shù)據(jù)字典進(jìn)行交互的呢?它執(zhí)行一條自己的SQL 語(yǔ)句。這些Oracle為你執(zhí)行的SQL語(yǔ)句被稱為“遞歸”SQL語(yǔ)句。你最初的SQL 語(yǔ)句是0級(jí)。Oracle為你執(zhí)行的遞歸SQL語(yǔ)句是1級(jí)。有時(shí)候,一條遞歸SQL語(yǔ)句又會(huì)引起自己的遞歸SQL語(yǔ)句,就是2級(jí)。
在你的案例中,有一個(gè)2級(jí)的遞歸SQL語(yǔ)句正在執(zhí)行,并且產(chǎn)生了問(wèn)題。為了解決問(wèn)題,你需要找出執(zhí)行的是什么遞歸SQL語(yǔ)句引起的錯(cuò)誤。要做到這一點(diǎn),你必須啟動(dòng)會(huì)話中的追蹤。
首先,執(zhí)行下面的SQL 語(yǔ)句:
ALTER SESSION SET sql_trace=TRUE;
然后,執(zhí)行你的更新語(yǔ)句。你會(huì)看到ORA-604 錯(cuò)誤。接下來(lái),執(zhí)行下面的語(yǔ)句:
ALTER SESSION SET sql_trace=FALSE;
現(xiàn)在到你為數(shù)據(jù)庫(kù)定義的USER_DUMP_DEST 起始參數(shù)上的路徑去。那里應(yīng)該有一個(gè)時(shí)間戳為當(dāng)前時(shí)間的文件。那個(gè)就是你生成的追蹤文件。你可以打開(kāi)文件并檢查遞歸SQL語(yǔ)句,其中包括引起錯(cuò)誤的一條。
來(lái)源
可以通過(guò)10046事件去追蹤這條語(yǔ)句的執(zhí)行過(guò)程,估計(jì)是某張系統(tǒng)表出了問(wèn)題
重新啟動(dòng)數(shù)據(jù)庫(kù)試試。不行就開(kāi)啟trace功能,再查看trace文件看看問(wèn)題出在哪里
關(guān)于oracle數(shù)據(jù)庫(kù)報(bào)遞歸錯(cuò)誤的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開(kāi)通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過(guò)10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
網(wǎng)站欄目:Oracle數(shù)據(jù)庫(kù)報(bào)遞歸錯(cuò)誤解決方法(oracle數(shù)據(jù)庫(kù)報(bào)遞歸錯(cuò)誤)
分享地址:http://m.5511xx.com/article/dhpoded.html


咨詢
建站咨詢
