Oracle
鎖定數據庫後禁用 MEMORY_TARGET?
我正在虛擬機中設置本地開發環境,在該虛擬機中安裝了 Oracle XE 以及其他軟體。
當我最初設置虛擬機時,RAM 設置為 4Gb。在這種情況下,我順利地安裝並執行了 Oracle XE,沒有任何問題。
然後 4Gb 的 RAM 對我隊友的筆記型電腦來說有點太多了,所以我停止了虛擬機,將其記憶體減少到 2Gb 並重新啟動它。
從那時起,Oracle XE 啟動,據我從服務的輸出中可以看出,但它拒絕傳入連接,因為它似乎 MEMORY_TARGET 設置得太高。
現在,由於我目前被數據庫鎖定,如何完全禁用 MEMORY_TARGET,或者至少減少它嘗試分配的空間量?我知道我應該能夠改變一些系統表,但我不再能夠連接。
以下是您可能需要提供更清晰圖片的一些資訊:
cat /u01/app/oracle/diag/rdbms/xe/XE/trace/alert_XE.log WARNING: You are trying to use the MEMORY_TARGET feature. This feature requires the /dev/shm file system to be mounted for at least 1073741824 bytes /dev/shm is either not mounted or is mounted with available space less than this size. Please fix this so that MEMORY_TARGET can work as expected. Current available is 1049767936 and used is 73728 bytes. Ensure that the mount point is /dev/shm for this directory. memory_target needs larger /dev/shm
這是服務的狀態……
$ sudo service oracle-xe status LSNRCTL for Linux: Version 11.2.0.2.0 - Production on 21-DEC-2015 12:04:39 Copyright (c) 1991, 2011, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC_FOR_XE))) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 11.2.0.2.0 - Production Start Date 21-DEC-2015 11:31:33 Uptime 0 days 0 hr. 33 min. 5 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Default Service XE Listener Parameter File /u01/app/oracle/product/11.2.0/xe/network/admin/listener.ora Listener Log File /u01/app/oracle/product/11.2.0/xe/log/diag/tnslsnr/infocertcop/listener/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC_FOR_XE))) (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=infocertcop.localdomain)(PORT=1521))) Services Summary... Service "PLSExtProc" has 1 instance(s). Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service... The command completed successfully
我知道我應該能夠解決用 4Gb RAM 重新啟動虛擬機的問題,更改 MEMORY_TARGET 配置,然後再次減少 RAM 的數量,但如果可能的話,我真的更願意發現如何以另一種方式做到這一點。
在文件系統上查找 spfile 的名稱,它應該是這樣的:
/u01/app/oracle/product/11.2.0/xe/dbs/spfileXE.ora
您不應該直接編輯 spfile,因為它包含二進制數據,但您可以從中創建一個純文字的參數文件:
sqlplus /nolog create pfile='/tmp/initXE.ora' from spfile='/u01/app/oracle/product/11.2.0/xe/dbs/spfileXE.ora'; exit
編輯
/tmp/initXE.ora
,修改您想要的值,然後從中重新創建 spfile:sqlplus /nolog create spfile='/u01/app/oracle/product/11.2.0/xe/dbs/spfileXE.ora' from pfile='/tmp/initXE.ora'; exit
完成後,嘗試重新啟動數據庫。
甚至更簡單。創建一個包含這 3 行的 pfile initDB.ora,這將覆蓋 spfile 中的 memory_target 值:
spfile='/u01/app/oracle/product/11.2.0/xe/dbs/spfileXE.ora' memory_target=xG memory_max_target=xG
使用 sqlplus 連接到數據庫。
sql> shutdown immediate sql> startup pfile='/path/initDB.ora' sql> alter system set memory_target=xG scope=spfile sid='*'; sql> alter system set memory_max_target=xG scope=spfile sid='*'; sql> shutdown immediate sql> startup