1. 程式人生 > >ORACLE-12建立使用者出現的錯誤及解決方法

ORACLE-12建立使用者出現的錯誤及解決方法

        在專案開發中,我們難免會遇到需要自己建立表空間,然後自己建立使用者,併為該自己建立的使用者分配自己建立的表空間為預設表空間。這個時候,有一個問題,會讓你一開始很無奈。接下來就說說我的心痛史吧。

       2017-10-23日,我在汕頭。因為專案需要,我在自己使用的計算機中安裝了ORACLE-12C資料庫,並建立了表空間JLM_TAB;接著在建立使用者c##JLM_DMS,並將此使用者的預設表空間指定為剛剛建立的JLM_TAB,指定角色一般都是CONNET和DBA的前兩項。最後單擊應用的時候,報這樣的錯在資料庫PDBORCL表空間JLM_TAB不存在。瞬間整個人完全蒙了,第一次遇到,是有點措手不及。一開始,根本沒仔細看在資料庫

PDBORCL表空間JLM_TAB不存在,這句錯誤提示,還以為在建立使用者本身出現了問題,於是我斷開並刪除當前連結,重新建立連結,在新建立連結下重新建立使用者c##JLM_TAB,同樣指定預設表空間為JLM_TAB,然而資料庫還是報跟之前一樣的錯誤。這下徹底被眼前的錯誤征服了,只能選擇百度了。才找到了錯誤的根本原因。其實分析錯誤的關鍵地方就在於我沒仔細看的錯誤提示:在資料庫PDBORCL表空間JLM_TAB不存在。如果我第一次就詳細閱讀並分析這個錯誤的話,也不至於浪費我那麼多的時間。其實回過頭來仔細看看這句錯誤提示的話,錯誤的根本原因就很明顯了。

        其實錯誤提示將建立使用者失敗的根本原因說的很清楚,這個原因就是

在資料庫PDBORCL中不存在表空間JLM_TAB。額???到了這裡你是不是很不解呀,我在建立該使用者之前明明建立了表空間JLM_TAB的呀,而且建立成功的呀,怎麼錯誤提示的是表空間不存在呢?沒關係,這個時候先抽支菸壓壓驚,我們自己實在不解的話,就去百度看看。果然在百度中找到了答案:因為跟ORACLE-11g相比,ORACLE-12c中加入了一個新特性,那就是PDB的概念,PDB全稱為PluggableDatabase,即可插拔資料庫。在ORACLE-12c之前,例項與資料庫是一對一或多對一的關係(RAC):即一個例項只能與一個數據庫相關聯,資料庫可以被多個例項所載入。而例項與資料庫不可能是一對多的關係。當進入ORACLE-12c後,例項與資料庫可以是一對多的關係。在來說下CDB的概念,CDB全稱ContainerDatabase,中文翻譯為資料庫容器,一個CDB資料庫容器可承載多個可插拔資料庫(PDB)。首先容器資料庫建立新使用者並分配表空間時必須在沒有PDB的情況下進行,當有PDB時,PDB與CDB必須有相同的表空間,否則會報錯。如果是在PDB與CDB有相同表空間的情況下給CDB使用者分配表空間,則分配CDB的表空間給使用者PDB的表空間並不受影響,而且,CDB使用者必須以C##開頭,否則建立不了。

        明白這一點後,我們不難理解,因為我們以SYS或SYSTEM使用者登入資料庫,建立的表空間JLM_TAB其實建立在CDB使用者中。而沒有建立在PDB使用者中,所以PDB中沒有表空間JLM_TAB。此時問題便迎刃而解了。

        首先按快捷鍵win+R開啟執行視窗,輸入cmd,即開啟命令提示符,在命令提示符視窗中輸入 surplus,即開啟ORACLE資料庫自帶的命令操作視窗。在此視窗中輸入 sys as sysdba,意思是ORACLE的系統管理員使用者sys 以sysdba身份或角色登入資料庫。接下來輸入密碼,特別注意的是,輸入密碼是不會顯示任何字元。不知道這一點的人還以為鍵盤壞了呢。然後就登入到ORACLE資料庫中。此時輸入 show con_name 命令,意思是檢視當前容器,此時一定會顯示CDB$ROOT,一看就明白當前容器是CDB,到這裡你應該明白之前建立的表空間JLM_TAB為什麼在CDB中了吧,以為ORACLE資料庫預設所有使用者連線到的是CDB,那麼我們現在需要的是在PDB中建立表空間JLM_TAB,而當前容器是CDB,哈哈,這個問題很好解決,ORACLE強大的命令集足以解決這個問題。接下來就是切換當前使用者sys的容器了,輸入 alter session set container=PDBORCL,此時在用show con_name命令檢視當前容器,顯示的一定是PDBORCL,即此時資料庫容器切換為PDB了。這一步一定要詳細說明下,之前我按照百度上說的,指定要切換的容器時(即該命令“=”後面的值),將該值指定為PDB$SEED,命令是執行成功,而在建立表空間的時候,又報錯:

                            ORA-00604:SQL遞增級 1 錯誤,

                            ORA-16000 : 以只讀的方式開啟PDB$SEED。

        當時又是一陣頭疼,試了幾遍,依然報同樣的錯誤,後來回頭看建立使用者時報的錯,如醍醐灌頂,恍然大悟了。錯誤提示的是在資料庫PDBORCL中表空間JLM_TAB不存在,而我指定的PDB卻是PDB$SEED,這般低階錯誤,人家不報錯才怪,明白錯誤原因後,立即將PDB$SEED修改為PDBORCL,在輸入建立表空間命令,則大功告成。

                        create tablespace JLM_TAB

                            Logging

                            datafile D:\Oracle-12c\tablespace\JLM_TAB\PDB.DBFsize 526m

                            autoextend on next 10m

                            extent management local;

        需要注意的是,在CDB和PDB中的表空間要一致,但.dbf檔案的名稱不能相同,路徑可相同也可不相同。此時使用者建立一定會成功的。

        最後,來補充一下,當我們擺脫ORACLE資料庫的客戶端,如何用SQL語句建立一個使用者,建立使用者的SQL語句如下所示:

                CREATE USER C##DMS_OPR IDENTIFIED BY JLM2018188

                DEFAULT TABLESPACE "DMS_TAB"

                TEMPORARY TABLESPACE "TEMP"

        特別注意:當我們使用alter session set container=pdbmorcl將資料庫切換為PDB後,有時候執行建立表空間語句時會報錯:ORA-01109: 資料庫未開啟,這個時候我們不要驚慌失措,其實出現此問題的原因就是剛從CDB切換為PDB資料庫後的PDB沒有開啟,所以就無法執行建立表空間的語句。解決方法就是將PDB開啟,其操作命令是:alter pluggable database [PDB資料庫名稱] open;  我的本地PDB的名稱是PDBMORCL,所以上述命令為:

                                        alter pluggable database PDBMORCL open;

        這次經歷雖然花費了我很多時間,但這就是每個程式設計師走過的路,每一個程式設計師都是在這些錯誤中慢慢摸索,慢慢成長起來的。也讓我明白了一個道理,以後在工作中遇到問題,首先一定不要著急,仔細看看所報的錯誤,在錯誤中發現原因,並冷靜思考,得到解決問題的方法,加油,只要有勤奮好學,努力刻苦,鍥而不捨,自律自信的精神,你的優秀是早晚的事。