一. 問題場景描述:
今天在做項(xiàng)目過程中杂腰,需要將別人機(jī)子里面的Oracle數(shù)據(jù)庫數(shù)據(jù)復(fù)制一份到自己本地機(jī)子上,因?yàn)橹皩iT總結(jié)過一篇關(guān)于Oracle數(shù)據(jù)庫導(dǎo)入與導(dǎo)出(exp/imp)的文章即:《Oracle導(dǎo)出/導(dǎo)入數(shù)據(jù)》断箫,所以這次想必應(yīng)該so easy网棍!
可去執(zhí)行操作的時(shí)候兼蜈,發(fā)現(xiàn)不管導(dǎo)出的是.sql文件還是.dmp文件,都會(huì)報(bào)錯(cuò)序宦。即使最后嘗試使用Oracle SQL Developer進(jìn)行復(fù)制操作睁壁,依然會(huì)報(bào)錯(cuò)。而報(bào)錯(cuò)內(nèi)容花樣還挺多挨厚,有說是表或視圖不存在的堡僻,也有說是語法不正確的。
一直沒搞清楚是什么原因疫剃,直到腦子一個(gè)機(jī)靈钉疫,估計(jì)是Oracle數(shù)據(jù)庫版本不同的緣故。查了一下巢价,發(fā)現(xiàn)果然不一樣牲阁。一個(gè)是Oracle11g固阁,一個(gè)是Oracle10g,再查看一下規(guī)則城菊,果然是因?yàn)榘姹静煌斐傻摹?/p>
二. Oracle 的exp/imp特性:
Oracle的imp/exp組件的一個(gè)操作原則就是向下兼容备燃,且有一些規(guī)則:
規(guī)則1:低版本的exp/imp可以連接到高版本(或同版本)的數(shù)據(jù)庫服務(wù)器,但高版本的exp/imp不能連接到低版本的數(shù)據(jù)庫服務(wù)器凌唬。
規(guī)則2:高版本exp出的dmp文件并齐,低版本無法imp(無法識(shí)別dmp文件);低版本exp出的dmp文件客税,高版本可以imp(向下兼容)况褪。
規(guī)則3:從Oracle 低版本Export的數(shù)據(jù)可以Import到Oracle高版本中,但限于Oracle的相鄰版本更耻,如從Oracle 7 到 Oracle 8测垛。對(duì)于兩個(gè)不相鄰版本間進(jìn)行轉(zhuǎn)換,如從Oracle 6 到 Oracle 8秧均,則應(yīng)先將數(shù)據(jù)輸入到中間版本Oracle 7食侮,再從中間數(shù)據(jù)庫轉(zhuǎn)入更高版本Oracle 8。
在進(jìn)行導(dǎo)入imp過程中目胡,我的操作之所以出錯(cuò)锯七,正是因?yàn)檫`反了規(guī)則2中的內(nèi)容:低版本無法imp高版本emp的dmp文件。
三. Oracle 的IMPDP/EXPDP的特性:
- 在Oracle 9i以后引入數(shù)據(jù)泵命令I(lǐng)MPDP/EXPDP誉己,Oracle 11g中exp命令是無法導(dǎo)出數(shù)據(jù)庫中的空表的起胰,但可以通過EXPDP導(dǎo)出。
- Oracle 11g通過exp導(dǎo)出的數(shù)據(jù)是無法通過imp導(dǎo)入到oracle10g中的巫延,但可以通過expdp和impdp完成。
- IMPDP/EXPDP是服務(wù)器端的命令地消,無法在客戶端使用炉峰,需要在DOS窗口中進(jìn)行操作。
四. oracle10g數(shù)據(jù)導(dǎo)入到oracle11g中:
在oracle10g上執(zhí)行:
Exp ccense/ccense@orcl file=D:\2012123101.dmp
在oracle11g上創(chuàng)建好表空間和用戶后執(zhí)行:
Imp ccense/ccense@orcl file=D:\20121231001.dmp
這點(diǎn)與Oracle 10g之間的導(dǎo)入/導(dǎo)出相同脉执,具體流程詳見《Oracle導(dǎo)出/導(dǎo)入數(shù)據(jù)》中的操作疼阔。
五.Oracle11g數(shù)據(jù)導(dǎo)入到Oracle 10g中:
1. 在Oracle 11g服務(wù)器命令行中用EXPDP導(dǎo)出數(shù)據(jù)
(1) 連接Oracle 11g源數(shù)據(jù)庫,創(chuàng)建生成文件的目錄:
語法:
create directory 目錄名(如:dmpbx) as 存儲(chǔ)地址(如:'/root/usr/……');
具體操作實(shí)例:
SQL> create directory TIANZHI_UC_DATA_PUMP;
--此處沒有帶as,原因地址忘記了,這個(gè)可根據(jù)實(shí)際場景進(jìn)行修改.
目錄已創(chuàng)建。
(2) 授予權(quán)限
語法:
grant read,write on directory 目錄名 to public;
具體操作實(shí)例:
SQL> grant read,write on directory TIANZHI_UC_DATA_PUMP to public;
授權(quán)成功半夷。
SQL> exit
(3) 導(dǎo)出文件
語法:
expdp 用戶名1/密碼@實(shí)例 dumpfile=備份文件名(ecology.dmp) directory= 目錄名(dmpbx)
具體示例說明:
EXPDP USERID='szairpay/szairpay@orcl' schemas=szairpay directory=DATA_PUMP_DIR dumpfile=sz11g.dmp logfile=sz11g.log version=10.2.0.3.0'
szairpay/szairpay@orcl 賬號(hào)/密碼@數(shù)據(jù)庫實(shí)例
schemas=szairpay 可省略
directory=data_pump_dir 放生成文件的目錄婆廊,一般會(huì)生成到admin\orcl\dpdump
dumpfile=sz11g.dmp 生成的文件名
logfile=sz11g.log 日志
version=10.2.0.3.0 對(duì)應(yīng)要放的10g的oracle版本
以上參數(shù)右邊的值都可以按實(shí)際情況改
實(shí)際運(yùn)行時(shí)的代碼:
EXPDP USERID='tianzhi_uc/uc123456@173.18.10.213:1521/orcl' directory=TIANZHI_UC_DATA_PUMP dumpfile=tianzhi_uc_02.dmp logfile=tianzhi_uc_02.log version=10.2.0.1.0
從提示語的結(jié)尾處,可以看到導(dǎo)出的.dmp文件
TIANZHI_UC_02.DMP
保存在源機(jī)上的C盤下巫橄。
2.在Oracle 10g服務(wù)器DOS命令行中用IMPDP導(dǎo)入數(shù)據(jù):
步驟:
(1). 建表空間;
(2). 建用戶并授權(quán);
(3). 將tianzhi_uc_02.dmp和tianzhi_uc_02.log文件從源數(shù)據(jù)庫的服務(wù)器上拷貝到10g的dpdump目錄下
(4). impdp導(dǎo)入數(shù)據(jù)庫
(1) 建表空間:
create tablespace tianzhi_uc datafile 'E:\oracle\product\10.2.0\oradata\orcl\tianzhi_uc.dbf' size 1000m;
注意: 此表空間名要與11g中的表空間一致
(2) 建用戶:
create user tianzhi_uc identified by uc123456 default tablespace tianzhi_uc quota 500m on users;
--注意: 此用戶名要與11g中的用戶名一致
--授權(quán):
grant create session to tianzhi_uc;
grant connect to tianzhi_uc;
grant connect, resource, dba to tianzhi_uc;
grant create table to tianzhi_uc;
grant create view to tianzhi_uc;
grant create trigger to tianzhi_uc;
grant select any table to tianzhi_uc;
grant create sequence to tianzhi_uc;
grant create procedure to tianzhi_uc;
grant create role to tianzhi_uc;
grant create type to tianzhi_uc;
grant all privileges to tianzhi_uc;
grant dba to tianzhi_uc;
(3) 復(fù)制.dmp文件
我本地機(jī)器中的Oracle 10g裝在了E:/根目錄下淘邻,于是將tianzhi_uc_02.dmp
和tianzhi_uc_02.log
文件從源數(shù)據(jù)庫的服務(wù)器上拷貝到E:\Oracle\product\10.2.0\admin\orcl\dpdump
目錄下。
創(chuàng)建目錄命令如下:
sqlplus tianzhi_uc/uc123456@orcl
sql>create directory DATA_PUMP_DIR as 'E:\Oracle\product\10.2.0\admin\orcl\dpdump';
5湘换、導(dǎo)入數(shù)據(jù):
IMPDP USERID='tianzhi_uc/uc123456@orcl as sysdba' directory=DATA_PUMP_DIR dumpfile=tianzhi_uc_02.dmp logfile=tianzhi_uc_02.log version=10.2.0.1.0
到這里為止宾舅,所有的操作都完成了统阿,終于看到了久違的消息:操作完成!