一. 問(wèn)題場(chǎng)景描述:
今天在做項(xiàng)目過(guò)程中,需要將別人機(jī)子里面的Oracle數(shù)據(jù)庫(kù)數(shù)據(jù)復(fù)制一份到自己本地機(jī)子上,因?yàn)橹皩iT總結(jié)過(guò)一篇關(guān)于Oracle數(shù)據(jù)庫(kù)導(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)容花樣還挺多,有說(shuō)是表或視圖不存在的,也有說(shuō)是語(yǔ)法不正確的。
一直沒(méi)搞清楚是什么原因,直到腦子一個(gè)機(jī)靈,估計(jì)是Oracle數(shù)據(jù)庫(kù)版本不同的緣故。查了一下,發(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ù)庫(kù)服務(wù)器,但高版本的exp/imp不能連接到低版本的數(shù)據(jù)庫(kù)服務(wù)器。
規(guī)則2:高版本exp出的dmp文件,低版本無(wú)法imp(無(wú)法識(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,再?gòu)闹虚g數(shù)據(jù)庫(kù)轉(zhuǎn)入更高版本Oracle 8。
在進(jìn)行導(dǎo)入imp過(guò)程中,我的操作之所以出錯(cuò),正是因?yàn)檫`反了規(guī)則2中的內(nèi)容:低版本無(wú)法imp高版本emp的dmp文件。
三. Oracle 的IMPDP/EXPDP的特性:
- 在Oracle 9i以后引入數(shù)據(jù)泵命令I(lǐng)MPDP/EXPDP,Oracle 11g中exp命令是無(wú)法導(dǎo)出數(shù)據(jù)庫(kù)中的空表的,但可以通過(guò)EXPDP導(dǎo)出。
- Oracle 11g通過(guò)exp導(dǎo)出的數(shù)據(jù)是無(wú)法通過(guò)imp導(dǎo)入到oracle10g中的,但可以通過(guò)expdp和impdp完成。
- IMPDP/EXPDP是服務(wù)器端的命令,無(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)出相同,具體流程詳見(jiàn)《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ù)庫(kù),創(chuàng)建生成文件的目錄:
語(yǔ)法:
create directory 目錄名(如:dmpbx) as 存儲(chǔ)地址(如:'/root/usr/……');
具體操作實(shí)例:
SQL> create directory TIANZHI_UC_DATA_PUMP;
--此處沒(méi)有帶as,原因地址忘記了,這個(gè)可根據(jù)實(shí)際場(chǎng)景進(jìn)行修改.
目錄已創(chuàng)建。
(2) 授予權(quán)限
語(yǔ)法:
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)出文件
語(yǔ)法:
expdp 用戶名1/密碼@實(shí)例 dumpfile=備份文件名(ecology.dmp) directory= 目錄名(dmpbx)
具體示例說(shuō)明:
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ù)庫(kù)實(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
從提示語(yǔ)的結(jié)尾處,可以看到導(dǎo)出的.dmp文件
TIANZHI_UC_02.DMP
保存在源機(jī)上的C盤(pán)下。
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ù)庫(kù)的服務(wù)器上拷貝到10g的dpdump目錄下
(4). impdp導(dǎo)入數(shù)據(jù)庫(kù)
(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ù)庫(kù)的服務(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
到這里為止,所有的操作都完成了,終于看到了久違的消息:操作完成!