Oracle

鎖定數據庫後禁用 MEMORY_TARGET?

  • December 23, 2015

我正在虛擬機中設置本地開發環境,在該虛擬機中安裝了 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

引用自:https://dba.stackexchange.com/questions/124228