国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

分析和解決ora-4030錯誤

2024-07-21 02:09:41
字體:
來源:轉載
供稿:網友

分析和解決ora-4030錯誤



ora-4030意味著什么?



    這個錯誤意味著oracle服務器進程不能從操作系統獲得更多的內存。這里的內存指的是pga(程序全局區)以及由配置決定的它的子項。對于專用的服務器進程,內存包括堆棧區、uga(用戶全局區)。uga包括用戶會話數據、游標信息和排序區。在多線程配置中(共享服務器),uga處于sga(系統全局區)中,它不會造成ora-4030錯誤。



    因此,ora-4030意味著進程需要更多的內存(堆棧、uga或者pga)來執行它的工作。



是什么引起了這個錯誤?



這個錯誤表示操作系統不能分配足夠的內存。這個錯誤可能是你的進程本身引起的,例如你的進程需要太多的內存,或者其它的原因引起操作系統內存枯竭,例如sga區分得太大或者太多的進程競爭系統虛擬內存(物理內存+交換分區)。許多操作系統會限制某個進程獲得的內存以保證系統穩定。



請按以下步驟檢查你的系統:



·       是否仍有足夠的內存供分配?



·       操作系統是否有限制?



·       oracle數據庫是否有限制?



·       哪一個進程需要過多的內存?



·       如何收集那個(需要過多內存的)進程正在做什么的信息?



這些將在下一節里討論。



進一步討論主題:



·       避免此類錯誤的一般建議



·       參考



是否仍有足夠的內存供分配?



    要回答這個問題,我們需要使用操作系統特定的工具來檢測內存使用情況。



1.openvms系統:顯示那些能告訴你物理內存和頁面文件使用情況的信息。



physical memory usage (pages):



total         free         in use           modified       main memory (256.00mb)       32768          24849           7500               419



……



paging file usage(blocks):




 


free  reservable total



disk$bobbieaxpsys:[sys0.sysexe]swapfile.sys  30720  30720      39936 disk$bobbieaxpsys:[sys0.sysexe]pagefile.sys  2261    60201088  249984  disk$bobbie_user3:[sys0.pagefile]pagefile.sys 462224  405296  499968



    作為一般的原則,頁面文件中的空閑容量總量應該不低于總容量的一半。交換文件應該幾乎不使用,空閑的容量應該幾乎和總容量一樣。



1.windows系統:在任務管理器中查看內存使用情況。



2.unix系統:每一個unix系統都有自己的工具來檢測全部內存的使用情況,例如top,vmstat…..,并且每一個系統都有所不同。



o        top常用來顯示物理內存和交換空間的情況。



o        swapon –s 顯示交換空間使用情況



o        vmstat 顯示空閑物理內存情況



sample top output on linux:



在linux上“top”的輸出例子:



top - 10:17:09 up  1:27,  4 users,  load average: 0.07, 0.12, 0.05



tasks: 110 total,  4 running, 105 sleeping,   0 stopped,   1 zombie



cpu(s):  0.3% user,  1.6% system,  0.0% nice,  98.0% idle



mem:  1033012k total,  452520k used,  580492k free,  59440k buffers



swap:  1052248k total,  0k used,    1052248k free,  169192k cached



.....



如果有足夠的內存,那么請檢查一下是否操作系統有強制限制。如果內存被耗盡了,我們就要找出這些內存被用在了哪里。



操作系統是否有限制?



如果仍有充足的虛擬內存剩余,可能是我們不能使用申請使用的那部分內存。請檢查操作系統是否有限制。



1.openvms系統:要檢查你能使用的物理內存的總量,請檢查工作(頁面)區配額(working set quotas)和頁面文件配額(pagefile quota)。請查詢openvms使用指南確定配額情況和如何修改它們。根據使用進程的不同以及啟動它們方式的不同,配額使用將不同于oracle的統計。process/id=<process id>/quota將顯示對于一個特定的進程還有多少剩余配額可使用。



uaf> show oracle7



username: oracle7               owner:  oracle7 dba



account:  support               uic: [200,2] ([support,oracle7])



cli:   dcl                  tables: dcltables



default:  disk$bobbie_user1:[oracle7]



lgicmd:   loginflags:



primary days:     mon    tue    wed    thu    fri



secondary days:                     sat    sun



no access restrictions



expiration:    (none) pwdminimum: 6   login fails: 0



pwdlifetime:   (none) pwdchange:   3-dec-1997 15:38



last login: 27-may-2003 14:54 (interactive), 26-may-2003 16:15 (non-interactive)



maxjobs: 0  fillm:  1200  bytlm:  180000



maxacctjobs:0 shrfillm:  0  pbytlm:    0



maxdetach: 0 biolm:  500  jtquota:  8192



prclm: 20  diolm:  500  wsdef:   2500



prio:  4  astlm:  4000  wsquo:  4096



queprio:0  tqelm:  4000  wsextent:  30000



cpu: (none) enqlm: 18000  pgflquo:   750000



authorized privileges: .....



$ sho proc/id=20200139/quota



24-jun-2003 12:30:54.39 user: oracle7 process id: 20200139



        node: bobbie  process name: "ora_bob901_pmon"



process quotas:



account name: support



cpu   limit:  infinite  direct i/o limit:100



buffered i/o byte count quota:   9994816  buffered i/o limit: 100



timer queue entry quota: 99  open file quota:29997



paging file quota: 145968  subprocess quota: 10



default page fault cluster:64  ast quota: 496



enqueue quota: 49995  shared file limit: 0



max detached processes: 0  max active jobs: 0



2.windows系統:在微軟的windows操作系統上,oracle進程集作為一個進程的許多線程來運行。地址空間不能超過2gb(包括堆棧、pga、sga)。這個限制可以突破到3gb或更高。(請看oracle文檔<note:46001.1>)。關于oracle數據庫和windows nt內存結構的情況,請查詢技術公告板。oracle進程使用的總的內存情況(不包括進程堆棧和代碼)可以用query查看。



3.unix系統:使用內置的shell命令: limit/ulimit。注意那些unlimited的不一定意味著無限制,而是可能有著老系統的限制,例如2gb。



linux系統上輸出的一個例子:



[email protected]:~> ulimit -a



core file size(blocks, -c)    0



data seg size(kbytes, -d)   unlimited



file size(blocks, -f)    unlimited



max locked memory(kbytes, -l)    unlimited



max memory size(kbytes, -m)    unlimited



open files(-n)    1024



pipe size(512 bytes, -p)    8



stack size(kbytes, -s)    unlimited



cpu time(seconds, -t)    unlimited



max user processes(-u)    7168



virtual memory(kbytes, -v)  unlimited



有可能是內存限制定得太小了,需要增大它。也可能是我們需索得太多



oracle數據庫是否有限制?



    從oracle 9i以后,有一個參數決定一個oracle實例可以分配到pga總量。<note:223730.1>"automatic pga memory managment in 9i"提供了更多關于這方面的信息。下面的查詢可以用來找出分配給所有會話的pga區域的內存總量。



sql> select  sum(value)/1024/1024 mb from v$sesstat s, v$statname n



 where n.statistic# = s.statistic# and name =’session pga memory’;



哪一個進程需要過多的內存?    某些操作需要大量的內存例如巨大pl/sql表或者大量的排序操作。在這種情況下,在返回ora-4030錯誤之前進程將運行一段時間。希望我們可以找出內存被分配給哪個進程以及為什么被分配。你可以使用如下的查詢查出oracle數據庫pga和uga的運行情況。



sql>col name format a30sql>select sid,name,value from  v$statname n,v$sesstat s 



where n.statistic# = s.statistic# and name like 'session%memory%' order by 3 asc;



這個查詢將顯示列表中的對內存“饑餓”的進程。從操作系統角度來看,確定進程的內存使用量也是一個好主意。總之,不大可能是oracle數據庫的服務器進程使用了過多的內存。一般地,對于服務器進程來說,oracle數據庫和操作系統之間或多或少的可以就內存的使用達成一致。下面的命令允許你從操作系統的角度找出進程的內存使用量。



1.openvms系統:“show system”命令給出進程和資源的使用情況的概覽。那些頻繁調用頁面失敗的進程常常消耗了大量的虛擬內存。“page”列指出物理內存的使用情況。“show process/continious”(原文如此,我懷疑是continuous)命令則給出物理內存(工作頁面區)和虛擬內存的使用情況。



$ show system/page



openvms v7.2-1 on node bobbie  13-jun-2003 09:56:30.44 uptime  17 18:58:18



pid   process    name    state  pri   i/o   cpu  page flts  pages



20200101 swapper    hib    16  0   0  00:00:02.45   0     0



20200106 cluster_server hib   13  104  0  00:00:00.03   87   104



20200107 configure   hib    10  21   0  00:00:00.06  77    17



$ sho process/id=xxx/cont:



process aroelant      10:00:53



    state     cur    working set    131



cur/base priority   6/4   virtual pages   11714



current pc   800d9b28  cpu time  0 00:00:01.28



current psl 00000003   direct i/o      178



current user sp 7a5227f0  buffered i/o    962



pid   20200469     page faults      1312



uic [support,aroelant] event flags   c0000003  c0000000



2.windows系統:對于微軟的windows操作系統來說,oracle進程集作為一個進程的許多線程來運行。到目前為止,我還沒有找到一個方法來查看某個線程的內存使用情況。然而我們可以檢查出oracle是否對操作系統分配的內存感到滿意。從操作系統的角度來看,我們可以使用任務管理器。調出任務管理器,點擊“查看”按鈕,選擇“選擇列”,在彈出的窗口中在“虛擬內存大小”前打上勾。oracle.exe進程使用的虛擬內存大小( vm size)應該和sga、pga和進程堆棧以及代碼使用的內存總量相匹配。下面的查詢命令可以給出oracle使用的內存量,然而,這不包括進程堆棧以及代碼使用的內存量。



select sum(bytes)/1024/1024 mb from      (select bytes from v$sgastat union        select value bytes from v$sesstat s,v$statname n        where n.statistic# = s.statistic# and             n.name = 'session pga memory'       );mb



----------517.296406



在我的系統上,任務管理器中顯示的虛擬內存大小比上面的查詢出的內存使用量多大約30mb。當你確認是oracle使用了這個內存,這個查詢將給出哪一個會話用得最多。



3.unix系統:“top”工具是一個很有用的工具,你能夠定制顯示和排序的列。“ps”命令在大多數系統中可以使用,但也有些不能。例如,在linux上,“ps -af --sort resident”將列出所有的進程最近的最大常駐內存集(resident set)(注二)。你也可參考<note:174555.1> "unix: determining the size of an oracle process". 



如何收集那個(需要過多內存的)進程正在做什么的信息?



    本節將只討論oracle服務器進程。使用前面幾節介紹的方法,你應該可以判定一個或多個oracle服務器進程造成了內存資源的枯竭。記住并不總是由于進程造成了內存資源的枯竭從而導致ora-4030錯誤。這個錯誤僅僅意味著進程不能獲得它需要的內存資源。



    如果進程不斷增長對內存的需求,我們可以在它運行的時候查看一下它的情況。



o  你可以用下面的查詢語句在v$sql_area表中查詢有什么進程正在執行中。



sql> select sql_text  from v$sql_area a, v$session s



where a.address = s.sql_address and s.sid = <sid>;



o  we can force a heapdump and have it examined by oracle support services。(這句不知如何譯)



sql> oradebug unlimitsql> oradebug setorapid 10 (這是對應 oracle pid, 用“setospid”對應操作系統的進程id)sql> oradebug dump heapdump 7



    如果問題不再發生,或者某些進程太快而不能作這樣的檢查,很有可能這就是引起內存枯竭的原因。我們可以在這個進程引起這個錯誤時使用事件集來獲得一個 heapdump.



sql> alter session set events '4030 trace name heapdump level 25';



或者在數據庫的init.ora文件中設置這個事件。<note:21234.1> event: 10261 "limit the size of the pga heap"    這個dump能幫助oracle support分析并找出引起過多的內存分配的原因。



對于如何避免這個錯誤的一般建議。



o  正如前面提到的一樣,某些操作會需要大量的內存。對于排序操作來說,減少sort_area_size可能有所幫助。oracle服務器進程會在pga中分配排序操作需要的sort_area_size字節。如果完成某個查詢需要過多的內存,服務器進程將會使用臨時段。這意味著,當查詢需要大量的排序操作時,更少的sort_area_size可以使得執行更緊湊。



o  對于9i或更高版本的oracle數據庫,可以設備參數workarea_size_policy為auto來打開自動sql execution內存管理功能,也可以在初始化文件中指定pga_aggregate_target的大小。



  <note:262946.1> "performance issues after increasing workload",   <note:223730.1> "automatic pga memory managment in 9i",   <note:223299.1> "top oracle 9i init.ora parameters affecting performance" 



o  pl/sql例程也可能會需要大量內存,因此有必要在你的應用程序中重寫這部分查詢代碼。如果某個pl/sql表經常被使用,它確實會在pga中分配一塊內存。



o  再看一下優化策略,由于排序操作可能某些訪問路徑會需要太多的內存,函數調用返回過多的行等等……



o  在某些操作系統上,例如microsoft windows,sga的大小應該降低,以便于pga獲得更大的內存。



o  確信你的操作系統和oracle數據庫的內存限制是適度的。



o  確信有足夠的內存(物理內存和交換空間)。



參考



general:



<note:237899.1> resolving ora-4030 errors after upgrading



nt:



<note:116076.1> tackling ora-4030 on windowsnt



<note:46001.1>  oracle database and the windows nt memory architecture, technical bulletin



unix:



<note:199746.1> how to resolve ora-4030 errors on unix (unix specific but general enough for some suggestions)



unix: determining the size of an oracle process




 


vms:



<note:67033.1> background process quotas <note:68663.1> dedicated server process quotas (sql*net v2.3.3, v8.0.x)<note:70671.1> process quotas for bequeath connections (v7, v8)<note:68849.1> bequeath listener process quotas (v7, v8)<note:68226.1> listener process quotas (sql*net v2.3.3, v8.0.x)




 


@ internal:



@ <note:21234.1> event: 10261 "limit the size of the pga heap"



@ this event is very usefull. it will cause the process to dump information when the pga grows above the specified limit




 


本人注一:工作(頁面)區(working set):1.為避免過多的調頁所必須激活的用戶頁面的集合。2.為避免系統失效,調頁所需要的實存容量。



本人注二:常駐內存集(resident set):在虛存系統中,任一時候都存在于主存儲器內的某個程序的頁面 或程序段的全部。




 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 哈尔滨市| 阿鲁科尔沁旗| 霍城县| 西城区| 惠州市| 盐亭县| 福泉市| 仲巴县| 枣强县| 南陵县| 蚌埠市| 扎兰屯市| 册亨县| 韶关市| 浦城县| 盘山县| 潞西市| 南澳县| 黔西| 芦溪县| 蛟河市| 许昌县| 昌邑市| 康马县| 彭泽县| 商都县| 龙州县| 任丘市| 闽侯县| 黄石市| 衡东县| 宜城市| 台前县| 徐汇区| 萨嘎县| 东乡| 宁阳县| 仙桃市| 东宁县| 星子县| 长岭县|