從來沒有想過,我又要回過頭來重新撿起Oracle。還記得那是大學的時候,非常羨慕我的Oracle數據庫老師,各種問題都能搞定,以至於在大學的時候,學習Oracle記了N多的筆記,各種學習心得,不過那個時候傻得不知道寫博客,到今天總結的筆記也不知道去哪裡了。
從大城市回到了家鄉小城市,大城市互聯網公司幾乎沒有用Oracle這種東西的,基本都是MySQL等,而回家以後,這裡幾乎沒有互聯網公司,都是傳統的IT企業,用的都是Oracle數據庫,如我現在的東家。
重新撿起Oracle,真的是感慨萬千,幾分熟悉,又是幾分陌生。知識就是在你一段時間不用以後,就會慢慢的變的陌生起來。以至於今天再看Oracle,僅僅是似曾相識。從這篇文章起,就開始我學習Oracle的漫長之旅。希望有搞Oracle的朋友一起作伴,一同交流。
搞Oracle,第一件事就是客戶端連接網絡上的Oracle數據庫。一般我們用的客戶端都是 PL/SQL Developer。現在問題來了,我安裝完PL/SQL Developer以後,死活就是連不上。好吧,我承認,不Google,我搞不定。根據對應的錯誤提示,Google之後,就有了這篇文章。
如果你做過網絡開發,對於監聽listen就比較熟悉了,監聽是什麼,在網絡開發中,就是監聽某個端口,等待客戶端的連接。同理,在Oracle中,監聽的意思也和這差不多。
在Oracle數據庫服務器中,通過一個叫“監聽器”的組件接收來自客戶端的連接請求,它是客戶端和 服務器端中間的橋梁。監聽器雖然在Oracle服務器端,但是它和Oracle主進程並不綁定,它是一個獨立運行在服務器端的後台進程,獨立於數據庫運行。它負責對客戶端傳入的連接請求進行監聽,並且對服務器端的連接負荷進行調整。當客戶端准備建立一個到服務器端的連接時,監聽器接收客戶端的連接請求, 然後再將這個客戶端連接請求交給服務器進行處理,一旦客戶端和服務器建立連接,客戶端和服務器以後就直接進行通信,而不再需要監聽器的參與,這就好比師傅 領進門,修行靠個人。就如下圖所示:
以上就是監聽器干的活,也就是說,你對數據庫服務器的第一次,肯定會給監聽器,如果監聽器沒有配好,你就甭想連數據庫了。那麼,怎麼才能配好監聽器呢?
說到配監聽器,就不得不先來說說listener.ora、sqlnet.ora和tnsnames.ora這三個文件,這三個文件別看後綴名是ora,其實就是一文本文件,可以使用記事本打開看看。
#這是一個名為LISTENER1的監聽器#監聽的協議是TCP協議#監聽的主機IP是127.0.0.1#監聽的端口是1521端口
LISTENER1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521)))#記錄了監聽器LISTENER1服務的全局數據庫名、數據庫路徑和數據庫實例名
SID_LIST_LISTENER1 =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = ORCL)
(ORACLE_HOME = C:\Oracle11g\product\11.2.0\dbhome_1)
(SID_NAME = ORCL)
)
)
只有我們在服務器端配置好了監聽,客戶端才有可能連上數據庫服務器,至於客戶端是如何連數據庫服務器的,稍後再講。
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
這個sqlnet.ora文件實際上就是一個配置文件,主要是和接下來說的tnsnames.ora配合使用。關於sqlnet.ora的具體作用,請參見這篇《Oracle學習筆記——詳解sqlnet.ora的作用》。
#ORCL是個別名#這條信息記錄了我們使用TCP協議,去連接IP地址為127.0.0.1,端口號為1521的數據庫主機上服務名為orcl的數據庫
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
以後,我們還會配置更多的數據庫連接信息,比如我要連接192.168.10.2主機上的數據庫,我們只需要在tnsnames.ora中繼續追加新的連接信息即可,比如:
STDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.2)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = stdb)
)
)
看到這裡,你可能覺的你已經明白了tnsnames.ora文件的作用了,推薦你繼續閱讀以下這篇《Oracle學習筆記——詳解sqlnet.ora的作用》,更好的理解sqlnet.ora與tnsnames.ora文件是如何搭配工作的。
好了,配置監聽主要就是配置listener.ora、sqlnet.ora和tnsnames.ora這三個文件,而在服務器端,只需要我們搞定listener.ora文件就可以了。
上面也說了,監聽器是一個獨立的進程,那麼配置好了監聽,就需要啟動監聽程序,那麼如何啟動呢?請閱讀下面的【常用命令】一節。
客戶端配置就更簡單了,在【listener.ora、sqlnet.ora和tnsnames.ora文件】一節中,介紹tnsnames.ora文件時,就進行了舉例說明,這裡就不再多說了。
哦,說了這麼多了,該回到我的問題上來了,我就是連不上遠程的數據庫,歸根到底就是沒有在客戶端配置遠程數據庫信息,這個問題很簡單,但是如果你不懂得這中間的原理的話,你就不會了解這個問題的本質。
很多時候,一個問題就是很簡單,就是一個很簡單的知識點,今天多總結一點,就為明天少挖一個坑,或者就會幫別人多填一個坑。
上面也說了,服務器配置完成以後,如何啟動監聽進程,查看監聽器的狀態,停止監聽進程呢?在工作中,我們會經常用到下面的一些命令:
lsnrctl start <監聽器的名字>// 啟動名為LISTENER的監聽器
lsnrctl start LISTENER
當我們不指定監聽器的名字時,就默認啟動LISTENER監聽器;
lsnrctl stop <監聽器的名字>// 關閉名為LISTENER的監聽器
lsnrctl stop LISTENER
當我們不指定監聽器的名字時,就默認關閉LISTENER監聽器;
lsnrctl status <監聽器的名字>// 查看名為LISTENER的監聽器的運行狀態
lsnrctl status LISTENER
當我們不指定監聽器的名字時,就默認查看LISTENER監聽器的狀態。
現在服務器端的監聽進程已經啟動起來了,客戶端也已經配置好了,那麼如何進行連通性測試呢?
tnsping <客戶端配置的別名>// 判斷是否連通ORCL別名對應服務器上的數據庫
tnsping ORCL
好了,總結完畢,一個小小的知識點,背後卻是隱藏著這麼多的內容。以謙虛的態度去學習每一個知識點。從這篇文章開始,開始Oracle學習的漫長之旅。有任何問題,請留言,希望和Oracle愛好者一起學習交流。