Oracle資料庫遷移-基礎,oracle資料庫遷移
Oracle資料庫遷移-基礎
作為一個開發人員,資料庫知識肯定是需要我們掌握的。但是目前公司的資料庫都是有專門的DBA維護的,一般都是給我們一個環境地址,然後我們書寫CRUD SQL。而且公司產品要求是可以跨資料來源的,這樣平時基本上都不太關心特定資料庫平台的操作。結果導致自己的DB知識嚴重不足。今天因為一些原因,需要在外網伺服器上搭建示範環境,結果需要“悲劇”的自己操作資料庫。
任務:在外網伺服器上搭建示範環境,包括伺服器、代碼、資料庫。
解決方案:
(1)找一個新的產品安裝程式,然後去伺服器安裝。
(2)把自己本地用的開發環境copy到伺服器。
分析:
方案1,肯定可以安裝上產品,看起來是最簡單的方案。但是由於內部開發版本還不問題,沒有統一的完整的安裝程式,需要東拼西湊把各個部門的產品都找齊,然後安裝、然後打補丁。因為示範的是開發產品,所以最終代碼還不一定能運行,時間也會比較長。
方案2,看起來比較簡單,但是因為外網伺服器無法訪問資料庫伺服器,所以需要自己單獨做一下資料庫的遷移(從來沒做過)。糾結了一下,最後為了避免麻煩選中了方案2(-_-! 把自己坑了),然後跟測試要了一些資料:
Oracle資料庫匯出:
--1:進sqlplus建立database directory SQL> create directory j(隨意取,建一次即可) as 'E:\reportback\20150429';
--2:給相關使用者授權 SQL> grant read,write on directory j to nc60_fbs1(需要匯出的資料庫使用者);
--3:退出sqlplus,執行匯出語句 expdp nc60_fbs1/1 dumpfile=nc60fbs1.dmp(匯出時自己取的名) logfile=nc60exp.log directory=pff parallel=2
說明:dumpfile為備份檔案;logfile為記錄檔;directory為上面建立的directory名(建立目錄);parallel為並行數;注意:dumpfile和logfile後只需跟檔案名稱,是相對於directory的相對路徑;注意:上文中的'/data2/expdir'為linux下的路徑,若為windows則改為相應地址,切記。
看到上面的操作資料,有點頭大,以前很少操作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-74941-id-85228.html
Directory命了:http://blog.csdn.net/bisal/article/details/24667609
整理:
1.Directory命令
Directory命了用於定義一個目錄對象,Oracle用我們定義的目錄對象將資料匯出到指定的位置,就好像我們編程的時候經常定義一個目錄變數,然後編程的時候直接用這個變數,這樣就不用每次都寫這個變數導致目錄位置不一致了。Directory的資訊儲存在系統的dba_directories表中。
--建立目錄Create directory 目錄名稱 as 目錄(注意windows和linux系統是不一樣的寫法);--查看已經建立的目錄Select * from dba_directories;--刪除建立的目錄,用drop不是deleteDrop directory 目錄名稱
2.User、tablespace、table之間的關係
Oracle資料庫的結構和MySql這類有很大區別,一邊資料庫的結構我們都從兩個方面列舉,物理層面和邏輯層面,也就是我們常說的資料庫的三層模式,兩種映射。Oracle的實體儲存體結構很複雜,這裡不討論,而且跟這次的資料移轉無關,如果硬要說,那匯出的DMP檔案就可以認為是Oracle的實體儲存體的一種。
在MySql資料庫中,我們可以建立一個資料庫(create database)然後為使用者授權這個庫的許可權。在Oracel中,同樣有使用者的概念,但是所謂的tablespace就可以認為是database,只不過是邏輯組織,table就是實際我們操作的表。
引用一個形象的比喻:
整個Oracle資料庫就是一個大的柜子,這個柜子會被分為多個層,每個層就是一個tablespace,每個層中的檔案就是我們的table,檔案中紙及上面的資料就是我們的data。
--建立使用者,並指定資料表空間,一般都需要指定,放到預設資料表空間的很少Create user 使用者名稱identified by 密碼 default tablespace 資料表空間名稱 temporary tablespace temp; --還可以加上使用者權限--去掉分好,加上:--quota Storage(unlimited , 8k, 10M etc.) on tablespace 資料表空間名稱--修改使用者對錶空間的許可權alter user IUFO6360330 quota unlimited on users;--查看執行個體select instance_name from v$instance;--查詢使用者select * from dba_users;--關閉使用者會話
3.Expdp/exp/impdp/imp工具
Expdp/impdp:Oracle開發的供DBA進行資料匯入匯出的工具,並不是命令(最開始當做類似create的命了去執行了)。如果安裝Oracle或者用戶端工具的時候沒有問題,直接在cmd命了下輸入執行語句就可以了。
Exp/imp是用戶端的工具,expdp和impdp是伺服器端工具,也就是如果我們用遠端方式就用exp和imp工具如果是在DB伺服器上就用expdp和impdp。
--expdp匯出--impdp匯入,注意remap_schema還可以配置remap_table參數--remap_schema基於使用者的,remap_table基於參數的impdp 使用者名稱/密碼 dumpfile=檔案.dmp logfile=log檔案名稱.log directory=引用的目錄 parallel=2 remap_schema=源使用者名稱:目標使用者名稱
4.Sqlplus的作用
命令列環境下的oracle操作工具。
實際遷移:
對遷移步驟和遷移配置瞭解的差不多了,具體實施的時候,因為本人太懶(對程式員來說不是個好的習慣,不過好東西都是懶人發明的。)沒有在自己的機器上裝sqlplus,所以用DbVisualizer串連到了伺服器資料庫,執行了directory的建立語句,然後給使用者授權(要換個使用者串連再授權,最好是用system admin身份登入),之後要去伺服器執行expdp命了,懶得去了弄了,就向QA要了一個之前備份過的庫。
獲得了備份檔案,遠程到外網伺服器,然後執行匯入語句,執行匯入前要建立一個使用者,並為使用者指派資料表空間和許可權。分別tablespace和grant的步驟非常重要。第一次匯入資料的時候,因為沒有給create後的user分配dba和connect的許可權,所以導致了很多遷移失敗。
建立使用者的時候要注意指定tablespace,這個tablespace可以找DBA問,或者自己建立一個,但是自己建立的時候要指定tablespace的一些參數,如果不是DBA這些參數還是別亂設定了。