入導(dǎo)出與PL/SQL配置指南)
簡介本資源為Oracle 11g 64位版本bin目錄的完整打包面向使用PL/SQL Developer進(jìn)行數(shù)據(jù)遷移的數(shù)據(jù)庫管理員與開發(fā)人員核心解決imp.exe、exp.exe缺失導(dǎo)致無法圖形化導(dǎo)入導(dǎo)出的問題。壓縮包共691個文件約126.04MB以372個dll動態(tài)庫、118個exe可執(zhí)行程序、56個bat批處理腳本為主另含pm、flt、pl、lib等輔助文件涵蓋數(shù)據(jù)庫啟動、配置管理與性能分析等工具鏈。其中imp.exe負(fù)責(zé)將導(dǎo)出文件加載入庫支持表、模式、用戶乃至整庫的選擇性導(dǎo)入exp.exe則用于提取數(shù)據(jù)與對象生成外部文件便于備份、遷移與環(huán)境復(fù)用二者在PL/SQL Developer中通過圖形界面調(diào)用免去手寫命令行參數(shù)的繁瑣。目前已有4156人學(xué)習(xí)下載適合需要快速補(bǔ)齊Oracle客戶端工具、搭建測試環(huán)境或進(jìn)行版本升級遷移的讀者參考使用。1. 為什么我單獨留了一份 Oracle11g 的 bin 目錄上周幫同事處理一個十年前的業(yè)務(wù)庫對方發(fā)來的備份只有.dmp文件服務(wù)器上 Oracle 客戶端早卸了PL/SQL Developer 連上去能查數(shù)據(jù)但導(dǎo)入導(dǎo)出按鈕點下去就報「無法初始化」。翻了一圈才發(fā)現(xiàn)問題不在 PL/SQL而在它調(diào)用的imp.exe和exp.exe根本不在 PATH 里。這兩個小工具是 Oracle 客戶端bin目錄下的命令行程序PL/SQL Developer 的導(dǎo)入導(dǎo)出功能本質(zhì)上是給它們套了個圖形殼真正干活的是這兩個 exe。這份資源就是 Oracle11g 64 位客戶端里的bin目錄核心是imp.exe、exp.exe配套還有impdp.exe、expdp.exe、sqlplus.exe以及一堆依賴 DLL。它解決的是「機(jī)器上沒裝完整 Oracle 服務(wù)端但需要做邏輯備份和遷移」這個場景。適合兩類人一是用 PL/SQL Developer 做日常運(yùn)維、需要走圖形界面導(dǎo)入導(dǎo)出的 DBA二是臨時接手老項目、只想快速把.dmp灌進(jìn)庫里的開發(fā)。如果你機(jī)器上已經(jīng)裝了完整 Oracle 服務(wù)端這份東西對你意義不大服務(wù)端自帶的bin更全。2. imp 與 exp 的定位先搞清它和 impdp 不是一回事2.1 經(jīng)典導(dǎo)出導(dǎo)入與數(shù)據(jù)泵的分界Oracle 的邏輯備份工具分兩代。exp/imp是 Oracle 10g 之前就有的經(jīng)典工具走的是客戶端-服務(wù)端協(xié)同模式導(dǎo)出文件叫「導(dǎo)出轉(zhuǎn)儲文件」擴(kuò)展名習(xí)慣用.dmp。expdp/impdp是 10g 引入的數(shù)據(jù)泵Data Pump走服務(wù)端進(jìn)程性能高、支持并行、能斷點續(xù)傳但要求目標(biāo)庫有對應(yīng)的 DIRECTORY 對象權(quán)限。很多人以為imp是老古董該淘汰實際不是。經(jīng)典模式有個數(shù)據(jù)泵替代不了的優(yōu)勢它不依賴服務(wù)端的 DIRECTORY 目錄對象只要客戶端能連上庫就能把數(shù)據(jù)導(dǎo)到本地任意路徑??绨姹具w移時從高版本往低版本導(dǎo)exp/imp的兼容性反而更穩(wěn)。我經(jīng)手的幾個從 11g 往 10g 回遷的活兒最后都是靠exp救的場。選型上給個直接判斷目標(biāo)庫你能登服務(wù)器、有 DBA 權(quán)限、追求速度用expdp/impdp你只有客戶端連接權(quán)限、導(dǎo)出文件要落本地、或者跨大版本用exp/imp。這份bin目錄兩套工具都齊但標(biāo)題強(qiáng)調(diào)imp.exe/exp.exe說明它的主戰(zhàn)場是經(jīng)典模式。2.2 64 位客戶端與 32 位 PL/SQL 的錯位這里有個血淚經(jīng)驗必須提前說。PL/SQL Developer 長期只有 32 位版本而 Oracle11g 客戶端分 32 位和 64 位。如果你裝的是 64 位客戶端32 位的 PL/SQL 根本加載不了它的 OCI 動態(tài)庫會報「無法定位 OCI.dll」或者「不能初始化確認(rèn)已安裝 32 位 Oracle 客戶端」。那這份 64 位bin目錄怎么用兩種思路。一是你用的是 64 位 PL/SQL Developer14 版本之后官方出了 64 位那直接匹配把bin目錄加進(jìn) PATH 即可。二是你堅持用 32 位 PL/SQL那就得讓 32 位客戶端和這份 64 位bin共存PL/SQL 走 32 位 OCI而imp.exe/exp.exe單獨調(diào)用 64 位版本。共存的關(guān)鍵是 PATH 順序和TNS_ADMIN指向后面第 4 章會展開。提示判斷自己 PL/SQL 是 32 位還是 64 位打開 PL/SQLHelp → About版本號后面會標(biāo) (32 bit) 或 (64 bit)。別靠安裝包名字猜。2.3 bin 目錄里到底哪些文件不能少不是整個bin目錄所有文件都必需但刪錯一個 DLL 就可能讓imp.exe起不來。核心清單如下文件作用是否必需imp.exe經(jīng)典導(dǎo)入工具是exp.exe經(jīng)典導(dǎo)出工具是impdp.exe / expdp.exe數(shù)據(jù)泵工具按需sqlplus.exe命令行連接工具排錯用強(qiáng)烈建議oraclient11.dll客戶端核心庫是oraociei11.dllOCI 即時客戶端庫是orannzsbb11.dll網(wǎng)絡(luò)加密相關(guān)是oci.dllOCI 接口庫PL/SQL 依賴是orasql11.dllSQL 引擎庫是oraociei11.dll這個文件特別大通常上百 MB它是即時客戶端Instant Client的核心。如果你拿到的bin目錄里沒有它imp.exe一運(yùn)行就會報「找不到 oraociei11.dll」。有些精簡包會把它單獨拎出來注意別漏。3. 把 bin 目錄接進(jìn) PL/SQL環(huán)境變量與調(diào)用鏈3.1 環(huán)境變量三件套PATH、ORACLE_HOME、TNS_ADMINimp.exe能不能被 PL/SQL 找到取決于 PATH。能不能連上庫取決于TNS_ADMIN指向的tnsnames.ora。這兩件事分開配別混。假設(shè)你把這份bin目錄放到了D:\oracle\product\11.2.0\client_1\bin配置如下# Windows 系統(tǒng)環(huán)境變量用 setx 永久寫入或系統(tǒng)屬性里手動加 setx PATH %PATH%;D:\oracle\product\11.2.0\client_1\bin /M # ORACLE_HOME 指向 bin 的上一級 setx ORACLE_HOME D:\oracle\product\11.2.0\client_1 /M # TNS_ADMIN 指向存放 tnsnames.ora 的目錄通常是 network\admin setx TNS_ADMIN D:\oracle\product\11.2.0\client_1\network\admin /M邏輯說明PATH 讓系統(tǒng)能找到imp.exeORACLE_HOME是很多 Oracle 工具啟動時自檢的基準(zhǔn)路徑缺了它exp.exe可能報「ORACLE_HOME 未設(shè)置」TNS_ADMIN決定去哪讀tnsnames.ora如果你把網(wǎng)絡(luò)配置文件放在非默認(rèn)位置必須顯式指定。參數(shù)說明/M表示寫系統(tǒng)級變量需要管理員權(quán)限的 CMD。如果只想對當(dāng)前用戶生效去掉/M。改完必須重開 CMD 和 PL/SQL環(huán)境變量不會熱加載。3.2 tnsnames.ora 的最小配置TNS_ADMIN目錄下要有tnsnames.ora內(nèi)容形如ORCL11G (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST 192.168.1.100)(PORT 1521)) (CONNECT_DATA (SERVER DEDICATED) (SERVICE_NAME orcl) ) )HOST填數(shù)據(jù)庫服務(wù)器 IPPORT默認(rèn) 1521SERVICE_NAME填庫的服務(wù)名不是 SID 的話注意區(qū)分。配完用tnsping ORCL11G驗證返回 OK 才算通。tnsping.exe也在bin目錄里順手就能測。3.3 在 PL/SQL 里觸發(fā) imp/expPL/SQL Developer 的導(dǎo)入導(dǎo)出入口在 Tools 菜單下Tools → Import Tables 走imp.exeTools → Export Tables 走exp.exe。點開后它會去 PATH 里找對應(yīng) exe找不到就彈「無法初始化」。一個常見誤區(qū)以為在 PL/SQL 里配了 Oracle Home 就行。實際上 PL/SQL 的 Preferences → Oracle Home 只影響它自己連庫用的 OCI不影響它調(diào)imp.exe時的 PATH 查找。兩者要分別配。我一般先在 CMD 里裸跑一次imp helpy能出幫助信息再回 PL/SQL 點按鈕這樣能把問題隔離在「環(huán)境變量」還是「PL/SQL 配置」上。4. 命令行實操exp 導(dǎo)出與 imp 導(dǎo)入的完整參數(shù)4.1 exp 導(dǎo)出三種模式與常用參數(shù)exp支持三種導(dǎo)出模式整庫FULL、按用戶OWNER、按表TABLES。日常用得最多的是按用戶導(dǎo)。# 按用戶導(dǎo)出導(dǎo)出 scott 用戶所有對象到本地 dmp exp scott/tigerORCL11G fileD:\backup\scott_20240101.dmp logD:\backup\scott_exp.log ownerscott # 按表導(dǎo)出只導(dǎo) emp 和 dept 兩張表 exp scott/tigerORCL11G fileD:\backup\tables.dmp tables(emp,dept) # 整庫導(dǎo)出需要 DBA 權(quán)限 exp system/managerORCL11G fileD:\backup\full.dmp fully邏輯說明file是導(dǎo)出文件路徑log記錄過程日志出問題先看 log。owner指定用戶tables指定表名列表fully整庫。連接串scott/tigerORCL11G里的ORCL11G就是tnsnames.ora里配的服務(wù)名。參數(shù)說明幾個容易踩的consistenty保證導(dǎo)出期間數(shù)據(jù)一致性基于 UNDO大庫導(dǎo)出建議開compressn別壓縮區(qū)段11g 里默認(rèn)行為有變化顯式寫清楚grantsy是否導(dǎo)出權(quán)限遷移到新庫通常要indexesy是否導(dǎo)索引只導(dǎo)數(shù)據(jù)時可設(shè) n 加快速度。buffer參數(shù)控制數(shù)組提取大小默認(rèn)夠用網(wǎng)絡(luò)差時可調(diào)小。4.2 imp 導(dǎo)入順序、忽略與覆蓋導(dǎo)入比導(dǎo)出更容易翻車因為涉及對象已存在時的處理策略。# 標(biāo)準(zhǔn)導(dǎo)入對象已存在則報錯跳過 imp scott/tigerORCL11G fileD:\backup\scott_20240101.dmp logD:\backup\scott_imp.log fully # 忽略已存在對象只補(bǔ)缺失的 imp scott/tigerORCL11G fileD:\backup\scott_20240101.dmp ignorey # 只導(dǎo)入結(jié)構(gòu)不導(dǎo)數(shù)據(jù) imp scott/tigerORCL11G fileD:\backup\scott_20240101.dmp rowsn # 導(dǎo)入到不同用戶從 scott 導(dǎo)到 scott_new imp scott_new/tigerORCL11G fileD:\backup\scott_20240101.dmp fromuserscott touserscott_new邏輯說明ignorey是最常用的參數(shù)表示遇到已存在的表不報錯直接往里追加數(shù)據(jù)。rowsn只建結(jié)構(gòu)適合先搭骨架再單獨灌數(shù)據(jù)。fromuser/touser做用戶映射跨用戶遷移必備。參數(shù)說明commity表示每導(dǎo)入一批就提交大表導(dǎo)入時避免回滾段爆掉但會慢一些buffer控制提交批次大小feedback每導(dǎo)入多少行顯示一次進(jìn)度默認(rèn) 0 不顯示設(shè)成 10000 能看到進(jìn)度條。導(dǎo)入順序上imp會自動先建表再導(dǎo)數(shù)據(jù)再建索引不用手動干預(yù)但如果 dmp 里含序列注意序列當(dāng)前值可能不跟著走導(dǎo)完要手動校準(zhǔn)。4.3 用 sqlplus 做導(dǎo)入后的驗證導(dǎo)完別急著交付用sqlplus核一下行數(shù)和對象數(shù)-- 連接目標(biāo)庫 sqlplus scott/tigerORCL11G -- 查各表行數(shù) SELECT table_name, num_rows FROM user_tables ORDER BY table_name; -- 查無效對象 SELECT object_name, object_type, status FROM user_objects WHERE status INVALID; -- 查序列當(dāng)前值 SELECT sequence_name, last_number FROM user_sequences;num_rows是統(tǒng)計信息里的值可能不準(zhǔn)要精確就SELECT COUNT(*)。INVALID對象多半是視圖或存儲過程依賴缺失重新編譯即可ALTER VIEW 視圖名 COMPILE;。序列的last_number如果和源庫對不上用ALTER SEQUENCE 序列名 RESTART START WITH 新值;校準(zhǔn)。5. 避坑與排查那些讓導(dǎo)入導(dǎo)出卡住的真實原因5.1 現(xiàn)象PL/SQL 點導(dǎo)入報「無法初始化」原因PL/SQL 找不到imp.exe或者找到了但依賴 DLL 缺失。最常見是 PATH 里沒有bin目錄其次是bin目錄里缺oraociei11.dll。解決CMD 里執(zhí)行where imp看能否定位到 exe。定位不到就檢查 PATH。定位到了但 PL/SQL 還報錯在 CMD 里直接跑imp helpy如果報缺 DLL把缺失的 DLL 補(bǔ)進(jìn)bin目錄。補(bǔ) DLL 時注意版本要匹配 11g別從 12c 的目錄里拷。5.2 現(xiàn)象imp 導(dǎo)入報「IMP-00058: 遇到 ORACLE 錯誤 942」原因942 是「表或視圖不存在」。通常發(fā)生在導(dǎo)入順序上——dmp 里某個對象依賴另一個還沒導(dǎo)入的對象或者目標(biāo)用戶下缺少必要的表空間。解決先確認(rèn)目標(biāo)用戶有CREATE TABLE權(quán)限和對應(yīng)表空間配額。如果是表空間不存在先建表空間或改用戶的默認(rèn)表空間。導(dǎo)入時加ignorey讓已存在的跳過減少中斷。實在不行用showy參數(shù)先看 dmp 里到底有哪些 DDLimp ... showy logddl.log把 DDL 導(dǎo)出來人工檢查。5.3 現(xiàn)象導(dǎo)出大表時 exp 卡住不動原因exp默認(rèn)一次性讀取大表加上網(wǎng)絡(luò)延遲會顯得卡死。也可能是 UNDO 表空間不足consistenty時快照太老。解決加feedback10000看進(jìn)度確認(rèn)是在跑還是真卡。網(wǎng)絡(luò)問題就調(diào)小buffer比如buffer4096。UNDO 不足就找 DBA 擴(kuò) UNDO 表空間或者關(guān)掉consistent分批次導(dǎo)。我一般對大表單獨用tables導(dǎo)別混在整用戶導(dǎo)出里。5.4 現(xiàn)象64 位 imp 和 32 位 PL/SQL 沖突原因32 位 PL/SQL 加載 32 位 OCI而 PATH 里 64 位bin在前導(dǎo)致 PL/SQL 誤加載 64 位 DLL報「不是有效的 Win32 應(yīng)用程序」。解決PATH 里把 32 位客戶端路徑放前面64 位bin放后面。PL/SQL 的 Oracle Home 指向 32 位客戶端。調(diào)用imp.exe時因為 32 位客戶端里通常也有imp.exe會優(yōu)先用 32 位的功能一樣。如果非要指定 64 位就在 CMD 里用絕對路徑調(diào)D:\...\64bit\bin\imp.exe。5.5 現(xiàn)象導(dǎo)入后中文亂碼原因源庫和目標(biāo)庫的字符集不一致或者NLS_LANG沒設(shè)對。解決先查兩邊字符集SELECT * FROM nls_database_parameters WHERE parameter NLS_CHARACTERSET;。導(dǎo)入前設(shè)NLS_LANG格式為語言_地區(qū).字符集比如SIMPLIFIED CHINESE_CHINA.AL32UTF8。CMD 里set NLS_LANGSIMPLIFIED CHINESE_CHINA.AL32UTF8再跑imp。字符集不一致時imp會嘗試轉(zhuǎn)換但可能丟字符跨字符集遷移最好用數(shù)據(jù)泵并做轉(zhuǎn)換測試。6. 進(jìn)階用參數(shù)文件批量跑以及一個校驗習(xí)慣命令行參數(shù)一多手敲容易錯。我習(xí)慣把參數(shù)寫進(jìn)parfile一個文件對應(yīng)一次任務(wù)可復(fù)用可版本管理。# exp_scott.par useridscott/tigerORCL11G fileD:\backup\scott_%date%.dmp logD:\backup\scott_exp.log ownerscott consistenty grantsy indexesy feedback10000調(diào)用時exp parfileexp_scott.par。注意%date%這種變量在 parfile 里不會展開得在 CMD 里先算好再傳或者干脆用固定名加日期后綴手動改。parfile 里每行一個參數(shù)#開頭是注釋別寫中文注釋某些版本會解析出錯。導(dǎo)入側(cè)同理imp parfileimp_scott.par。批量場景下我會寫個批處理循環(huán)處理多個 dmpecho off set NLS_LANGSIMPLIFIED CHINESE_CHINA.AL32UTF8 for %%f in (D:\backup\*.dmp) do ( echo 正在導(dǎo)入 %%f imp scott/tigerORCL11G file%%f log%%~nf.log ignorey feedback10000 if errorlevel 1 echo %%f 導(dǎo)入失敗檢查日志 %%~nf.log )邏輯說明for遍歷目錄下所有 dmp%%~nf取文件名不含擴(kuò)展名做日志名。errorlevel 1判斷上一條命令是否失敗失敗就打印提示。這個腳本我用了好幾年唯一要注意的是imp的返回碼有時不準(zhǔn)失敗也可能返回 0所以日志必須人工掃一眼。最后說個校驗習(xí)慣。每次導(dǎo)完我都會跑一遍源庫和目標(biāo)庫的對象數(shù)量對比-- 源庫執(zhí)行記錄結(jié)果 SELECT object_type, COUNT(*) FROM user_objects GROUP BY object_type ORDER BY object_type; -- 目標(biāo)庫執(zhí)行同樣語句逐項對比表、索引、序列、觸發(fā)器的數(shù)量對不上就說明有對象沒導(dǎo)過來。這個動作花不了一分鐘但能擋住大部分「以為導(dǎo)完了其實缺東西」的事故。從那以后我每次交付前都強(qiáng)制走一遍對象計數(shù)對比再附上 exp/imp 的 log 一起歸檔。希望幫到你。本文還有配套的精品資源點擊獲取