摘自:宏貝思
Export
和
Import
是一對(duì)讀寫Oracle數(shù)據(jù)的工具.
Export
將
Oracle
數(shù)據(jù)庫(kù)中的數(shù)據(jù)輸出到操作系統(tǒng)文件中,
Import
把這些文件中的數(shù)據(jù)讀到Oracle
數(shù)據(jù)庫(kù)中.
Export/Import可以用來(lái)完成以下工作:
數(shù)據(jù)歸檔,
數(shù)據(jù)庫(kù)升級(jí),
備份數(shù)據(jù)庫(kù),
把數(shù)據(jù)從一個(gè)數(shù)據(jù)庫(kù)移到另一個(gè)數(shù)據(jù)庫(kù),
回收數(shù)據(jù)庫(kù)存儲(chǔ)碎片等等.
?
??
使用Export除了要保證磁盤或磁帶上有足夠的空間,
還必須執(zhí)行expvew.sql和expvew.sql來(lái)創(chuàng)建Export使用的示圖,
并創(chuàng)建EXP_FULL_DATABASE
ROLE.
使用Export的用戶應(yīng)具有CREATE
SESSION的權(quán)限,
若要Export其他用戶的表還要有EXP_FULL_DATABASE
ROLE.同樣,
使用Import必須用catex.sql來(lái)創(chuàng)建IMP_FULL_DATABASE
ROLE.
使用Import的用戶應(yīng)具有CREATE
SESSION的權(quán)限.
Import只能讀入用Export創(chuàng)建的文件.
如果該文件是全庫(kù)Export,
使用Import的用戶還要有IMP_FULL_DATABASE
ROLE.???
?
??
Export/Import有三個(gè)級(jí)別:
表級(jí),
用戶級(jí)和全數(shù)據(jù)庫(kù)級(jí).
??
表級(jí)允許Export/Import指定的表而不涉及其他數(shù)據(jù)庫(kù)對(duì)象.
用戶級(jí)Export/Import只針對(duì)屬于指定用戶的全部數(shù)據(jù)庫(kù)對(duì)象.
只有擁有EXP_FULL_DATABASE/IMP_FULL_DATABASE
ROLE
的用戶才能使用全數(shù)據(jù)庫(kù)級(jí)的Export/Import.
??
??
有三種方式執(zhí)行Export/Import:
參數(shù)文件方式,
命令行方式和交互式.
?????
使用參數(shù)文件是一種比較好的方式,
格式為:
????????
Exp
<username/password>
PARFILE
=
<filename>
????????
Imp
<username/password>
PARFILE
=
<filename>
?????
命令行方式是指在命令行中指定參數(shù):
????????
Exp
<username/password>
TABLES
=
(emp,dept)
GRANTS
=
y
????????
Imp
<username/password>
FROMUSER
=
scott
TOUSER
=
test
TABLES
=
(emp,dept)
?????
交互式只要敲入Exp或Imp然后回答屏幕上的提問(wèn)即可.
?
?下面介紹一些EXPORT/IMPORT的使用技巧
??
-
把數(shù)據(jù)庫(kù)對(duì)象從一個(gè)用戶移到另一個(gè)用戶
?????
Oracle
不允許直接改變表的擁有者,
利用Export/Import可以達(dá)到這一目的.
?????
假設(shè)要把表
T 的擁有者User1改為User2,?
具體步驟是:
????????
-
exp
system/manager
tables
=
User1.T
????????
-
imp
system/manager
fromuser
=
User1
touser
=
User2
tables
=
T
????????
-
drop
table
User1.T
?????
??
-
把數(shù)據(jù)庫(kù)對(duì)象從一個(gè)表空間移到另一個(gè)表空間
?????
建表時(shí)可以指定表空間,
表空間一經(jīng)確定就部能隨意改變.
若要表
T 從表空間
tbs1移到表空間
tbs2,
就要采用以下方法:
????????
-
exp
<user/passwd>
tables
=
T
????????
-
imp
<user/passwd>
tables
=
T
indexfile
=?
temp.sql
????????
-
drop
table
T
????????
-
編輯
temp.sql
只保留所需的建表命令并指定表空間為tbs2
????????
-
以表的所有者執(zhí)行temp.sql
????????
-
imp
<user/passwd>
tables
=
T
ignore
=
Y
?
??
-
只輸出一個(gè)的表空間
?????
通常數(shù)據(jù)庫(kù)設(shè)計(jì)成用戶若屬于某個(gè)表空間,
那么這個(gè)用戶創(chuàng)建的數(shù)據(jù)庫(kù)對(duì)象也在該表空間內(nèi).
??
Export某個(gè)表空間可用如下方法:
????????
-
查看表空間內(nèi)所有用戶
????????????
spool
owners
???????????
????????????
select
owner
????????????
from
dba_segments
????????????
where
tablespace_name
=
'<TablespaceName>';
???????????
????????????
spool
off
???????????
????????
-
查看表空間內(nèi)所有數(shù)據(jù)庫(kù)對(duì)象
????????????
spool
objects
?
????????????
select
owner,
object_name,
object_type
????????????
from?
dba_objects
????????????
where
owner
=
'owner1'
????????????
or??
owner
=
'owner2'
?????????????????
...
????????????
or??
owner
=
'ownern';
?
????????????
spool
off
???????
-
作表級(jí)Export????????
?
??
-
從Exp文件中提取創(chuàng)建數(shù)據(jù)庫(kù)對(duì)象的命令
????
在IMPORT時(shí)使用
'INDEXFILE
=?
FileName',
IMPORT把創(chuàng)建數(shù)據(jù)庫(kù)對(duì)象的命令輸出到指定的文件中,
編輯后運(yùn)行這個(gè)文件就能建立數(shù)據(jù)庫(kù)對(duì)象.
?
??
?
?下面介紹Export/Import
使用中幾個(gè)常見(jiàn)的問(wèn)題和解決辦法
??
-
Export/Import
使用不同的字符集
?????
Export文件中包含著字符信息.
如過(guò)輸入/輸出都使用擔(dān)字節(jié)字符集,
如EBCDIC或US7ASCII,
輸入時(shí)將自動(dòng)進(jìn)行字符集轉(zhuǎn)換.
轉(zhuǎn)換過(guò)程中,
若輸出文件中含有的目標(biāo)字符集中不能匹配的字符會(huì)自動(dòng)設(shè)成缺省字符.
?????
對(duì)于多字節(jié)字符集,
如ZHS16CGB231280,
通常不能自動(dòng)轉(zhuǎn)換,
只有在字符串長(zhǎng)度不變的情況下才能自動(dòng)轉(zhuǎn)換.
???
????
??
-
空間不夠
--
碎片問(wèn)題
?????
有些時(shí)候,
即使數(shù)據(jù)庫(kù)仍有足夠的空間,
使用IMPORT時(shí)卻出空間不夠的錯(cuò)誤.
出現(xiàn)這種現(xiàn)象通常是由于數(shù)據(jù)庫(kù)中存在碎片,
即有很多小的不連續(xù)的空閑空間.
解決辦法是先將數(shù)據(jù)庫(kù)全庫(kù)EXPORT(FULL=Y),
SHUTDOWN數(shù)據(jù)庫(kù),
重新建庫(kù)(CREATE
DATABASE)后用IMPORT
FULL=Y恢復(fù)數(shù)據(jù).
???
??
-
ROLLBACK段不夠
?????
Export/Import使用過(guò)程中,
如果數(shù)據(jù)量很大會(huì)出現(xiàn)'ROLLBACK段不夠'的錯(cuò)誤.
這時(shí)要建一個(gè)足夠大的ROLLBACK段,
使它ONLINE而其他ROLLBACK段OFFLINE.
這樣,
Export/Import使用這個(gè)大ROLLBACK段,
從而避免上述現(xiàn)象.
|