1.1 基本命令
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=dbuser21.2 高級選項
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.3 優化
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.4 常見問題
1. 字符集問題 Oracle 多國語言設置是為了支持世界范圍的語言與字符集,一般對語言提示, 貨幣形式,排序方式和 CHAR,VARCHAR2,C LOB,LONG 字段的數據的顯示等有效。 Oracle 的多國語言設置最主要的兩個特性就是國家語言設置與字符集設置,國家語 言設置決定了界面或提示使用的語言種類,字符集決定了數據庫保存與字符集有關數據 (如文本)時候的編碼規則。 Oracle 字符集設定,分為數據庫字符集和客戶端字符集環境設置。在數據庫端, 字符集在創建數據庫的時候設定,並保存在數據庫 props$表中。 在客戶端的字符集環境比較簡單,主要就是環境變量或注冊表項 NLS_ LANG,注 意 NLS_LANG的優先級別為:參數文件<注冊表<環境變量<alter session。如果客戶端 字符集和服務器端字符集不一樣,而且字符集的轉換也不兼容,那麼客戶端的數據顯示 與導出/導入的與字符集有關的數據將都是亂碼。 使用一點點技巧,就可以使導出/導入在不同的字符集的數據庫上轉換數據。這裡 需要一個 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生成的文件。