imp腳本
A. 如何在shell 腳本中使用imp命令
例如將scott用戶下所有表,導入到test用戶下
1 exp scott/tiger file=scott.dmp owner=scott
2 (1) 如果test用戶下有scott的表,哪些需要先刪除在導入
conn test/test
select 'drop table '||table_name||' purge;' from user_tables;
imp test/test file=scott.dmp fromuser=scott touser=test
(2) 如果test用戶下沒有scott用戶的表,可以直接導入
imp test/test file=scott.dmp fromuser=scott touser=test
B. 如何寫exp和imp腳本命令
EXP/IMP備份(導出/導入備份)
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/proct/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 'sys/sys@instance as sysdba' tables=scott.emp file=e:/emp.dmp
B: Unix & linux平台(這時的"'"需要用到轉義字元"/"):
$ exp /'sys/change_on_install@instance as sysdba/' tables=scott.emp file=/home/oracle/emp.dmp
C: 表空間導入和導出
$ imp /'usr/pwd@instance as sysdba/' tablespaces=xx transport_tablespace=y
file=xxx.dmp datafiles=xxx.dbf
2. 交互輸入方式:
exp tables=scott.emp --不輸入連接字元串,直接回車
Export: Release 10.2.0.3.0 - Proction on Fri Jun 25 07:39:46 2004 Copyright (c) 1982, 2005, Oracle. All rights reserved.
Username: sys/change_on_install@instance as sysdba --輸入連接字元串.
3.如果是寫在參數文件中,則連接字元串需要用雙引號了:USERID="sys/change_on_install@instance 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)或(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
C. oracle imp命令怎麼只導入某個存儲過程
通過輸入 IMP 命令和您的用戶名/口令, 導入
操作將提示您輸入參數:
例如: IMP SCOTT/TIGER
或者, 可以通過輸入 IMP 命令和各種參數來控制導入
的運行方式。要指定參數, 您可以使用關鍵字:
格式: IMP KEYWORD=value 或 KEYWORD=(value1,value2,...,valueN)
例如: IMP SCOTT/TIGER IGNORE=Y TABLES=(EMP,DEPT) FULL=N
或 TABLES=(T1:P1,T1:P2), 如果 T1 是分區表
USERID 必須是命令行中的第一個參數。
關鍵字 說明 (默認值) 關鍵字 說明 (默認值)
--------------------------------------------------------------------------
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)
FEEDBACK 每 x 行顯示進度 (0)
TOID_NOVALIDATE 跳過指定類型 ID 的驗證
FILESIZE 每個轉儲文件的最大大小
STATISTICS 始終導入預計算的統計信息
RESUMABLE 在遇到有關空間的錯誤時掛起 (N)
RESUMABLE_NAME 用來標識可恢復語句的文本字元串
RESUMABLE_TIMEOUT RESUMABLE 的等待時間
COMPILE 編譯過程, 程序包和函數 (Y)
STREAMS_CONFIGURATION 導入流的一般元數據 (Y)
STREAMS_INSTANTIATION 導入流實例化元數據 (N)
DATA_ONLY 僅導入數據 (N)
下列關鍵字僅用於可傳輸的表空間
TRANSPORT_TABLESPACE 導入可傳輸的表空間元數據 (N)
TABLESPACES 將要傳輸到資料庫的表空間
DATAFILES 將要傳輸到資料庫的數據文件
TTS_OWNERS 擁有可傳輸表空間集中數據的用戶
希望能有你想要的
D. 利用EXP/IMP進行數據遷移,如何轉換表空間操作(完整版)
�0�2下面是處理過程。1、在目標資料庫,以system登錄後,執行ALTER TABLESPACE TS-D RENAME TO TS-S;2、再執行imp命令;3、執行完成後,執行ALTER TABLESPACE TS-S RENAME TO TS-D;�0�2附1:單個移動表或索引到新的表空間另附,把表或索引從一個表空間移動到另一個表空間的腳本,前提是以該表或索引的owner用戶登錄。ALTER INDEX SYS_C007673 REBUILD TABLESPACE zjkfq; ALTER TABLE website MOVE TABLESPACE zjkfq;�0�2附2:批量移動表或索引到新的表空間,對於大表,速度較慢將表批量移動到另一個表空間1)表 執行以下sql生成批量的sql語句,控制台結果輸出為sql語句 select 'alter table '||table_name||' MOVE TABLESPACE ZJMZ;' from user_tables; 2)復制上一步生成的輸出(sql格式),執行即可。將索引批量移動到另一個表空間 1)執行以下sql生成批量的sql語句, 2)復制上一步生成的輸出(sql格式),執行即可。
E. 如何正確使用ORACLE的exp和imp
1、EXP和IMP工具是否可以跨平台使用?比如我在WINDOWS上用EXP導出數據之後到LINUX或者UNIX上用IMP導入數據?
可以,但一般都是用同樣的工具做導出和導入,WINDOWS上和UNIX上的ENDIANNESS不同,混用的話,這個工具有BUG。
2、EXP和IMP工具是否可以跨版本使用?比如我用9i的EXP工具導出數據之後到10g上用IMP導入數據這樣是否可以?
這個工具有挺嚴格的版本限制,不能跨版本使用,你舉例的這種會不識別的。
3、EXP導出的時候,TABLE參數填寫的是多個表名,那麼在IMP的時候是否可以只導入其中的某一個表,該如何操作?
EXP tables=(tab1,tab2)
IMP tables=(tab2)
沒有什麼特別的,這個自己試一下就知道了
4、EXP導出的數據,在IMP的時候如果機器上沒有對應的表,IMP工具是否會自動創建表結構?是否必須我手動先創建好表結構才能IMP成功?
IMP時候會自動執行CREATE語句,然後才是INSERT,所以你的問題恰好說反了,
是如果你已經建好表結構的話,IMP會報警告,說這個表已經存在了,需要在導入時IGNORE=Y
5、EXP導出的數據,在IMP的時候目標機器上的資料庫表空間分配是否必須和原來的機器上的一致(空間大小肯定夠,就是空間的其他配置是否必須一致)?如果不一致是否可以?
這個工具有個限制,導出時候的表空間名必須就是導入到這個同樣名稱的表空間裡面,如果沒有這個表空間的話,導入失敗,
不知道你說的其他配置是什麼配置,我只能說只要名稱相同的話,問題不大,具體問題具體分析了。
F. oracle導出建庫腳本
Oracle用戶的導出與導入
導出:
1、 找到你Oracle安裝位置的bin目錄下的 emp.exe
如: D:\oracletools\oracle\proct\10.2.0\db_1\BIN
2、雙擊運行,輸入你要導出的用戶名和密碼(密碼不可見)
3、輸入你導出文件存放的位置
如:d:\crm.dmp 【一定是bmp文件】
導入:
1、 創建用戶 如:crm 【如果存在crm用戶(裡面含有數據等 先刪除 drop user crm cascade)】
2、 賦權讓其擁有導入的許可權 grant dba to crm
3、 找到你Oracle安裝位置的bin目錄下的 imp.exe
4、 輸入你要導入dmp文件的位置
用Oracle的這種方式導出,比較好一些。 如果使用裡面的sql導出的話,導出的是sql文件,
這種方式的話就是dmp文件,如果要使用直接導入就行。
G. oracle用imp腳本導入資料庫,提示成功終止導入, 沒有出現警告.,該怎麼解決
既然都已經成功導入了,也沒有錯誤提示,那就應該成功了。
可以到資料庫里查一下看看數據是否都已經導入
如果你懷疑導入有問題,在寫導入腳本時,加參數 log=imp.log
最好將你導入的腳本貼出來