來源:http://secyaher.blog.163.com/blog/static/389557720092935857930/
如何寫批處理文件自動將數據導入oracle數據庫
最近項目中也需要實現以上功能,花了點時間搜索實驗,整理如下:
@echo off
sqlplus system/manager @createuser
imp system/manager file=initial.dmp fromuser=initialuser touser=initialuser ignore = y
create user initialuser identified by test;
grant dba,resource,connect to initialuser;
exit;
@echo off 表示其之後的命令不在命令提示符窗口顯示出來
sqlplus爲oracle的一個工具程序,須先安裝oracle後才能使用
system/manager 爲oracle的一個默認管理員帳戶,如果被鎖定或更改密碼了就不能用了,可以用其它
@createuser 表示執行createuser.sql文件
該sql文件中, create user xx identified by yy;表示創建一個密碼爲yy的用戶xx;
grant dba,resource,connect to xx;表示授權給用戶xx dba,resource,connect 權限
Oracle數據導入導出imp/exp
功能:Oracle數據導入導出imp/exp就相當與oracle數據還原與備份。
大多情況都可以用Oracle數據導入導出完成數據的備份和還原(不會造成數據的丟失)。
Oracle有個好處,雖然你的電腦不是服務器,但是你裝了oracle客戶端,並建立了連接
(通過net8 assistant中本地-->服務命名 添加正確的服務命名
其實你可以想成是客戶端與服務器端修了條路,然後數據就可以被拉過來了)
這樣你可以把數據導出到本地,雖然可能服務器離你很遠。
你同樣可以把dmp文件從本地導入到遠處的數據庫服務器中。
利用這個功能你可以構建倆個相同的數據庫,一個用來測試,一個用來正式使用。
執行環境:可以在SQLPLUS.EXE或者DOS(命令行)中執行,
DOS中可以執行時由於 在oracle 8i 中 安裝目錄\ora81\BIN被設置爲全局路徑,
該目錄下有EXP.EXE與IMP.EXE文件被用來執行導入導出。
oracle用java編寫,我想SQLPLUS.EXE、EXP.EXE、IMP.EXE這倆個文件是被包裝後的類文件。
SQLPLUS.EXE調用EXP.EXE、IMP.EXE他們所包裹的類,完成導入導出功能。
下面介紹的是導入導出的實例,嚮導入導出看實例基本上就可以完成,因爲導入導出很簡單。
數據導出:
1 將數據庫TEST完全導出,用戶名system 密碼manager 導出到D:\daochu.dmp中
exp system/manager@TEST file=d:\daochu.dmp full=y
2 將數據庫中system用戶與sys用戶的表導出
exp system/manager@TEST file=d:\daochu.dmp owner=(system,sys)
3 將數據庫中的表table1 、table2導出
exp system/manager@TEST file=d:\daochu.dmp tables=(table1,table2)
4 將數據庫中的表table1中的字段filed1以"00"打頭的數據導出
exp system/manager@TEST file=d:\daochu.dmp tables=(table1) query=\"
where filed1 like '00%'\"
上面是常用的導出,對於壓縮我不太在意,用winzip把dmp文件可以很好的壓縮。
不過在上面命令後面 加上 compress=y 就可以了
數據的導入
1 將D:\daochu.dmp 中的數據導入 TEST數據庫中。
imp system/manager@TEST file=d:\daochu.dmp
上面可能有點問題,因爲有的表已經存在,然後它就報錯,對該表就不進行導入。
在後面加上 ignore=y 就可以了。
2 將d:\daochu.dmp中的表table1 導入
imp system/manager@TEST file=d:\daochu.dmp tables=(table1)
基本上上面的導入導出夠用了。不少情況我是將表徹底刪除,然後導入。
注意:
你要有足夠的權限,權限不夠它會提示你。
數據庫時可以連上的。可以用tnsping TEST 來獲得數據庫TEST能否連上。
以前我們一般都是使用PL/SQL Developer來實現,但是PL/SQL Developer在導出、導入數據時有兩個問題:
1、要把表數據和對象(存儲過程、視圖)分開導出
2、導出的視圖如果有註釋,那麼在導入時常常會出錯。
其實,PL/SQL的導出、導入功能使用的是Oracle自帶的工具:exp和imp,這兩個工具的導出導入數據時提供了很多功能,PL/SQL 只是使用其中的一些功能。下面對它們簡單介紹一下:
1 exp/imp使用方法及實例
exp/imp爲一種數據庫備份恢復工具也可以作爲不同數據庫之間傳遞數據的工具兩個數據庫所在的操作系統可以不同exp 可以將數據庫數據導出爲二進制文件imp 可以將導出的數據文件再導入到相同的數據庫或不同的數據庫
數據庫導出有四種模式full(全庫導出), owner(用戶導出), table(表導出), tablespace(表空間導出).
full( 全庫導出): 導出除ORDSYS,MDSYS,CTXSYS,ORDPLUGINS,LBACSYS 這些系統用戶之外的所有用戶的數據.
owner( 用戶導出): 導出某個或某些用戶的所有權限和數據.
tables( 表導出): 導出某些表(可以是不同用戶的)的結構和數據.
tablespace( 表空間導出):表空間導出數據.
執行exp 有三種方法:交互式,命令行和參數文件
交互式:直接輸入exp 命令用戶可以按照exp 提示的信息一步一步操作,比較簡單.
命令行:輸入命令行exp username/password parameter=value.
參數文件:輸入命令行exp username/password parfile=filename exp 所需的參數從參數文件引入.
參數是可以重複的優先級爲命令行優於參數文件後面的參數值覆蓋於前面的參數值.
參數介紹
詳細的介紹可通過exp help=y或imp helpe=y來查看。下面只對一些常用的參數進行說明。
buffer 緩衝區大小如果此值設爲0 則一次只導入一條記錄對數據量大的導出可以設置較大一般缺省值即可.
file 導出的文件列表可以指定一個或多個文件名缺省擴展名爲.dmp 缺省導出文件名爲expdat.dmp.
filesize exp 導出文件的最大字節數超出時從文件列表中獲取下一個文件名,沒有,則提示輸入新的文件名.
help 顯示export 參數幫助信息
inctype 增量備份的類型:complete(完全),cumulative(累積)和incremental (增量).
只可以在全庫導出模式下纔可以做完全累積或增量導出累積導出只導出自上次累積導出或完全導出以來已經修改的表增量導出只導出自上次增量累積或完全導出以來已經修改的表完全導出將數據庫中全部對象都導出不管是否以及何時被修改.
log:日誌文件,一般如果以命令行導入時,將log 設置上比較好可以看,到所有的導入信息,導入信息哪兒出錯,導入了那些數據庫對象.
show(imp):只是用來顯示備份數據文件的內容.
full:爲Y 時表示在全庫方式下導出缺省爲N.
tables:導出的表列表可以指定一個或多個表名.
fromuser(imp):可以將導出文件中的一個用戶模式的數據對象導入爲另一個用戶模式的對象此參數表示導出文件中的用戶模式.
touser(imp):此參數表示導入到數據庫中時使用的用戶模式對象譬如使用全庫或者用戶模式導出caittmdba用戶的所有對象到一個文件中導入時需要將用戶模式名稱改爲caittmdba1此時fromuser 爲caittmdba,touser 爲caittmdba1
導出、導入實例
導出數據:
D:\oracle\ora92\bin\exp userid=caittmdba/cait@YSDB_192.168.1.2 owner=caittmdba file=e:\%DATE%.dmp log=e:\exp.log
通過該命令可以把caittmdba這個用戶所屬的所有數據、對象導出到一個文件中,導出的日誌寫在e:\exp.log文件中,連接Oracle的本地服務名爲YSDB_192.168.1.2,導出的文件爲e:\%DATE%.dmp,這個文件的文件名是當前的日期。如果把這個命令寫成批處理文件,並放到計劃任務中,就可以自動進行備份數據了。
導入數據:
D:\oracle\ora92\bin\imp userid=caittmdba/cait@YSDB_192.168.1.2 fromuser=caittmdba touser=caittmdba file=e:\data.dmp log=e:\imp.log
注意事項
在導出數據時常常會出現Oracle 942 錯誤,這個錯誤往往是在對Oracle進行了升級後纔會出現,這是Oracle升級程序的一個Bug(Oracle的Bug和補丁一直以來都是滿天飛,而且不成體系,文檔和技術支持以少,這一點和MS比起來就差很遠了。如果大家去看一看Oracle的發展經歷相關的文章就知道,Oracle從開始就這樣)。
這個Bug只需要執行ORACLE_HOME/rdbms/admin/catpatch.sql 腳本就可以了,同時要注意調大java_pool_size 和shared_pool_size這兩個參數的大小,不然會很花時間的。在用sysdba的身份登錄進SQL Plus執行下面的命令:
SQL>shutdown immediate;
SQL>startup migrate;
SQL>@?/rdbms/admin/catpatch.sql
大約半個小時就可以執行完了。