一、基本命令
1、 獲取幫助
$ exp help=y
$ imp help=y
2、三種工作方式
(1)交互式方式
$ exp // 然後按提示輸入所需要的參數
(2)命令行方式
$ exp user/pwd@dbname file=/Oracle/test.dmp full=y // 命令行中輸入所需的參數
(3)參數文件方式
$ exp parfile=username.par // 在參數文件中輸入所需的參數
參數文件 username.par 內容 userid=username/userpassWord buffer=8192000
compress=n grants=y
file=/Oracle/test.dmp full=y
3、三種模式
(1)表方式,將指定表的數據導出/導入。
導出:導出一張或幾張表:$ exp user/pwd file=/dir/xxx.dmp log=xxx.log tables=table1,table2
導出某張表的部分數據
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log tables=table1 query=\“where col1=\‘…\’and col2 \<…\”
導入:導入一張或幾張表
$ imp user/pwd file=/dir/xxx.dmp log=xxx.log tables=table1,
table2 fromuser=dbuser touser=dbuser2 commit=y ignore=y
(2)用戶方式,將指定用戶的所有對象及數據導出/導入。
導出:$ exp user/pwd file=/dir/xxx.dmp log=xxx.log owner=(xx, yy)
只導出數據對象,不導出數據 (rows=n )
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log owner=user rows=n
導入:$ imp user/pwd file=/dir/xxx.dmp log=xxx.log fromuser=dbuser touser=dbuser2
commit=y ignore=y
(3)全庫方式,將數據庫中的所有對象導出/導入導出:
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log full=ycommit=y ignore=y
導入:$ imp user/pwd file=/dir/xxx.dmp log=xxx.log fromuser=dbuser touser=dbuser2
二、高級選項
1、分割成多個文件
以多個固定大小文件方式導出:這種做法通常用在表數據量較大,單個 dump文件可能會超出文件系統的限制的情況
$ exp user/pwd file=1.dmp,2.dmp,3.dmp,…filesize=1000m log=xxx.log full=y
以多個固定大小文件方式導入
$ imp user/pwd file=1.dmp,2.dmp,3.dmp,… filesize=1000m
tables=xxx fromuser=dbuser touser=dbuser2 commit=y ignore=y
2、增量導出/導入
// Oracle 9i 以後 exp 不再支持 inctype
必須為 SYS 或 SYSTEM 才可執行增量導出導入
增量導出: 包括三個類型:
(1)“完全”增量導出(Complete) // 備份整個數據庫
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log inctype=complete
(2)“增量型”增量導出 導出上一次備份後改變的數據。
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log inctype=incremental
(3) “累計型”增量導出(Cumulative)只導出自上次“完全”導出之後數據庫中變化 了的信息。
$ exp user/pwd file=/dir/xxx.dmp log=xxx.log inctype=cumulative
增量導入:$ imp usr/pwd FULL=y inctype=system/restore/inct ype
其中:
SYSTEM: 導入系統對象
RESTORE: 導入所有用戶對象
3、以SYSDBA進行導出/導入
(1)用於 Oracle 技術支持
(2)用於表空間傳輸
例:$ imp \'usr/pwd@instance as sysdba\' tablespaces=xx transport_tablespace=y file=xxx.dmp datafiles=xxx.dbf $ imp file=expdat.dmp userid=“”“sys/passWord as sysdba”“” transport_tablespace=y“datafile=(c:tempapp_data,c:tempapp_index)”
4、表空間傳輸 (速度快)
表空間傳輸是8i 新增加的一種快速在數據庫間移動數據的一種辦法,是把一個數據庫上的格式數據文件附加到另外一個數據庫中,而不是把數據導出成 dmp 文件,這 在有些時候是非常管用的,因為傳輸表空間移動數據就象復制文件一樣快。
(1)關於傳輸表空間有一些規則 (10g前):
源數據庫和目標數據庫必須運行在相同的硬件平台上
源數據庫與目標數據庫必須使用相同的字符集
源數據庫與目標數據庫一定要有相同大小的數據塊
目標數據庫不能有與遷移表空間同名的表空間
SYS 的對象不能遷移
必須傳輸自包含的對象集
有一些對象,如物化視圖,基於函數的索引等不能被傳輸(同字節序文件的跨平台可以用更換數據文件的文件頭的方法)
(10g 支持跨平台的表空間傳輸,只要操作系統字節順序相同,就可以進行表空間 傳輸。需要使用 RMAN轉換文件格式,略)
(2)檢測一個表空間是否符合傳輸標准的方法:
SQL > exec sys.dbms_tts.transport_set_check(‘tablespace_name’,true); SQL > select * from sys.transport_set_violations;
如果沒有行選擇,表示該表空間只包含表數據,並且是自包含的。對於有些非自包含的表空間,如數據表空間和索引表空間,可以一起傳輸。
(3)簡要使用步驟:
如果想參考詳細使用方法,也可以參考 Oracle聯機幫助。
1).設置表空間為只讀(假定表空間名字為 APP_Data 和 APP_Index)
SQL > alter tablespace app_data read only; SQL > alter tablespace app_index read only;
2).發出 EXP命令
SQL> host exp userid=“”“sys/passWord as sysdba”“” transport_tablespace=y tablespaces=(app_data, app_index)
以上需要注意的是。為了在 SQL 中執行 EXP,USERID 必須用三個引號,在 UNIX中也必須注意 避免“/”的使用。在 816和以後,必須使用 sysdba才能操作。這個命令在 SQL中必須放置在一行(這裡是因為顯示問題放在了兩行)
3).拷貝。dbf數據文件(以及。dmp文件)到另一個地點,即目標數據庫可以是 cp(unix)或 cop y(Windows)或通過 FTP傳輸文件(一定要在 bin方式)
4).把本地的表空間設置為讀寫
$ alter tablespace app_data read write;
$ alter tablespace app_index read write;
5).在目標數據庫附加該數據文件 (直接指定數據文件名)
(表空間不能存在,必須建立相應用戶名或者用 fromuser/touser)
$ imp file=expdat.dmp userid=“”“sys/passWord as sysdba”“” transport_tablespace=y datafiles=(“c:\app_data.dbf,c:\app_index.dbf”) tablespaces=app_data,app_index tts_owners=hr,oe
6).設置目標數據庫表空間為讀寫
$ alter tablespace app_data read write;
$ alter tablespace app_index read write;
三、優化
1、加快exp速度
加大large_pool_size,可以提高 exp的速度 采用直接路徑的方式(direct=y),數據不需要經過內存進行整合和檢查。 設置較大的 buffer,如果導出大對象,小buffer會失敗。
export文件不在Oracle使用的驅動器上,不要export到NFS文件系統。
UNIX環境:用管道模式直接導入導出來提高 imp/exp的性能
2、加快imp速度
建立一個indexfile,在數據 import完成後在建立索引將import文件放在不同的驅動器上增加 DB_BLOCK_BUFFERS增加 LOG_BUFFER
用非歸檔方式運行 Oracle:ALTER DATABASE NOARCHIVELOG; 建立大的表空間和回滾段,OFFLINE其他回滾段,回滾段的大小為最大表的 1/2 使用 COMMIT=N
使用 ANALYZE=N
單用戶模式導入
UNIX環境:用管道模式直接導入導出來提高 imp/exp的性能
3、通過unix/Linux PIPE管道加快exp/imp速度
通過管道導出數據:
(1)通過 mknod -p 建立管道
$ mknod /home/exppipe p // 在目錄/home下建立一個管道 exppipe注意參數 p
(2)通過 exp和 gzip導出數據到建立的管道並壓縮
$ exp test/test file=/home/exppipe & gzip < /home/exppipe > exp.dmp.gz
$ exp test/test tables=bitmap file=/home/newsys/test.pipe & gzip < /home/newsys/test.pipe > bitmap.dmp.gz
(3)導出成功完成之後刪除建立的管道
$ rm -rf /home/exppipe
導出腳本:
###UNIX下 Oracle數據庫通過 PIPE管道進行備份
###### using "export" and "tar" command to bakup Oracle datebase #######
trap "" 1 #nohup
LOGFILE=/opt/bakup/log/bakup_ora.log
export LOGFILE
DUMPDIR=/archlog_node1
export DUMPDIR
exec >$LOGFILE 2>&1
echo
echo ' Begin at ' `date`
echo
# clear old result file
cd $DUMPDIR
if [ -f exp.dmp.Z ]
then echo "clear old result file"
rm exp.dmp.Z
fi
# make pipe
mkfifo exp.pipe
chmod a+rw exp.pipe
# gain the dmp.Z file
compress < exp.pipe > exp.dmp.Z &
su -u Oracle -c "exp userid=ll/ll file=$DUMPDIR/exp.pipe full=y buffer=20000000"
echo
echo ' exp end at '`date`
echo
# rm pipe
rm exp.pipe
# tar the dmp.Z file to tape
mt -f /dev/rmt/0 rew
tar cvf /dev/rmt/0 exp.dmp.Z
echo
echo ' tar end at '`date`
echo
通過管道導入生成的文件:
(1)通過 mknod -p 建立管道
$ mknod /home/exppipe p
(2)導入生成的壓縮文件
$ imp test/test file=/home/exppipe fromuser=test touser=Macro & gunzip < exp.dmp.gz > /home/exppipe
(3)刪除管道
$ rm –fr /home/exppipe
(4)全庫導入的一般步驟
注意:在導出時,需要通過toad或其他工具提取源數據庫創建主鍵和索引的腳本
(1)先全庫加 rows=n 把結構導進去
$ imp system/manager file=exp.dmp log=imp.log full=y rows=n indexes=n
(2)使業務用戶的觸發器失效/刪除主鍵和唯一索引
spool drop_pk_u.sql
select 'alter table '||table_name||' drop constraint '||constraint_name||';'
from user_constraints
where constraint_type in ('P','U');
/
spool off
spool disable_trigger.sql
select 'alter trigger '||trigger_name||' disable;'
from user_triggers;
/
spool off
@drop_pk_u.sql
@disable_trigger.sql
(3)以 ignore=y全庫導入$ imp system/manager file=exp.dmp log=imp.log full=y ignore=y
(4)通過 toad或其他工具提取源數據庫創建主鍵和索引的腳本,在目標數據庫中創建主鍵和索引。使觸發器生效。
四、常見問題
1、字符集問題
ORACLE多國語言設置是為了支持世界范圍的語言與字符集,一般對語言提示, 貨幣形式,排序方式和 CHAR,VARCHAR2,C LOB,LONG 字段的數據的顯示等有效。Oracle 的多國語言設置最主要的兩個特性就是國家語言設置與字符集設置,國家語 言設置決定了界面或提示使用的語言種類,字符集決定了數據庫保存與字符集有關數據(如文本)時候的編碼規則。
Oracle字符集設定,分為數據庫字符集和客戶端字符集環境設置。在數據庫端,
字符集在創建數據庫的時候設定,並保存在數據庫props$表中。
在客戶端的字符集環境比較簡單,主要就是環境變量或注冊表項 NLS_ LANG,注意 NLS_LANG的優先級別為:參數文件<注冊表<環境變量
使用一點點技巧,就可以使導出/導入在不同的字符集的數據庫上轉換數據。這裡需要一個2進制文件編輯工具即可,如 uedit32.用編輯方式打開導出的dmp文件,獲取 2 、3 字節 的內容 , 如 00 01 , 先把它轉換 為 10 進制數,為1 ,使用函數
NLS_CHARSET_NAME 即可獲得該字符集:
SQL> select nls_charset_name(1) from dual; NLS_CHARSET_NAME(1)
------------------- US7ASCII
可以知道該dmp文件的字符集為 US7ASCII,如果需要把該 dmp文件的字符集換成ZHS16GBK,則需要用 NLS_CHARSET_ID 獲取該字符集的編號: SQL> select nls_charset_id('zhs16gbk') from dual; NLS_CHARSET_ID('ZHS16GBK')
--------------------------
把852換成16進制數,為354,把 2、3字節的 00 01 換成03 54,即完成了把該 dmp文件字符集從us7ascii 到 zhs16gbk 的轉化,這樣,再把該dmp文件導入到 zhs16gbk 字符集的數據庫就可以了。
2、版本問題
Exp/Imp很多時候,可以跨版本使用,如在版本7與版本8之間導出導入數據,但這樣做必須選擇正確的版本,規則為:總是使用IMP的版本匹配數據庫的版本,如果要導入到 816,則使用816的導入工具。總是使用 EXP 的版本匹配兩個數據庫中低的那個版本,如在815與816之間互導,則使用815的EXP 工具。
imp和exp版本不能往上兼容: imp可以導入低版本exp生成的文件, 不能導入高版本exp生成的文件。