作為1個開發人員,數據庫知識肯定是需要我們掌握的。但是目前公司的數據庫都是有專門的DBA保護的,1般都是給我們1個環地步址,然后我們書寫CRUD SQL。而且公司產品要求是可以跨數據源的,這樣平時基本上都不太關心特定數據庫平臺的操作。結果致使自己的DB知識嚴重不足。今天由于1些緣由,需要在外網服務器上搭建演示環境,結果需要“悲劇”的自己操作數據庫。
任務:在外網服務器上搭建演示環境,包括服務器、代碼、數據庫。
解決方案:
(1)找1個新的產品安裝程序,然后去服務器安裝。
(2)把自己本地用的開發環境copy到服務器。
分析:
方案1,肯定可以安裝上產品,看起來是最簡單的方案。但是由于內部開發版本還不問題,沒有統1的完全的安裝程序,需要東拼西湊把各個部門的產品都找齊,然后安裝、然后打補釘。由于演示的是開發產品,所以終究代碼還不1定能運行,時間也會比較長。
方案2,看起來比較簡單,但是由于外網服務器沒法訪問數據庫服務器,所以需要自己單獨做1下數據庫的遷移(歷來沒做過)。糾結了1下,最后為了不麻煩選中了方案2(-_-! 把自己坑了),然后跟測試要了1些資料:
看到上面的操作資料,有點頭大,之前很少操作Oracle數據庫,對Oracle數據庫的結構不是很了解。上面的語句有似曾相識的感覺(絕對不是初戀的感覺),本著DB不要亂操作的原則。首先還是先補充點Oracle數據庫的基礎知識吧。
資料:(網上很多)
Oracle用戶/表空間/表的關系http://www.cnblogs.com/adforce/p/3312252.html
EXPDP工具:http://jingyan.baidu.com/article/9113f81b2040862b3314c757.html
Sqlplus使用:http://blog.chinaunix.net/uid⑺4941-id⑻5228.html
Directory命了:http://blog.csdn.net/bisal/article/details/24667609
整理:
1.Directory命令
Directory命了用于定義1個目錄對象,Oracle用我們定義的目錄對象將數據導出到指定的位置,就好像我們編程的時候常常定義1個目錄變量,然后編程的時候直接用這個變量,這樣就不用每次都寫這個變量致使目錄位置不1致了。Directory的信息存儲在系統的dba_directories表中。
2.User、tablespace、table之間的關系
Oracle數據庫的結構和MySql這類有很大區分,1邊數據庫的結構我們都從兩個方面羅列,物理層面和邏輯層面,也就是我們常說的數據庫的3層模式,兩種映照。Oracle的物理存儲結構很復雜,這里不討論,而且跟這次的數據遷移無關,如果硬要說,那導出的DMP文件就能夠認為是Oracle的物理存儲的1種。
在MySql數據庫中,我們可以新建1個數據庫(create database)然后為用戶授權這個庫的權限。在Oracel中,一樣有用戶的概念,但是所謂的tablespace就能夠認為是database,只不過是邏輯組織,table就是實際我們操作的表。
援用1個形象的比喻:
全部Oracle數據庫就是1個大的柜子,這個柜子會被分為多個層,每一個層就是1個tablespace,每一個層中的文件就是我們的table,文件中紙及上面的數據就是我們的data。
3.Expdp/exp/impdp/imp工具
Expdp/impdp:Oracle開發的供DBA進行數據導入導出的工具,其實不是命令(最開始當作類似create的命了去履行了)。如果安裝Oracle或客戶端工具的時候沒有問題,直接在cmd命了下輸入履行語句就能夠了。
Exp/imp是客戶真個工具,expdp和impdp是服務器端工具,也就是如果我們用遠程的方式就用exp和imp工具如果是在DB服務器上就用expdp和impdp。
4.Sqlplus的作用
命令行環境下的oracle操作工具。
實際遷移:
對遷移步驟和遷移配置了解的差不多了,具體實行的時候,由于本人太懶(對程序員來講不是個好的習慣,不過好東西都是懶人發明的。)沒有在自己的機器上裝sqlplus,所以用DbVisualizer連接到了服務器數據庫,履行了directory的創建語句,然后給用戶授權(要換個用戶連接再授權,最好是用system admin身份登錄),以后要去服務器履行expdp命了,懶得去了弄了,就向QA要了1個之前備份過的庫。
取得了備份文件,遠程到外網服務器,然后履行導入語句,履行導入前要新建1個用戶,并為用戶分配表空間和權限。分別tablespace和grant的步驟非常重要。第1次導入數據的時候,由于沒有給create后的user分配dba和connect的權限,所以致使了很多遷移失敗。
創建用戶的時候要注意指定tablespace,這個tablespace可以找DBA問,或自己創建1個,但是自己創建的時候要指定tablespace的1些參數,如果不是DBA這些參數還是別亂設置了。