程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle exp/imp的備份(導出/導入備份)

Oracle exp/imp的備份(導出/導入備份)

編輯:Oracle數據庫基礎

exp hely=y 說明:
 USERID 用戶名/口令
 FULL 導出整個文件 (N)
 BUFFER 數據緩沖區的大小
 OWNER 所有者用戶名列表
 FILE 輸出文件 (EXPDAT.DMP)
 TABLES 表名列表
 COMPRESS 導入一個范圍 (Y)
 RECORDLENGTH IO 記錄的長度
 GRANTS 導出權限 (Y)
 INCTYPE 增量導出類型
 INDEXES 導出索引 (Y)
 RECORD 跟蹤增量導出 (Y)
 ROWS 導出數據行 (Y)
 PARFILE 參數文件名
 CONSTRAINTS 導出限制 (Y)
 CONSISTENT 交叉表一致性
 LOG 屏幕輸出的日志文件
 STATISTICS 分析對象 (ESTIMATE)
 DIRECT 直接路徑 (N)
 TRIGGERS 導出觸發器 (Y)
 FEEDBACK 顯示每 x 行 (0) 的進度
 FILESIZE 各轉儲文件的最大尺寸
 QUERY 選定導出表子集的子句
 
 下列關鍵字僅用於可傳輸的表空間
 TRANSPORT_TABLESPACE 導出可傳輸的表空間元數據 (N)
 TABLESPACES 將傳輸的表空間列表
imp hely=y 說明:
 USERID 用戶名/口令
 FULL 導入整個文件 (N)
 BUFFER 數據緩沖區大小
 FROMUSER 所有人用戶名列表
 FILE 輸入文件 (EXPDAT.DMP)
 TOUSER 用戶名列表
 SHOW 只列出文件內容 (N)
 TABLES 表名列表
 IGNORE 忽略創建錯誤 (N)
 RECORDLENGTH IO 記錄的長度
 GRANTS 導入權限 (Y)
 INCTYPE 增量導入類型
 INDEXES 導入索引 (Y)
 COMMIT 提交數組插入 (N)
 ROWS 導入數據行 (Y)
 PARFILE 參數文件名
 LOG 屏幕輸出的日志文件
 CONSTRAINTS 導入限制 (Y)
 DESTROY 覆蓋表空間數據文件 (N)
 INDEXFILE 將表/索引信息寫入指定的文件
 SKIP_UNUSABLE_INDEXES 跳過不可用索引的維護 (N)
 ANALYZE 執行轉儲文件中的 ANALYZE 語句 (Y)
 FEEDBACK 顯示每 x 行 (0) 的進度
 TOID_NOVALIDATE 跳過指定類型 id 的校驗
 FILESIZE 各轉儲文件的最大尺寸
 RECALCULATE_STATISTICS 重新計算統計值 (N)
 
 下列關鍵字僅用於可傳輸的表空間
 TRANSPORT_TABLESPACE 導入可傳輸的表空間元數據 (N)
 TABLESPACES 將要傳輸到數據庫的表空間
 DATAFILES 將要傳輸到數據庫的數據文件
 TTS_OWNERS 擁有可傳輸表空間集中數據的用戶
導入注意事項:
 (1) 數據庫對象已經存在
  一般情況, 導入數據前應該徹底刪除目標數據下的表, 序列, 函數/過程,觸發器等; 
  數據庫對象已經存在, 按缺省的imp參數, 則會導入失敗
  如果用了參數ignore=y, 會把exp文件內的數據內容導入
  如果表有唯一關鍵字的約束條件, 不合條件將不被導入
  如果表沒有唯一關鍵字的約束條件, 將引起記錄重復
 (2) 數據庫對象有主外鍵約束
         不符合主外鍵約束時, 數據會導入失敗
         解決辦法: 先導入主表, 再導入依存表
  disable目標導入對象的主外鍵約束, 導入數據後, 再enable它們

 (3)  權限不夠
  如果要把A用戶的數據導入B用戶下, A用戶需要有imp_full_database權限
 (4)  導入大表( 大於80M ) 時, 存儲分配失敗
         默認的EXP時, compress = Y, 也就是把所有的數據壓縮在一個數據塊上.
         導入時, 如果不存在連續一個大數據塊, 則會導入失敗.
  導出80M以上的大表時, 記得compress= N, 則不會引起這種錯誤.
 (5) imp和exp使用的字符集不同
       如果字符集不同, 導入會失敗, 可以改變unix環境變量或者NT注冊表裡NLS_LANG相關信息.
       導入完成後再改回來.
 (6) imp和exp版本不能往上兼容
 imp可以成功導入低版本exp生成的文件, 不能導入高版本exp生成的文件

使用方法:
 例題格式及說明:
 1.普通數據庫全部導出和導入
  exp 用戶/密碼@dbName file=路徑.dmp full=y  --還有其他的參數,看需要進行填寫
  $ exp user/pwd file=/dir/xxx.dmp log=xxx.log full=y commit=y ignore=y  --全部導出
  $ imp user/pwd file=/dir/xxx.dmp log=xxx.log fromuser=dbuser touser=dbuser2 --全部導入
 
 2.指定用戶全部導出
  /home/Oracle/product/9.2.0.4/bin/exp userid=用戶/密碼    --說明:本地的數據庫登入(可以指定其他數據庫,則需添加@dbName)
   owner=導出的用戶名 file=導出路徑存放目錄.dmp log=導出的日志信息.log  --主要:這是不能使用full=y或則會出錯(默認該用戶全導出)
 
  3.文件參數導出
  $ exp parfile=username.par // 在參數文件中輸入所需的參數
   參數文件username.par 內容
   userid=username/userpassWord
   buffer=8192000
   compress=n
   grants=y
   file=/Oracle/test.dmp
   full=y
  4.制定表導出(分區表導出及條件表導出)
   $ exp user/pwd file=/dir/xxx.dmp log=xxx.log tables=table1,table2 --或tables(table1,table2,.....)
   $ exp user/pwd file=/dir/xxx.dmp log=xxx.log tables=(T1: table1,T2: table2,.....) --T1是分區表
   $ exp scott/tiger tables=emp query=\"where job=\'salesman\' and sal\<1600\" file=/directory/scott2.dmp 或根據參數文件進行導出
 
  5.導入(一張或多張表)
   $ imp user/pwd file=/dir/xxx.dmp log=xxx.log tables=(table1,table2) fromuser=dbuser
   touser=dbuser2 commit=y ignore=y
   $ imp user/pwd file=/dir/xxx.dmp log=xxx.log fromuser=dbuser touser=dbuser2
   commit=y ignore=y
 
 6.只導出數據對象不導出數據
  $ exp user/pwd file=/dir/xxx.dmp log=xxx.log owner=user rows=n --rows=n/y說明是否導出數據行
 
 7.分割多個文件導出和導入
  $ 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
 
 8.增量導出和導入
  a.完全增量導出(inctype=complete) // 備份整個數據庫
   $ exp user/pwd file=/dir/xxx.dmp log=xxx.log inctype=complete
   b.增量型增量導出 導出上一次備份後改變的數據(inctype=incremental)。
   $ exp user/pwd file=/dir/xxx.dmp log=xxx.log inctype=incremental
   c.累計型增量導出(Cumulative) 只導出自上次"完全"導出之後數據庫中變化的信息。
   $ exp user/pwd file=/dir/xxx.dmp log=xxx.log inctype=cumulative
   d.增量導入:
   $ imp usr/pwd FULL=y inctype=system/restore/inctype --(SYSTEM: 導入系統對象,RESTORE: 導入所有用戶對象)
 
 9.使用sysdba進行導出和導入
  1. 命令行方式:  
                      A: Windows平台:      
                         C:\> exp as sysdba" 
 
 10.表空間傳輸(建議:10g以上使用,但我試了在9i沒有找到相對應的檢查表空是否傳輸的語句,10g 支持跨平台的表空間傳輸)
        注意:
    l.索引在待傳輸表空間集中而表卻不在。(注意,如果表在待傳輸表空間集中,而索引不在並不違反自包含原則,當然如果你堅持這樣傳輸的話,會造成目標庫中該表索引丟失)。
    2.分區表中只有部分分區在待傳輸表空間集(對於分區表,要麼全部包含在待傳輸表空間集中,要麼全不包含)。
    3.待傳輸表空間中,對於引用完整性約束,如果約束指向的表不在待傳輸表空間集,則違反自包含約束;但如果不傳輸該約束,則與約束指向無關。
    4.對於包含LOB列的表,如果表在待傳輸表空間集中,而Lob列不在,也是違反自包含原則的。
  a.查看表空間包含那些XML文件
   select distinct p.tablespace_name
   from dba_tablespaces p, dba_XML_tables x, dba_users u, all_all_tables t
   where t.table_name = x.table_name
   and t.tablespace_name = p.tablespace_name
   and x.owner = u.username
  b.檢測一個表空間是否符合傳輸標准的方法:
   SQL > exec sys.dbms_tts.transport_set_check('tablespace_name',true);
   SQL > select * from sys.transport_set_violations;
  c.簡要使用步驟
   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)或copy(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;
 11.優化IMP/EXP的速度(修改參數配置文件) 

EXP:
   加大large_pool_size,可以提高exp 的速度
   采用直接路徑的方式(direct=y),數據不需要經過內存進行整合和檢查.
   設置較大的buffer,如果導出大對象,小buffer 會失敗。
   export文件不在Oracle 使用的驅動器上,不要export到NFS 文件系統
   UNIX環境:用管道模式直接導入導出來提高imp/exp 的性能
  IMP:
   建立一個indexfile,在數據import完成後在建立索引
   將import 文件放在不同的驅動器上
   增加DB_BLOCK_BUFFERS
   增加LOG_BUFFER
   用非歸檔方式運行Oracle:ALTER DATABASE NOARCHIVELOG;
   建立大的表空間和回滾段,OFFLINE 其他回滾段,回滾段的大小為最大表的1/2
   使用 COMMIT=N
   使用ANALYZE=N
   單用戶模式導入
   UNIX環境:用管道模式直接導入導出來提高imp/exp 的性能
    
 12.通過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
  4.shell腳本可以這樣寫(我只是寫主要的)
   unix下:
    mkfifo /home/exp.pipe
    chmod a+rw exp.pipe
    compress < exp.pipe > exp.dmp.Z &
     su -u Oracle -c "exp userid=ll/ll file=/home/exp.pipe full=y buffer=20000000"
    rm exp.pipe
   Linux下:
    mknod /home/exppipe p
    $ imp test/test file=/home/exppipe fromuser=test touser=Macro &
     gunzip < exp.dmp.gz > /home/exppipe
    $ rm –fr /home/exppipe
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved