您的位置:首頁>正文

開發過程中遇到Oracle的兩三事

前言

最近由於一些原因, 把公司用的開發環境搭建了一遍, 具體是orcle11g+weblogic12.1, 過程中總結出一些問題, 在此少做介紹。

OracleDBconsoleorcl服務無法啟動的原因及解決方案

OracleDBConsole[SID]服務簡介:

OracleDBConsole[SID]服務負責Windows平臺下啟動Oracle企業管理器, 從Oracle 10g開始引入這個服務, 也是從Oracle 10g開始, Oracle的企業管理器從用戶端形式變為流覽器操作模式, 這裡的[SID]即Oracle SID, 如果是默認安裝就是orcl, 故這個服務在你的機器上可能就是OracleDBConsoleORCL, 事實上在我的機器上也是它。

本文基於Oracle 11g, 作業系統為Windows 7 x64, 故本文描述的解決辦法僅供參考。

故障描述

啟動OracleDBConsoleORCL服務時, 報:

Windows 不能在 本地電腦 啟動 OracleDBConsoleORCL。 有關更多資訊, 查閱系統事件日誌。

如果這是非 Microsoft 服務, 請與服務廠商聯繫, 並參考特定服務錯誤代碼 1。

在應用程式事件日誌中記錄了如下錯誤資訊:

Process exited abnormally during initialization.

解決過程

嘗試從命令列下啟動該服務, 也以失敗告終, 正尋思著是否刪除資料庫再重新安裝, 突然想起Oracle企業管理器其實是一個單獨的元件, 可以將其單獨刪除, 再重新安裝的, 其實這裡並不是刪除Oracle企業管理器, 而是Oracle資料庫控制台資料檔案庫, 刪除資料檔案庫會同時刪除OracleDBConsoleORCL服務, 並刪除使用者SYSMAN及其所屬物件, 重新創建資料檔案庫就會重新添加OracleDBConsoleORCL服務, 並創建SYSMAN使用者及其所屬對象。 搞清楚這一點關係後, 開始動手實施修復。

首先刪除資料檔案庫, 注意此時Oracle的監聽器服務和資料庫服務必須處於啟動狀態,

因為刪除命令會連接到資料庫刪除SYSMAN使用者及其所屬物件:

C:>emca -repos drop

EMCA 開始於 2009-1-31 9:13:24

EM Configuration Assistant, 11.1.0.5.0 正式版

版權所有 (c) 2003, 2005, Oracle。 保留所有權利。

輸入以下資訊:

資料庫 SID: orcl

監聽程式埠號: 1521

SYS 用戶的口令:【輸入SYS使用者的口令, 輸入口令時螢幕不會回顯】

SYSMAN 使用者的口令:【輸入SYSMAN用戶的口令】

SYSMAN 用戶的口令:

是否繼續? [是(Y)/否(N)]: y

2009-1-31 9:15:04 oracle.sysman.emcp.EMConfig perform

信息: 正在將此操作記錄到 c:appAdministratorcfgtoollogsemcaorclemca_2009_01

_31_09_13_24.log。

2009-1-31 9:15:05 oracle.sysman.emcp.EMReposConfig invoke

信息: 正在刪除 EM 資料檔案庫 (此操作可能需要一段時間)...

開始等待刪除, 這個過程可能比較長, 朋友們可以去技術棧的網站, www.jishux.com參觀一下。

刪除結束後, 往往有人會想到使用命令重新創建資料檔案庫, 但經過我多次嘗試, 使用這種辦法創建好資料檔案庫後, OracleDBConsoleORCL服務仍然無法啟動, 企業管理器依舊無法使用, 於是想到使用dbca來創建, 於是在運行視窗輸入:dbca,

啟動資料庫配置助手, 在第一步時選擇“配置資料庫選件”, 後面的操作只需要一直點擊下一步就可以了, 注意在選擇是否使用EM資料檔案庫時, 一定要選中, 默認沒有選中, dbca檢查到系統中已經沒有EM資料檔案庫, 於是就會重新創建, OracleDBConsoleORCL服務也會重新添加了, 這也會花一段時間, 如果dbca重新配置過程中不出現錯誤, 那配置結束後, OracleDBConsoleORCL服務就能夠正常啟動, 就可以正常使用Oracle企業管理器了。 如果刪除EM資料檔案庫不徹底, 運行dbca期間可能會報錯, 一般是SYSMAN使用者及其物件沒有刪除乾淨, 遇到這種問題時, 只需要再次運行一次emca –repos drop即可。

如果在刪除EM資料檔案庫時, 刪除了SYSMAN使用者及其所屬對象, 但OracleDBConsole[SID]服務沒有刪除時, 如果該服務還能夠啟動,

並能夠通過流覽器進入, 那此時就可以使用emca –repos create重新創建EM資料檔案庫即可。

總結

經過這次冒險, 總覺得Oracle的OracleDBConsole[SID]服務很脆弱, 在沒有任何誤操作的情況下, 重新開機電腦後, 它也可能就啟動不了了, 但在這時, 大家一定要保持冷靜, 多思考, 辦法總是有的, 不到萬不得已, 不要重新安裝, 建議大家在重新開機系統前, 先手動停止OracleDBConsole[SID]服務、監聽器服務和資料庫服務。

ORACLE導入遇到ORACLE錯誤959解決方法

如果讀者朋友們按照上述方法, 還是啟動不了本地資料庫, 本著解決問題的辦法, 還是重裝11g比較好, 畢竟win上的服務端不是太穩定。 安裝好Oracle11g之後, 利用plsql連接本地orcl, 在導入dmp檔時, 有一張表未導入成功,報了如下錯誤:

IMP-00003: 遇到 ORACLE 錯誤 959ORA-00959: 表空間 'XXXXXXXXXXX' 不存在。

查詢的確沒有對應的表空間:

select * from dba_data_files where tablespace_name = 'XXXX'1

添加上對應的表空間, 再重新導入:

create tablespace ts_something logging datafile '/dbf1/ts_sth.dbf' size 32m autoextend on next 32m maxsize 2048m extent management local; 1234567

導入成功。

注:表空間自增長, 其大小也不會超過最大大小, 因此在設置大小時可以將MAXSIZE 設置為unlimited;

Oracle sys和system使用者、sysdba 和sysoper系統許可權、sysdba和dba角色的區別

sys和system用戶區別

1)最重要的區別, 存儲的資料的重要性不同

sys所有oracle的資料字典的基表和視圖都存放在sys用戶中, 這些基表和視圖對於oracle的運行是至關重要的, 由資料庫自己維護, 任何使用者都不能手動更改。 sys用戶擁有dba, sysdba, sysoper等角色或許可權, 是oracle許可權最高的用戶。

system使用者用於存放次一級的內部資料, 如oracle的一些特性或工具的管理資訊。 system用戶擁有普通dba角色許可權。

2)其次的區別, 許可權的不同

system用戶只能用normal身份登陸em, 除非你對它授予了sysdba的系統許可權或者syspoer系統許可權。

sys使用者具有“SYSDBA”或者“SYSOPER”系統許可權,登陸em也只能用這兩個身份,不能用normal。

以sys用戶登陸Oracle,執行select * from V_$PWFILE_USERS;可查詢到具有sysdba許可權的用戶,如:

SQL> select * from V_$PWFILE_USERS;

USERNAME SYSDBA SYSOPER

SYS TRUE TRUE

Sysdba和sysoper兩個系統許可權區別

normal 、sysdba、 sysoper有什麼區別

normal 是普通用戶

另外兩個,你考察他們所具有的許可權就知道了

sysdba擁有最高的系統許可權,登陸後是 sys

sysoper主要用來啟動、關閉資料庫,sysoper 登陸後使用者是 public

sysdba和sysoper屬於system privilege,也稱為administrative privilege,擁有例如資料庫開啟關閉之類一些系統管理級別的許可權sysdba和sysoper具體的許可權可以看下表:

系統許可權

sysdba

sysoper

區別

Startup(啟動資料庫)

startup

Shutdown(關閉資料庫)

shutdown

alter database open/mount/backup

alter database open/mount/backup

改變字元集

none

create database(創建資料庫)

None不能創建資料庫

drop database(刪除資料庫)

none

create spfile

create spfile

alter database archivelog(歸檔日誌)

alter database archivelog

alter database recover(恢復資料庫)

只能完全恢復,不能執行不完全恢復

擁有restricted session(會話限制)許可權

擁有restricted session許可權

可以讓用戶作為sys用戶連接

可以進行一些基本的操作,但不能查看使用者資料

登錄之後使用者是sys

登錄之後用戶是public

system如果正常登錄,它其實就是一個普通的dba用戶,但是如果以as sysdba登錄,其結果實際上它是作為sys用戶登錄的,這一點類似Linux裡面的sudo的感覺,從登錄資訊裡面我們可以看出來。因此在as sysdba連接資料庫後,創建的物件實際上都是生成在sys中的。其他用戶也是一樣,如果 as sysdba登錄,也是作為sys用戶登錄的,看以下實驗:

SQL> create user strong identified by strong;

用戶已創建。

SQL> conn strong/strong@magick as sysdba;

已連接。

SQL> show user;

USER 為 "SYS"

SQL> create table test(a int);

表已創建。

SQL> select owner from dba_tables where table_name='test';

未選定行 //因為創建表時oracle自動轉為大寫,所以用小寫查的時候是不存在的;

SQL> select owner from dba_tables where table_name='TEST';

OWNER

------------------------------

SYS

dba和sysdba的區別

dba、sysdba這兩個系統角色有什麼區別呢:

在說明這一點之前我需要說一下oracle服務的創建過程

創建實例→·啟動實例→·創建資料庫(system表空間是必須的)

啟動過程:

實例啟動→·裝載資料庫→·打開資料庫

sysdba,是管理oracle實例的,它的存在不依賴于整個資料庫完全啟動,只要實例啟動了,他就已經存在,以sysdba身份登陸,裝載資料庫、打開資料庫。只有資料庫打開了,或者說整個資料庫完全啟動後,dba角色才有了存在的基礎!

Oracle如何創建用戶

重裝好orcle11g之後,資料庫的使用者必然也要重建,下面我來講一下創建用戶操作。什麼,你hibernate裡面jdbc配置的是sys帳戶?那當我沒說(笑哭)。

1、打開oracle協力廠商工具,如plsq,然後用一個具有dba許可權的用戶登錄。

2、然後打開一個SQL視窗。

3、執行語句:

create user 用戶名 identified by 密碼;--其中用戶名為英文,密碼為數位或字母或英文符號或組合。

4、執行完畢後,可按需要給使用者賦予相應的許可權,如:

grant connect,resource,dba to 用戶名;--賦予該用戶許可權

切換資料來源

當我們需要切換weblogic資料來源位址的時候,會經常出現啟動更改失敗的情況,通常遇到這種情況的解決辦法是

將部署伺服器取消勾選,然後再切換資料來源ip位址,這樣大部分都能啟動更改。切換好之後,在監視-測試裡面,可以測試一下位址是否OK。

常見異常之——java.lang.classnotfoundexception

資料庫和中介軟體都安裝好了,下面開始導入專案,打開myeclipse導入專案的workspace檔,設置weblogic啟動參數,啟動,可是一直報java.lang.classnotfoundexception的錯,找了半天沒查出原因,按理說之前項目都是可以運行的,不懂這次為什麼會報錯。後來發現,原來是bulidpath裡面的jar包衝突所致。

抱著學習的心態整理一下這個異常,避免以後走彎路,有對這個異常比較瞭解的大神也請多多指教!

ClassNotFoundException是無法找到指定的類異常。

當應用程式試圖使用以下方法通過字串名載入類時,拋出該異常:

1、Class 類中的 forName 方法。

2、 ClassLoader 類中的 findSystemClass 方法。

3、 ClassLoader 類中的 loadClass 方法。

造成異常的常見原因:

1 所需要的支援類庫放錯了地方,並沒有放在類路徑(CLASSPATH環境變數)裡面。

2 使用了重複的類庫,且版本不一致。導致低版本的被優先使用。

3 類名錯了,一般是使用Class.forName的時候,手工指定了類名的情況。

4 沒有導入純JAVA驅動包。

建議的解決方案:

1 確認你的類庫在系統的CLASSPATH下面,如果是Tomcat,則可以放在tomcat/lib/目錄下面。

2 刪除重複的類庫,只保留最新的。

sys使用者具有“SYSDBA”或者“SYSOPER”系統許可權,登陸em也只能用這兩個身份,不能用normal。

以sys用戶登陸Oracle,執行select * from V_$PWFILE_USERS;可查詢到具有sysdba許可權的用戶,如:

SQL> select * from V_$PWFILE_USERS;

USERNAME SYSDBA SYSOPER

SYS TRUE TRUE

Sysdba和sysoper兩個系統許可權區別

normal 、sysdba、 sysoper有什麼區別

normal 是普通用戶

另外兩個,你考察他們所具有的許可權就知道了

sysdba擁有最高的系統許可權,登陸後是 sys

sysoper主要用來啟動、關閉資料庫,sysoper 登陸後使用者是 public

sysdba和sysoper屬於system privilege,也稱為administrative privilege,擁有例如資料庫開啟關閉之類一些系統管理級別的許可權sysdba和sysoper具體的許可權可以看下表:

系統許可權

sysdba

sysoper

區別

Startup(啟動資料庫)

startup

Shutdown(關閉資料庫)

shutdown

alter database open/mount/backup

alter database open/mount/backup

改變字元集

none

create database(創建資料庫)

None不能創建資料庫

drop database(刪除資料庫)

none

create spfile

create spfile

alter database archivelog(歸檔日誌)

alter database archivelog

alter database recover(恢復資料庫)

只能完全恢復,不能執行不完全恢復

擁有restricted session(會話限制)許可權

擁有restricted session許可權

可以讓用戶作為sys用戶連接

可以進行一些基本的操作,但不能查看使用者資料

登錄之後使用者是sys

登錄之後用戶是public

system如果正常登錄,它其實就是一個普通的dba用戶,但是如果以as sysdba登錄,其結果實際上它是作為sys用戶登錄的,這一點類似Linux裡面的sudo的感覺,從登錄資訊裡面我們可以看出來。因此在as sysdba連接資料庫後,創建的物件實際上都是生成在sys中的。其他用戶也是一樣,如果 as sysdba登錄,也是作為sys用戶登錄的,看以下實驗:

SQL> create user strong identified by strong;

用戶已創建。

SQL> conn strong/strong@magick as sysdba;

已連接。

SQL> show user;

USER 為 "SYS"

SQL> create table test(a int);

表已創建。

SQL> select owner from dba_tables where table_name='test';

未選定行 //因為創建表時oracle自動轉為大寫,所以用小寫查的時候是不存在的;

SQL> select owner from dba_tables where table_name='TEST';

OWNER

------------------------------

SYS

dba和sysdba的區別

dba、sysdba這兩個系統角色有什麼區別呢:

在說明這一點之前我需要說一下oracle服務的創建過程

創建實例→·啟動實例→·創建資料庫(system表空間是必須的)

啟動過程:

實例啟動→·裝載資料庫→·打開資料庫

sysdba,是管理oracle實例的,它的存在不依賴于整個資料庫完全啟動,只要實例啟動了,他就已經存在,以sysdba身份登陸,裝載資料庫、打開資料庫。只有資料庫打開了,或者說整個資料庫完全啟動後,dba角色才有了存在的基礎!

Oracle如何創建用戶

重裝好orcle11g之後,資料庫的使用者必然也要重建,下面我來講一下創建用戶操作。什麼,你hibernate裡面jdbc配置的是sys帳戶?那當我沒說(笑哭)。

1、打開oracle協力廠商工具,如plsq,然後用一個具有dba許可權的用戶登錄。

2、然後打開一個SQL視窗。

3、執行語句:

create user 用戶名 identified by 密碼;--其中用戶名為英文,密碼為數位或字母或英文符號或組合。

4、執行完畢後,可按需要給使用者賦予相應的許可權,如:

grant connect,resource,dba to 用戶名;--賦予該用戶許可權

切換資料來源

當我們需要切換weblogic資料來源位址的時候,會經常出現啟動更改失敗的情況,通常遇到這種情況的解決辦法是

將部署伺服器取消勾選,然後再切換資料來源ip位址,這樣大部分都能啟動更改。切換好之後,在監視-測試裡面,可以測試一下位址是否OK。

常見異常之——java.lang.classnotfoundexception

資料庫和中介軟體都安裝好了,下面開始導入專案,打開myeclipse導入專案的workspace檔,設置weblogic啟動參數,啟動,可是一直報java.lang.classnotfoundexception的錯,找了半天沒查出原因,按理說之前項目都是可以運行的,不懂這次為什麼會報錯。後來發現,原來是bulidpath裡面的jar包衝突所致。

抱著學習的心態整理一下這個異常,避免以後走彎路,有對這個異常比較瞭解的大神也請多多指教!

ClassNotFoundException是無法找到指定的類異常。

當應用程式試圖使用以下方法通過字串名載入類時,拋出該異常:

1、Class 類中的 forName 方法。

2、 ClassLoader 類中的 findSystemClass 方法。

3、 ClassLoader 類中的 loadClass 方法。

造成異常的常見原因:

1 所需要的支援類庫放錯了地方,並沒有放在類路徑(CLASSPATH環境變數)裡面。

2 使用了重複的類庫,且版本不一致。導致低版本的被優先使用。

3 類名錯了,一般是使用Class.forName的時候,手工指定了類名的情況。

4 沒有導入純JAVA驅動包。

建議的解決方案:

1 確認你的類庫在系統的CLASSPATH下面,如果是Tomcat,則可以放在tomcat/lib/目錄下面。

2 刪除重複的類庫,只保留最新的。

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示