Oracle expdp和impdp

1、EXPDP/IMPDP用法詳解

1.1、expdp/impdp模式

expdp和impdp 有三種方式:command-line|parameter file|Interactive-Command Mode
以下爲interactive-command mode 命令

Activity                                                                            Command Used
Add additional dump files.                                                          ADD_FILE            on page 2-46
Exit interactive mode and enter logging mode.                                       CONTINUE_CLIENT     onpage 2-47
Stop the export client session, but leave the job running.                          EXIT_CLIENT         on page 2-47
Redefine the default size to be used for any subsequent dump files.                 FILESIZE            on page 2-47
Display a summary of available commands.                                            HELP         on page 2-48
Detach all currently attached client sessions and terminate the current job.        KILL_JOB            on page 2-48
Increase or decrease the number of active worker processes
for the current job. This command is valid only in the
Enterprise Edition of Oracle Database 11g.                                          PARALLEL            on page 2-48
Restart a stopped job to which you are attached.                                    START_JOB           on page 2-49
Display detailed status for the current job and/or set status interval.             STATUS              on page 2-49
Stop the current job for later restart.                                             STOP_JOB            on page 2-50

1.2、監控expdp/impdp任務

1、數據字典視圖

DBA_DATAPUMP_JOBS和DBA_DATAPUMP_SESSIONS以及v$session_longops視圖

2、連接到後臺任務

expdp ‘/ as sysdba’ attach=“SYS”.“SYS_EXPORT_SCHEMA_01”

2、EXPDP/IMPDP使用技巧和案例

2.0、使用技巧

1、使用parfile參數文件

參數文件中使用sysdba用戶 userid=’/ as sysdba’

當參數文件中有中文時,可以把需要輸入的中文字符放到一個表中,參考ID 7154316.8

2、dumpfile變量%U

建議命名規則:dbname_business_expdp&impdp_%U.dmp.date

3、impdp時去掉存儲屬性,這樣可以避免導入DDL語句時初始段把表空間弄的很大

transform=segment_attributes:n

4、爲了加快導出速度,可以加並行和排除一些索引、授權、統計信息

EXCLUDE=STATISTICS,INDEX,GRANTS

5、壓縮dmp文件,compression=ALL

6、指定並行,parallel = 4

7、忘了開並行或指定dump文件大小等

attach進入expdp任務後在命令行交互模式輸入:

parallel = 4
filesize = 

2.1、庫、表空間、用戶、表等導出導入

oracle expdp支持整庫、表空間、整個用戶、表、視圖等對象的導出導入

1)、整庫導出導入

expdp hr FULL=y DUMPFILE=dpump_dir1:full1%U.dmp, dpump_dir2:full2%U.dmp
FILESIZE=2G PARALLEL=3 LOGFILE=dpump_dir1:expfull.log JOB_NAME=expfull

2)、按照用戶導出導入

nohup expdp chenqy/cqyang@ORCL_gdvgop parfile=gdvgop_liferary_EXPDP.par.20130820 &
directory=DMP content=all 
schemas=GDVGOP,LIFERAY 
dumpfile=gdvgop_liferay.dmp 
logfile=gdvgop_liferay.log 
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
nohup impdp chenqy/cqyang@orcl parfile=gdvgop_liferary_IMPDP.par.20130820 &
directory=SUNRISEDUMP 
content=all 
schemas=GDVGOP,LIFERAY 
remap_schema=LIFERAY:LIFERAY_GDVGOP 
remap_tablespace=TBS_DATA_VGOP:TBS_VGOP_DATA
dumpfile=gdvgop_liferay.dmp 
EXCLUDE=STATISTICS
logfile=impdp_gdvgop_liferay.log

3)、按照表空間導出導入

expdp system/manager DIRECTORY=dump_dir DUMPFILE=tablespace.dmp TABLESPACES=user01,user02 logfile=exp.log;

impdp system/manager DIRECTORY=dump_dir DUMPFILE=tablespace.dmp TABLESPACES=user01 logfile=exp.log;

4)、按照表導出導入

# --expdp $nohup expdp \'/ as sysdba\' parfile=MUSICDW_CUST_CONSUM_EXPDP.par.20130823 &
DIRECTORY=sunrisedump
#schemas=MUSICDW
content=all
DUMPFILE=MUSICDW_CUST_CONSUM_EXPDP_%U.dmp.20130823
logfile=MUSICDW_CUST_CONSUM_EXPDP.log.20130823
tables=MUSICDW.CUST_CONSUMPTION_LEV
#FILESIZE=20G  
#PARALLEL=8

++++++++++++++++++++++++++++++++++++++++++++++++
#$nohup impdp \'/ as sysdba\' parfile=MUSICDW_CUST_CONSUM_IMPDP.par.20130823 &
#schemas=MUSICDM
DIRECTORY=JESSE_EXPDP
content=all
DUMPFILE=MUSICDW_CUST_CONSUM_EXPDP_%U.dmp.20130823
logfile=MUSICDW_CUST_CONSUM_IMPDP.log.20130823
tables=MUSICDW.CUST_CONSUMPTION_LEV
#exclude=table:"in('RPT_INFO_QUERY_201306')"
table_exists_action=replace
#cluster=n
#remap_schema=CUSTPTY:MUSICDM
remap_tablespace=TBS_ODS_LOG:TBS_RPT
#PARALLEL=4

2.2、過濾對象

2.2.1、使用include

INCLUDE = object_type[:name_clause] [, ...] a list of valid values for object_type
DATABASE_EXPORT_OBJECTS   SCHEMA_EXPORT_OBJECTS   TABLE_EXPORT_OBJECTS  

如何導出指定的package、package body、procedure等
注意參考官方文檔,語法中include=後面跟的是object_type而不僅僅指表


--�����ݲֿ� musicdw�⵼��
# expdp parfile CUSTPTY_DW_EXPDP.par.20130809 $nohup expdp \'/ as sysdba\' parfile=CUSTPTY_DW_EXPDP.par.20130809 &
directory=sunrisedump
schemas=CUSTPTY
content=all
include=table:"in (select distinct table_name from dbmon.expcustlist20130809)"
dumpfile=CUSTPTY_DW_EXPDP_%U.dmp.20130809
logfile=CUSTPTY_DW_EXPDP.log.20130809
filesize=20G
cluster=n
parallel=4
--���뵽�ͻ�������custptr  custpty�û���
# impdp parfile CUSTPTY_DW_IMPDP.par.20130809 $nohup impdp \'/ as sysdba\' parfile=CUSTPTY_DW_IMPDP.par.20130809 &
DIRECTORY=JESSE_EXPDP
schemas=CUSTPTY
content=all
DUMPFILE=CUSTPTY_DW_EXPDP_%U.dmp.20130809
logfile=CUSTPTY_DW_IMPDP.log.20130809
table_exists_action=replace
cluster=n
remap_tablespace=TBS_RPT:TBS_ODS_LOG
PARALLEL=4

###########################################################
create table dbmon.expcustlist20130809 as select segment_name table_name from (select owner, segment_name, sum(bytes) / 1024 / 1024 bytes
          from dba_segments
         where (segment_name like 'DW_SONG_HOT_TOP_STEP_' or
               segment_name like 'DW_SONG_HOT_TOP_STEP__' or
               segment_name like 'DW_SINGER_SONG_HOT_TOP_STEP_' or
               segment_name like 'DW_SINGER_SONG_HOT_TOP_STEP__' or
               segment_name like 'DW_SINGER_SONG_PREF_REC_DM__' or
            /*   segment_name like 'DW_CUST_TAG_SONG_STYLE_RE__' or
               segment_name like 'DW_CUST_TAG_SONG_FEEL_RE__' or*/
               segment_name ='DW_SONG_PREF_RECOMMEND_DM'
              
             --  in ('DW_SONG_SALE_TOP_DM', 'DW_SONG_PREF_RECOMMEND_DM', 'DW_CUST_TAG_SONG_PARTY_RE', 'DW_CUST_TAG_SONG_DAY_RE')
             )
         group by owner, segment_name)

2.2.2、使用query選項

QUERY=(hr.employees:"WHERE last_name IN(SELECT last_name FROM hr.employees@dblink1)")

處理query參數中的單引號和雙引號,expdp 中query選項中有單引號或者雙引號

2.2.3、使用EXCLUDE排除對象

例如:導出全庫的DDL語句,導入時使用excluede排除不需要的系統用戶DDL

parfile中EXCLUDE=SCHEMA:"in('HR','SCOTT','SYS','SYSMAN')"

2.2.4、使用content來過濾導出元數據還是隻有數據

如果只是導出一個表的分區或者子分區,只需要導出數據就可以 content=data_only ,也不需要replace

如果只需要導出表結構,則 content=metadata_only

expdp \'/ as sysdba\' DIRECTORY=sunrisedump DUMPFILE=CUSTPTY.dmp SCHEMAS=CUSTPTY CONTENT=METADATA_ONLY include=table PARALLEL=2 logfile=CUSTPTY.log;
content參數控制的是全部導出表結構,靈活性不大。
如果要導出其中一個表的表結構,可以使用query來實現,但是數據量大的時候性能差(這種方法先導出後過濾適合數據量小)。
expdp \'/ as sysdba\' DIRECTORY=sunrisedump DUMPFILE=CUSTPTY.dmp logfile=custpty.log SCHEMAS=CUSTPTY include=table:"in('T','TT')"query='t:"where 1=2"'
使用exclude 參數來控制導出部分表的結構
expdp \'/ as sysdba\' ... tables=(t,tt) exclude=table/table_data:\"=\'T\'\"
  • impdp導入技巧,impdp導入表的時候加content=metadata_only參數,可以獲得表ddl語句以及insert具體語句

2.3、remap對象

  • remap_tablespace

導入到不同的表空間
導入數據時記得remap_tablespace,不僅源庫和目標庫表空間不一樣,並且一個用戶下所有的表不一定都在同一個表空。要去dba_tables或者dba_segments裏面查看對應的tbs name

  • remap_schema

導入到不同的用戶
把一個用戶導入另外一個用戶注意不僅要remap_schema而且還要remap_tablespace

2.4、估算導出的對象需要多長時間以及容量大小

$ expdp \'/ as sysdba\' ESTIMATE_ONLY=y schemas=SCOTT ESTIMATE=statistics
$ expdp \'/ as sysdba\' ESTIMATE_ONLY=y schemas=SCOTT ESTIMATE=blocks
ESTIMATE默認參數爲blocks
$ expdp help=y

2.5、遠程導出導入

2.5.1、利用network_link

oracle 10g+版本的expdp/impdp功能可以利用不同數據庫之間的dblink把源端數據在目標端使用impdp命令(network_link)直接導入。

用法一:使用expdp命令把遠端dump文件放入本地端directory中

本地端執行:用戶名密碼是本地端的

expdp \'/ as sysdba\' schemas=remote_users dumpfile=xx.dmp logfile=xx.dmp directory=local_dir network_link='';

用法二:在目標端使用impdp命令直接導入源端的數據

1、創建目標端到源端的dblink

前提是tnsping通過,需要配置tnsnames.ora

create database link target_to_source connect to source_user identified by password using '';

2、在目標端使用Impdp命令導入源端的數據

impdp target_user/password schemas=source_users network_link= target_to_source

2.5.2、使用tnsname連接數據庫進行導出導入

場景1:當一個數據庫(單機)安裝有多個實例時(開發環境居多)太別小心實例問題,導出導入語句一定要加上@name,例如:首先設置export ORACLE_SID=xxx

場景2:不能直接在數據庫本地執行命令,需要用客戶端連數據庫然後去執行導出導入命令

expdp chenqy/cqyang@orcl schemas=BOMCPORTAL directory=sunrisedump dumpfile=BOMCPORTAL20130808.dmp logfile=BOMCPORTAL20130808.log 
impdp chenqy/cqyang@orcl directory=sunrisedump dumpfile=BOMCPORTAL20130808.dmp schemas=BOMCPORTAL REMAP_SCHEMA=BOMCPORTAL:BOMCPORTAL_WH 

3、注意事項
目標端impdp時使用的用戶需要有dblink的權限。dblink中connect的用戶需要有導出source_objects的權限。遠程直接impdp不支持並行,也不支持某些數據類型,具體參考oracle官方文檔。

2.6、impdp優化

1、impdp 如何加快索引的創建

In What Order Are Indexes Built During Datapump Import (IMPDP) and How to Optimize the Index Creation (Doc ID 1966442.1)

4、EXP/IMP用法詳解

從oracle 10g開始開始,力推expdp/impdp,用來替換之前的exp/imp,目前最新19c版本仍然保留exp/imp功能,爲了兼容。但exp/imp也不是沒有優點,對於快速導出一張小表來說,還是挺好用,至少不用設置directory。

導入/導出是ORACLE倖存的最古老的兩個命令行工具,其實我從來不認爲Exp/Imp是一種好的備份方式,正確的說法是Exp/Imp只能是一個好的轉儲工具,特別是在小型數據庫的轉儲,表空間的遷移,表的抽取,檢測邏輯和物理衝突等中有不小的功勞。當然,我們也可以把它作爲小型數據庫的物理備份後的一個邏輯輔助備份,也是不錯的建議。對於越來越大的數據庫,特別是TB級數據庫和越來越多數據倉庫的出現,EXP/IMP越來越力不從心了,這個時候,數據庫的備份都轉向了RMAN和第三方工具。下面說明一下EXP/IMP的使用。

4.1、EXP/IMP命令行幫助信息

使用 $ exp/imp -help之前

如何使exp的幫助以不同的字符集顯示:set nls_lang=simplified chinese_china.zhs16gbk,通過設置環境變量,可以讓exp的幫助以中文顯示,如果set nls_lang=American_america.字符集,那麼幫助就是英文的了

EXP的所有參數(括號中爲參數的默認值):

USERID        用戶名/口令      如: USERID=duanl/duanl      
FULL          導出整個數據庫 (N)
BUFFER        數據緩衝區的大小         
OWNER        所有者用戶名列表,你希望導出哪個用戶的對象,就用owner=username
FILE           輸出文件 (EXPDAT.DMP)    
TABLES        表名列表 ,指定導出的table名稱,如:TABLES=table1,table2
COMPRESS     導入一個extent (Y)   
RECORDLENGTH   IO 記錄的長度
GRANTS        導出權限 (Y)            
INCTYPE        增量導出類型
INDEXES        導出索引 (Y)           
RECORD        跟蹤增量導出 (Y)
ROWS           導出數據行 (Y)        
PARFILE        參數文件名,如果你exp的參數很多,可以存成參數文件.
CONSTRAINTS   導出約束 (Y)    
CONSISTENT    交叉表一致性
LOG            屏幕輸出的日誌文件    
STATISTICS     分析對象 (ESTIMATE)
DIRECT         直接路徑 (N)              
TRIGGERS      導出觸發器 (Y)
FEEDBACK      顯示每 x 行 (0) 的進度
FILESIZE        各轉儲文件的最大尺寸
QUERY          選定導出表子集的子句
下列關鍵字僅用於可傳輸的表空間
TRANSPORT_TABLESPACE 導出可傳輸的表空間元數據 (N)
TABLESPACES 將傳輸的表空間列表

IMP的所有參數(括號中爲參數的默認值):

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 擁有可傳輸表空間集中數據的用戶

關於增量參數的說明:exp/imp的增量並不是真正意義上的增量,所以最好不要使用。
使用方法:
Exp parameter_name=value or Exp parameter_name=(value1,value2)
只要輸入參數help=y就可以看到所有幫助.

4.2、EXP/IMP常用選項

  • EXP常用選項

1.FULL,這個用於導出整個數據庫,在ROWS=N一起使用時,可以導出整個數據庫的結構。例如:
exp userid=test/test file=./db_str.dmp log=./db_str.log full=y rows=n compress=y direct=y

  1. OWNER和TABLE,這兩個選項用於定義EXP的對象。OWNER定義導出指定用戶的對象;TABLE指定EXP的table名稱,例如:
    exp userid=test/test file=./db_str.dmp log=./db_str.log owner=duanl
    exp userid=test/test file=./db_str.dmp log=./db_str.log table=nc_data,fi_arap

3.BUFFER和FEEDBACK,在導出比較多的數據時,我會考慮設置這兩個參數。例如:
exp userid=test/test file=yw97_2003.dmp log=yw97_2003_3.log feedback=10000 buffer=100000000 tables=WO4,OK_YT

4.FILE和LOG,這兩個參數分別指定備份的DMP名稱和LOG名稱,包括文件名和目錄,例子見上面。

5.COMPRESS參數不壓縮導出數據的內容。用來控制導出對象的storage語句如何產生。默認值爲Y,使用默認值,對象的存儲語句的init extent等於當前導出對象的extent的總和。推薦使用COMPRESS=N。

  1. FILESIZE該選項在8i中可用。如果導出的dmp文件過大時,最好使用FILESIZE參數,限制文件大小不要超過2G。如:
    exp userid=duanl/duanl file=f1,f2,f3,f4,f5 filesize=2G owner=scott
    這樣將創建f1.dmp, f2.dmp等一系列文件,每個大小都爲2G,如果導出的總量小於10G
    EXP不必創建f5.dmp.
  • IMP常用選項

1、FROMUSER和TOUSER,使用它們實現將數據從一個SCHEMA中導入到另外一個SCHEMA中。例如:假設我們做exp時導出的爲test的對象,現在我們想把對象導入用戶:
imp userid=test1/test1 file=expdat.dmp fromuser=test1 touser=test1

2、IGNORE、GRANTS和INDEXES,其中IGNORE參數將忽略表的存在,繼續導入,這個對於需要調整表的存儲參數時很有用,我們可以先根據實際情況用合理的存儲參數建好表,然後直接導入數據。而GRANTS和INDEXES則表示是否導入授權和索引,如果想使用新的存儲參數重建索引,或者爲了加快到入速度,我們可以考慮將INDEXES設爲N,而GRANTS一般都是Y。例如:imp userid=test1/test1 file=expdat.dmp fromuser=test1 touser=test1 indexes=N

4.3、EXP/IMP與字符集

進行數據的導入導出時,我們要注意關於字符集的問題。在EXP/IMP過程中我們需要注意四個字符集的參數:導出端的客戶端字符集,導出端數據庫字符集,導入端的客戶端字符集,導入端數據庫字符集。
我們首先需要查看這四個字符集參數。
查看數據庫的字符集的信息:

SQL> select * from nls_database_parameters;
PARAMETER                       VALUE
------------------------------ --------------------------------------------------------------------------
NLS_LANGUAGE                    AMERICAN
NLS_TERRITORY                    AMERICA
NLS_CURRENCY                    $
NLS_ISO_CURRENCY                AMERICA
NLS_NUMERIC_CHARACTERS          .,
NLS_CHARACTERSET                ZHS16GBK
NLS_CALENDAR                    GREGORIAN
NLS_DATE_FORMAT                 DD-MON-RR
NLS_DATE_LANGUAGE               AMERICAN
NLS_SORT                          BINARY
NLS_TIME_FORMAT                 HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT            DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT              HH.MI.SSXFF AM TZH:TZM
NLS_TIMESTAMP_TZ_FORMAT         DD-MON-RR HH.MI.SSXFF AM TZH:TZM
NLS_DUAL_CURRENCY               $
NLS_COMP                        BINARY
NLS_NCHAR_CHARACTERSET          ZHS16GBK
NLS_RDBMS_VERSION               8.1.7.4.1
NLS_CHARACTERSET:ZHS16GBK是當前數據庫的字符集。

我們再來查看客戶端的字符集信息:

客戶端字符集的參數NLS_LANG=_< territory >.
language:指定oracle消息使用的語言,日期中日和月的顯示。
Territory:指定貨幣和數字的格式,地區和計算星期及日期的習慣。
Characterset:控制客戶端應用程序使用的字符集。通常設置或等於客戶端的代碼頁。或者對於unicode應用設爲UTF8。

在windows中,查詢和修改NLS_LANG可在註冊表中進行:

HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\HOMExx\

xx指存在多個Oracle_HOME時的系統編號。

在unix中:

$ env|grep NLS_LANG
NLS_LANG=simplified chinese_china.ZHS16GBK

unix中修改爲可用:

$ export NLS_LANG=AMERICAN_AMERICA.UTF8

通常在導出時最好把客戶端字符集設置得和數據庫端相同。當進行數據導入時,主要有以下兩種情況:

(1) 源數據庫和目標數據庫具有相同的字符集設置。
這時,只需設置導出和導入端的客戶端NLS_LANG等於數據庫字符集即可。
(2) 源數據庫和目標數據庫字符集不同。
先將導出端客戶端的NLS_LANG設置成和導出端的數據庫字符集一致,導出數據,然後將導入端客戶端的NLS_LANG設置成和導出端一致,導入數據,這樣轉換隻發生在數據庫端,而且只發生一次。
這種情況下,只有當導入端數據庫字符集爲導出端數據庫字符集的嚴格超集時,數據才能完全導成功,否則,可能會有數據不一致或亂碼出現。

4.4、不同版本的EXP/IMP問題

一般來說,從低版本導入到高版本問題不大,麻煩的是將高版本的數據導入到低版本中,在Oracle9i之前,不同版本Oracle之間的EXP/IMP可以通過下面的方法來解決:

1、在高版本數據庫上運行低版本的catexp.sql;
2、使用低版本的EXP來導出高版本的數據;
3、使用低版本的IMP將數據庫導入到低版本數據庫中;
4、在高版本數據庫上重新運行高版本的catexp.sql腳本。

但在9i中,上面的方法並不能解決問題。如果直接使用低版本EXP/IMP會出現如下錯誤:

EXP-00008: orACLE error %lu encountered
orA-00904: invalid column name

這已經是一個公佈的BUG,需要等到Oracle10.0才能解決,BUG號爲2261722,你可以到METALINK上去查看有關此BUG的詳細信息。

BUG歸BUG,我們的工作還是要做,在沒有Oracle的支持之前,我們就自己解決。在Oracle9i中執行下面的SQL重建exu81rls視圖即可。

Create or REPLACE view exu81rls
(objown,objnam,policy,polown,polsch,polfun,stmts,chkopt,enabled,spolicy)
AS select u.name, o.name, r.pname, r.pfschma, r.ppname, r.pfname,
decode(bitand(r.stmt_type,1), 0,'', 'Select,')
|| decode(bitand(r.stmt_type,2), 0,'', 'Insert,')
|| decode(bitand(r.stmt_type,4), 0,'', 'Update,')
|| decode(bitand(r.stmt_type,8), 0,'', 'Delete,'),
r.check_opt, r.enable_flag,
DECODE(BITAND(r.stmt_type, 16), 0, 0, 1)
from user$ u, obj$ o, rls$ r
where u.user# = o.owner#
and r.obj# = o.obj#
and (uid = 0 or
uid = o.owner# or
exists ( select * from session_roles where role='Select_CATALOG_ROLE')
)
/
grant select on sys.exu81rls to public;
/
 
/* Formatted on 2011/07/22 13:22:16 (QP5 v5.114.809.3010) */
CREATE OR REPLACE VIEW exu81rls
(
   objown,
   objnam,
   policy,
   polown,
   polsch,
   polfun,
   stmts,
   chkopt,
   enabled,
   spolicy
)
AS
   SELECT   u.name,
            o.name,
            r.pname,
            r.pfschma,
            r.ppname,
            r.pfname,
               DECODE (BITAND (r.stmt_type, 1), 0, '', 'Select,')
            || DECODE (BITAND (r.stmt_type, 2), 0, '', 'Insert,')
            || DECODE (BITAND (r.stmt_type, 4), 0, '', 'Update,')
            || DECODE (BITAND (r.stmt_type, 8), 0, '', 'Delete,'),
            r.check_opt,
            r.enable_flag,
            DECODE (BITAND (r.stmt_type, 16), 0, 0, 1)
     FROM   user$ u, obj$ o, rls$ r
    WHERE       u.user# = o.owner#
            AND r.obj# = o.obj#
            AND (   UID = 0
                 OR UID = o.owner#
                 OR EXISTS (SELECT   *
                              FROM   session_roles
                             WHERE   role = 'Select_CATALOG_ROLE'))
/
 
GRANT SELECT ON sys.exu81rls TO public;
 
/

可以跨版本的使用EXP/IMP,但必須正確地使用EXP和IMP的版本:
1、總是使用IMP的版本匹配數據庫的版本,如:要導入到817中,使用817的IMP工具。
2、總是使用EXP的版本匹配兩個數據庫中最低的版本,如:從9201往817中導入,則使用817版本的EXP工具。

5、EXP/IMP使用技巧和案例

5.1、exp使用rowid分割支持並行

exp這種落後的導出方式可以通過rowid分割方式來並行導出,腳本如下:

E:/1@Repository IT/1.0@Oracle/1.0.0@基本日常管理/邏輯導出導入/exp並行腳本

5.2、imp優化

參考文檔:Tuning Considerations When Import Is Slow [ID 93763.1]

imp優化下面幾種方式參考:

1.避免磁盤排序
將sort_area_size設置爲一個較大的值,比如100M
2.避免日誌切換等待
增加重做日誌組的數量,增大日誌文件大小.
3.優化日誌緩衝區
比如將log_buffer容量擴大10倍(最大不要超過5M)
4.使用陣列插入與提交
commit = y
注意:陣列方式不能處理包含LOB和LONG類型的表,對於這樣的table,如果使用commit = y,每插入一行,就會執行一次提交.
5.使用NOLOGGING方式減小重做日誌大小
在導入時指定參數indexes=n,只導入數據而忽略index,在導完數據後在通過腳本創建index,指定 NOLOGGING選項 

當需要exp/imp的數據量比較大時,這個過程需要的時間是比較長的,我們可以用一些方法來優化exp/imp的操作。
exp:使用直接路徑 direct=y
oracle會避開sql語句處理引擎,直接從數據庫文件中讀取數據,然後寫入導出文件.
可以在導出日誌中觀察到: exp-00067: table xxx will be exported in conventional path

如果沒有使用直接路徑,必須保證buffer參數的值足夠大.
有一些參數與direct=y不兼容,無法用直接路徑導出可移動的tablespace,或者用query參數導出數據庫子集.

當導入導出的數據庫運行在不同的os下時,必須保證recordlength參數的值一致.

5.3、Read DMP info

很多情況下別人直接扔給你個dmp文件也沒有告訴你使用什麼工具導出的,也不知道是按照表導出的還是按照用戶導出的。其實這些信息可以不用去問別人,dmp文件頭部的一些信息可以告訴我們

用oracle的exp工具導出的dmp文件也包含了字符集信息,dmp文件的第2和第3個字節記錄了dmp文件的字符集。如果dmp文件不大,比如只有幾M或幾十M,可以用UltraEdit打開(16進制方式),看第2第3個字節的內容,如0354,然後用以下SQL查出它對應的字符集:

SQL> select nls_charset_name(to_number(‘0354’,‘xxxx’)) from dual;

ZHS16GBK

如果dmp文件很大,比如有2G以上(這也是最常見的情況),用文本編輯器打開很慢或者完全打不開,可以用以下命令(在unix主機上):

cat exp.dmp |od -x|head -1|awk ‘{print $2 $3}’|cut -c 3-6

然後用上述SQL也可以得到它對應的字符集。

右邊部分是exp的版本信息等。如果是按照用戶導出會有如:DCHENQY.RUSERS信息。如果是按照表導出,會有如:DCHENQY.RTABLES信息。

如圖所示:按照表導出
在這裏插入圖片描述

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

修改dmp文件字符集

上文說過,dmp文件的第2第3字節記錄了字符集信息,因此直接修改dmp文件的第2第3字節的內容就可以‘騙’過oracle的檢查。這樣做理論上也僅是從子集到超集可以修改,但很多情況下在沒有子集和超集關係的情況下也可以修改,我們常用的一些字符集,如US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK基本都可以改。因爲改的只是dmp文件,所以影響不大。

具體的修改方法比較多,最簡單的就是直接用UltraEdit修改dmp文件的第2和第3個字節。

比如想將dmp文件的字符集改爲ZHS16GBK,可以用以下SQL查出該種字符集對應的16進制代碼: SQL> select to_char(nls_charset_id(‘ZHS16GBK’), ‘xxxx’) from dual;

0354

然後將dmp文件的2、3字節修改爲0354即可。

如果dmp文件很大,用ue無法打開,就需要用程序的方法了

5.4、exp/imp案例

1、設置客戶端字符集

linux:export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK  --一定要大寫
windows: set nls_lang=AMERICAN_AMERICA.ZHS16GBK   --windows 不區分大小寫
unix: nls_lang=AMERICAN_AMERICA.ZHS16GBK

2、考慮是否要導出導入權限、索引==

一般來說權限單獨grant,索引根據導出導入的性能來決定是否需要索引
-------分區表應該創建好後,再進行導入

3、linux環境

我喜歡linux,可以方便的使用腳本–實例見附件

4、windows環境

(1)按表導:
導出:

 exp oracle/oracle@orcl file=D:\dmp\oracle1.dmp tables=(oracle.BOOK_B,oracle.BOOK_C) log=D:\dmp\oracle.log 

導入:

 imp oracle/oracle@orcl file=D:\dmp\oracle1.dmp tables=(BOOK_B,BOOK_C) log=D:\dmp\oracle.log 

(2)按用戶導:
導出:

exp oracle/oracle@oraibss file=d:\dmp\user%date:~0,10%.dmp log=d:\dmp\user%date:~0,10%.log owner=user compress=n buffer=8092 consistent=y direct=n constraints=y feedback=10000 grants=y record=y indexes=y triggers=y rows=y 

導入:

imp oracle/oracle fromuser=(oracle) touser=(oracle) file=d:\dmp\user.dmp log=d:\dmp\user.log 

(3)全庫導:
導出:

exp system/oracle@oraibss full=y direct=n buffer=8192 compress=y file=d:\dmp\full%date:~0,10%.dmp log=d:\dmp\full%date:~0,10%.log 
exp system/oracle@oraback full=y direct=n buffer=8192 compress=y file=d:\dmp\fulloracle.dmp log=d:\dmp\fulloracle.log 

導入:

imp system/oracle@oratest full=y buffer=8192 file=d:\dmp\full%date:~0,10%.dmp log=d:\dmp\fullimp%date:~0,10%.log 
imp system/oracle@oratest full=y buffer=8192 file=/backup/back/full.$DATELOG.01.dmp log=/backup/back/full.$DATELOG.log

5.5、exp備份數據庫腳本

#!/bin/bash 
PATH=$PATH:$HOME/bin

export PATH

export ORACLE_BASE=/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1
export ORACLE_SID=uprr
export PATH=$PATH:$HOME/BIN:$ORACLE_HOME/bin
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

NOWDATE=`date "+%Y%m%d"`
LOGDIR="/safedata/crontab/log"

NOWDATE_7=`date -d -7days +%Y%m%d`
NOWDATE_8=`date -d -8days +%Y%m%d`
NOWDATE_9=`date -d -9days +%Y%m%d`
NOWDATE_10=`date -d -10days +%Y%m%d`
NOWDATE_11=`date -d -11days +%Y%m%d`
NOWDATE_12=`date -d -12days +%Y%m%d`
NOWDATE_13=`date -d -13days +%Y%m%d`

FILEPATH=/safedata/oracle/dmpbak/${NOWDATE}

mkdir -p ${FILEPATH}
cd ${FILEPATH}

echo "Start export file..." >> "$LOGDIR"/"$NOWDATE"_dmp.log

USER=UPRR
echo ${USER} file=${NOWDATE}_${USER}.dmp >> "$LOGDIR"/"$NOWDATE"_dmp.log
exp \'sys/sys as sysdba\' owner=${USER} file=${NOWDATE}_${USER}.dmp log=logfile_${USER}.log
echo "Complete export ${USER} file..." >> "$LOGDIR"/"$NOWDATE"_dmp.log

USER=METABASE
echo ${USER} file=${NOWDATE}_${USER}.dmp >> "$LOGDIR"/"$NOWDATE"_dmp.log
exp \'sys/sys as sysdba\' owner=${USER} file=${NOWDATE}_${USER}.dmp log=logfile_${USER}.log
echo "Complete export ${USER} file..." >> "$LOGDIR"/"$NOWDATE"_dmp.log

USER=DATACORE
echo ${USER} file=${NOWDATE}_${USER}.dmp >> "$LOGDIR"/"$NOWDATE"_dmp.log
exp \'sys/sys as sysdba\' owner=${USER} file=${NOWDATE}_${USER}.dmp log=logfile_${USER}.log
echo "Complete export ${USER} file..." >> "$LOGDIR"/"$NOWDATE"_dmp.log

USER=MDR
echo ${USER} file=${NOWDATE}_${USER}.dmp >> "$LOGDIR"/"$NOWDATE"_dmp.log
exp \'sys/sys as sysdba\' owner=${USER} file=${NOWDATE}_${USER}.dmp log=logfile_${USER}.log
echo "Complete export ${USER} file..." >> "$LOGDIR"/"$NOWDATE"_dmp.log

USER=ABOQ
echo ${USER} file=${NOWDATE}_${USER}.dmp >> "$LOGDIR"/"$NOWDATE"_dmp.log
exp \'sys/sys as sysdba\' owner=${USER} file=${NOWDATE}_${USER}.dmp log=logfile_${USER}.log
echo "Complete export ${USER} file..." >> "$LOGDIR"/"$NOWDATE"_dmp.log

USER=REPORT
echo ${USER} file=${NOWDATE}_${USER}.dmp >> "$LOGDIR"/"$NOWDATE"_dmp.log
exp \'sys/sys as sysdba\' owner=${USER} file=${NOWDATE}_${USER}.dmp log=logfile_${USER}.log
echo "Complete export ${USER} file..." >> "$LOGDIR"/"$NOWDATE"_dmp.log

USER=WORK
echo ${USER} file=${NOWDATE}_${USER}.dmp >> "$LOGDIR"/"$NOWDATE"_dmp.log
exp \'sys/sys as sysdba\' owner=${USER} file=${NOWDATE}_${USER}.dmp log=logfile_${USER}.log
echo "Complete export ${USER} file..." >> "$LOGDIR"/"$NOWDATE"_dmp.log

echo "Complete export file..." >> "$LOGDIR"/"$NOWDATE"_dmp.log

#ɾ��һ��ǰ��7����dmp�����ļ�

cd /safedata/oracle/dmpbak
rm -fr ${NOWDATE_7} >> "$LOGDIR"/"$NOWDATE"_dmp.log
rm -fr ${NOWDATE_8} >> "$LOGDIR"/"$NOWDATE"_dmp.log 
rm -fr ${NOWDATE_9} >> "$LOGDIR"/"$NOWDATE"_dmp.log
rm -fr ${NOWDATE_10} >> "$LOGDIR"/"$NOWDATE"_dmp.log
rm -fr ${NOWDATE_11} >> "$LOGDIR"/"$NOWDATE"_dmp.log
rm -fr ${NOWDATE_12} >> "$LOGDIR"/"$NOWDATE"_dmp.log
rm -fr ${NOWDATE_13} >> "$LOGDIR"/"$NOWDATE"_dmp.log

#sleep 300

#cd ..
#tar -cvf ${NOWDATE}.tar ${NOWDATE}

#gzip ${NOWDATE}_${USER}.dmp
#gzip ${NOWDATE}.tar
#rm -fR ${NOWDATE}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章