Oracle資料庫備份與恢復之一:exp/imp(匯出與匯入裝庫與卸庫)

wangkxxe發表於2009-03-20
1.1  基本命令

    1.  獲取幫助

    $ exp help=y

    $ imp help=y

    2.  三種工作方式

    (1)互動式方式

    $ exp        //  然後按提示輸入所需要的引數

    (2)命令列方式

    $ exp 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 wner=(xx, yy)

    只匯出資料物件,不匯出資料  (rows=n )

    $ exp user/pwd file=/dir/xxx.dmp log=xxx.log wner=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.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.  用於 技術支援

    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的優先順序別為:引數檔案

    使用一點點技巧,就可以使匯出/匯入在不同的字符集的資料庫上轉換資料。這裡需要一個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生成的檔案。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12801008/viewspace-573237/,如需轉載,請註明出處,否則將追究法律責任。

相關文章