問題實驗環境
操作系統:Red Hat Enterprise Linux Server release 5.7 (Tikanga)
數據庫 :Oracle Database 10g Release 10.2.0.4.0 - Production
錯誤再現分析
在使用數據泵導數據時,遇到下面錯誤:
[oracle@gsp db_expd_bak]$ expdp system/xxxx directory=dump_dir dumpfile=dm.dmp tablespaces=dm content=all;
Export: Release 10.2.0.4.0 - Production on Thursday, 29 August, 2013 21:38:44
Copyright (c) 2003, 2007, Oracle. All rights reserved.
Connected to: Oracle Database 10g Release 10.2.0.4.0 - Production
ORA-31626: job does not exist
ORA-31637: cannot create job SYS_EXPORT_TABLESPACE_01 for user SYSTEM
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 95
ORA-06512: at "SYS.KUPV$FT_INT", line 600
ORA-39080: failed to create queues "KUPC$C_1_20130829213845" and "KUPC$S_1_20130829213845" for Data Pump job
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 95
ORA-06512: at "SYS.KUPC$QUE_INT", line 1606
ORA-00832: no streams pool created and cannot automatically create one
造成ORA-00832:no streams pool created and cannot automatically create one錯誤的原因一般是streams_pool_size太小或沒有定義streams_pool_size
A database feature which needs STREAMS SGA was being used, however, the streams_pool_size parameter was not defined and the value of db_cache_size was too small to permit an automatic transfer of SGA to the streams pool from the buffer cache. |
Action: Please set the parameter streams_pool_size or set sga_target |
SQL> show parameter streams_pool_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
streams_pool_size big integer 0
SQL>
由於STREAMS_POOL_SIZE一般在ASSM中是動態分配的,所以參數streams_pool_size一直為0,要查看streams_pool_size的真實大小就必須通過下面腳本來查詢:
- epps> col name for a36;
- epps> col value for a10;
- epps> col idfefault for a10;
- epps> col ismod for a10;
- epps> col isadj for a10;
- epps>SELECT X.ksppinm name ,
- 2 Y.ksppstvl value ,
- 3 Y.ksppstdf idfefault ,
- 4 DECODE(bitand(Y.ksppstvf,7), 1, 'MODIFIED', 4, 'SYSTEM_MOD', 'FALSE') ismod,
- 5 DECODE(bitand(Y.ksppstvf,2), 2, 'TRUE', 'FALSE') isadj
- 6 FROM sys.x$ksppi X,
- 7 sys.x$ksppcv Y
- 8 WHERE X.inst_id = userenv('Instance') AND
- 9 Y.inst_id = userenv('Instance') AND
- 10 X.indx = Y.indx AND
- 11 X.ksppinm LIKE '%_streams%'
- 12 ORDER BY translate(X.ksppinm, '_', '');
- NAME VALUE IDFEFAULT ISMODISADJ
- ------------------------------------ ---------- ---------- ---------- ----------
- __streams_pool_size 0 TRUE FALSEFALSE
- _memory_broker_shrink_streams_pool 900 TRUE FALSEFALSE
- _disable_streams_pool_auto_tuning FALSE TRUE FALSEFALSE
- _streams_pool_max_size 0 TRUE FALSEFALSE
epps> show parameter sga
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
lock_sga boolean TRUE
pre_page_sga boolean FALSE
sga_max_size big integer 3424M
sga_target big integer 0
epps>
查看streams_pool_size的實際大小,發現其大小為0,更讓我吃驚的卻在后面:sga_target 為0,也就是說數據庫沒有啟動自動共享內存管理(Automatic Shared Memory Management ASMM)。真是繞了一大圈。所以必須手動調整streams_pool_size的大小:
epps> alter system set streams_pool_size=100M scope=memory;
alter system set streams_pool_size=100M scope=memory
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-04033: Insufficient memory to grow pool
epps> alter system set streams_pool_size=1M scope=memory;
alter system set streams_pool_size=1M scope=memory
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-04033: Insufficient memory to grow pool
因為SGA采用老的分配方式,沒有采用ASSM管理SGA,需要從其它內存中釋放一些內存出來分配給streams_pool_size,結合分析,最后從
shared_pool_size中分配32M出來給streams_pool_size。問題解決,另外一個解決方法就是講sga_target設為非零。讓SGA動態給streams_pool_size分配內存。
參考資料:
https://forums.oracle.com/thread/1062498?start=0&tstart=0
http://blog.itpub.net/post/2333/409664
http://blog.csdn.net/xiaofan23z/article/details/6767396