Oracle的ERP在客戶基本檔的from出現一個錯誤: FRM-40654: Record has been updated. Requery block to see change
一開始以為是有 Table Lock,但是查了一下,並沒有發現有Table Lock的現象,而且只有單一客戶的資料會有這個問題,最後發現是相關的 Table中,有一個欄位的資料前後有空白造成的,更新資料就解決了。
簡單紀錄一下,下次再出現時就知道如何解決了。
Oracle的ERP在客戶基本檔的from出現一個錯誤: FRM-40654: Record has been updated. Requery block to see change
一開始以為是有 Table Lock,但是查了一下,並沒有發現有Table Lock的現象,而且只有單一客戶的資料會有這個問題,最後發現是相關的 Table中,有一個欄位的資料前後有空白造成的,更新資料就解決了。
簡單紀錄一下,下次再出現時就知道如何解決了。
今天突然遇到一個很奇怪的現象,已經開啟Form的使用者沒有異樣,但是重新於瀏覽器中成功登入後,在開啟Forms時卻出現無法連線資料庫的訊息。
因為自己並沒有對EBS做任何設定,也沒有異動DB設定,難道被使用者或其他的資訊人員弄壞了。
不過就在檢查DB的Log之後,發現是ORA-00020: maximum number of processes (1000) exceeded
這個錯誤就是超過了DB設定的process的值,所以後來的連線當然會失敗。
既然知道了原因,可依下列步驟來修改process的設定值
SQL> alter system set processes=25 scope=spfile;
由於processes參數是靜態參數,必需重啟資料庫使參數調整生效
SQL> shutdown immediate;
SQL> startup;
可執行下列的SQL來檢查process、session目前使用量、最大使用量、限制量
SQL> SELECT RESOURCE_NAME,
CURRENT_UTILIZATION, MAX_UTILIZATION, LIMIT_VALUE
FROM V$RESOURCE_LIMIT
WHERE RESOURCE_NAME IN ( 'sessions', 'processes');
利用下列的SQL來找出inactive大於24小時的session,last_call_et是指最後一個SQL執行完後到sysdate的時間,單位為秒
SQL> select 'alter system kill session ''' || sid || ',' || serial# || ''';' ,status,schemaname,osuser,process,
machine,program,sql_id,module,action,logon_time,last_call_et
from v$session where status = 'INACTIVE'
and last_call_et > 86400
order by last_call_et desc;
今天遇到Concurrent Program無法運行,經檢查後,發現是Internal Manager掛掉了。
Internal Manager是管理所有Concurrent Manager的管理程序,不會影響到EBS的Forms,所以它掛掉並不會影響EBS的操作,有時候會沒有發現掛掉了。
進入System Adminisrator,查看Concurent -> Manager -> Administer,檢查Internal Manager的Autual是否>=1 ,如果為0則表示沒有正常運行。
我的作法是先登入到EBS的作業系統,例如我的是Solaris,先執行下列的指令後再手動把這些process刪掉。
$ ps -ef |grep FNDLIBR
$ kill -9 <Process ID>
或是執行adcmctl.sh把相關的service停下來並手動把無法停用的process刪掉
$ adcmctl.sh stop apps/XXXXX
$ ps -ef |grep FNDLIBR
$ kill -9 <Process ID>
接著重啟Concurrent Manager:
$ adcmctl.sh start apps/XXXXX
經過上述的步驟,我的ICM終於恢復了,也不用重開整個EBS,接下來要查詢log,以便找出問題。
有三個方式可以找到ICM的log:
1、以apps User登入到系統,並執行下列指令如下,例如找到log file:TEST_0826.mgr
$ cd $APPLCSF/$APPLLOG
$ ls -lrt *$TWO_TASK*.mgr
-rw-r--r-- 1 testmgr dba 5900612 Sep 12 10:40 TEST_0826.mgr
2、執行下列的SQL,以找出log file
SELECT fp.logfile_name as "ICM_LOG_NAME"
FROM fnd_concurrent_processes fp, fnd_concurrent_queues fq
WHERE fp.concurrent_queue_id = fq.concurrent_queue_id
AND fp.queue_application_id = fq.application_id
AND fq.manager_type = '0'
AND fp.process_status_code = 'S';
3、在EBS內登入到Sysadmin Administor Responsibility
Go to ->Concurrent -> Manager -> Administer -Processes -> Click button Internal Manager Log.如下圖
找到log後,查到的問題是ORA-04030: out of process memory,是一支concurrent request造成的。
今天遇到一個任務,要開啟Request的Debug Options功能,經一番查詢之後,找到開啟的方式,致於如何使用,待下次再來測試。
啟用後,Debug Options按鈕為可點選狀態
今天程式開發人員有一個需求,想找出一個客製的TABLE:WP_TIMES,有在哪一個EBS forms中使用
因為手動一個一個找實在太花費時間了,所以就寫了一個簡易版的比對shell script,在此記錄一下,未來應該還有機會用到。
我的想法是由特定的目錄,如:ap,自動抓取底下指定條件的檔案,再以比對字串的方式將檔案名稱output到螢幕上,其中 -n 是用來判斷變值是否為空值
#!/bin/bash
for f in ap/*.fmb
do
a=`grep 'WP_TIMES' $f`
if [ -n "$a" ]
then
echo $f
fi
done
有一位使用者在設定Folder時,不小心設定錯誤,導致Form一直在轉圈圈,無法正常運作。
因為Form一直在圈圈,所以使用者無法自行刪除這個錯誤的Folder。
此時可以用管理者權限來刪除使用者的Folder,路徑:System Administrator -> Application -> Administer Folders
有三個選項可以找出Folder,找到之後在工具列上按下刪除鍵即可
為了讓EBS 11i還可以再延續使用,所以需要測試Edge的IE Mode模式。
先參考這篇文章:https://blog.twtnn.com/2021/06/edgeie.html
Edge的版本是:98.0.1108.56
在網路上搜尋到的方式是直接在Edge的設定內指定,不過好像有預設30天的限制,群組原則內可以修改限制。
先到微軟的網站上依Edge的版本來下載相應的群組原則
開啟群組原則gpedit.msc,並新增原則
在清單的XML檔內,要指定使用的IE版本,指定在<compat-mode>,注意<open-in>不是指定版本,而是表示要用IE Mode來開啟。
<site url="ebs.test.tw">
<compat-mode>IE5</compat-mode>
<open-in>IE11</open-in>
</site>
如果指定如下,則以IE Mode開啟網站,預設是IE 11
<site url="ebs.test.tw">
<compat-mode>Default</compat-mode>
<open-in>IE11</open-in>
</site>
如果要把網站加入安全性清單內,可至控制台 -> 網路和網際網路 -> 網路和網際網路選項,在「安全性」的頁簽內加入
今天在觀察Oracle ERP的效能時,發現AP Tier的CPU有偏高的現象,而且持續了好幾天。
因為之前發生時,曾用過兩種方案,一個是重開ERP就可以恢復正常;另一個是強制刪掉可能的zombie process
以下記錄我自己參考Document 1330392.1後的操作,非官方正式的SOP
我們AP Tier的作業系統是Solaris,首先執行下列的指令來觀察Process(依使用率來排序)
# prstat -avm
結果如下圖,有兩個f60webmx的CPU使用率偏高,f60webmx就是EBS的Forms
將上面兩個PID記錄下來,以下列的SQL來反查是哪一個Sessions
SQL> select * from v$session where process in ( <PID> );
再將上面的PID以下列的SQL來查詢相關資料
SQL> select * from FND_LOGIN_RESP_FORMS WHERE audsid in ( <PID)> );
如果FND_LOGIN_RESP_FORMS的end_time的值不是null,則表示該session已經結束並且可以手動刪除。
我是會再看v$session的status是否為inactive,如果是,也是可以手動刪除。
上述步驟查詢可能沒有相關的Session或 FND_LOGIN_RESP_FORMS WHERE audsid,則直接刪掉pid
把找到的session記錄SID、SERIAL#後,再以下列的SQL來強制kill session
SQL> alter system kill session '<SID>,<SERIAL#>';
接著在再刪掉作業系統的pid
# kill -9 <PID>
另外我會特別注意查詢到的v$session欄位ACTION是不是像FRM:<USER_NAME>:<RESPONSIBILITY_NAME>,
或是Concurrnet Request,如果是,通常都是使用者開啟的程式,刪掉就比較不用擔心;
如果不是,就要特別注意是否是Oracle的背景程式或特殊程式。
為了安全性,所以更改了一些EBS帳號的預設密碼,但是遇到guest帳號密碼卻無法更改
這表示guest帳號並不是單純的帳號,所以到網路上搜尋一下。
找到的一份文件提到System Administrator -> System profile中也有guest password的參數,當然也是無法修改
Do not disable the GUEST user account.
Do not disable the SYSADMIN user account until you have created other accounts with similar privilege.
所以只好再找一下文件,看看是否有其他的方式可以更改,最後找到的步驟如下,先記錄下來,以備之後使用。
「注意密碼必須要大寫」
1、在Unix上以AP帳號登入,如applmgr
2、修改AutoConfig的context file的value,變數名稱是「s_guest_pass」
路徑:<INST_TOP>/appl/admin/<CONTEXT_NAME>.xml
3、重跑AP上的AutoConfig
4、檢查密碼是已更新,執行下列SQL,回傳值應該要是「Y」
SQL> select fnd_web_sec.validate_login(‘GUEST’,”) from dual;
5、以sysadmin登入EBS,選擇「CRM HTML Administration」 responsibility,並依下列路徑點選
Setup -> Settings -> System -> Properties -> Self Service User
6、Self Service User網頁開啟,再點選Properties -> Advanced -> JTF,並檢查參數guest_password的密碼是否正確
7、重啟AP





EBS在運行期間,會增加許多的記錄檔、暫存檔等,之前一直沒注意,所以產生超過50G的無用檔案。
為了怕之後忘記,所以記錄一下。
主要是清除下列路徑的檔案:
$COMMON_TOP/admin/log/SID_HOST/*
$COMMON_TOP/admin/out/SID_HOST/*
$APPL_TOP/admin/SID/log
$APPL_TOP/admin/SID/out
/usr/tmp
$IAS_ORACLE_HOME/Apache/Apache/logs
$IAS_ORACLE_HOME/Apache/Jserv/logs
$OA_HTML/cabo/images/cache/en (依據ERP使用的語言)
