💫《博主主頁》:
🔎 CSDN主頁__奈斯DB
🔎 IF Club社區主頁__奈斯、
🔥《擅長領域》:擅長阿里云AnalyticDB for MySQL(分布式數據倉庫)、Oracle、MySQL、Linux、prometheus監控;并對SQLserver、NoSQL(Redis)有了解
💖如果覺得文章對你有所幫助,歡迎點贊收藏加關注💖
????最近需要幫研發小伙伴導出數據,但遇到個小麻煩——沒有直接連接到遠端Oracle數據庫服務器的權限😅。如果使用傳統的exp工具,直接運行命令就搞定了,但這次需要導出的數據量比較大,并且需要導出高級數據類型(如SecureFiles LOB等),對于exp而言導出速度較慢,以及不支持導出部分數據庫特性。因此需要使用導出速度更快,支持更多導出特性的數據泵expdp,沒想到操作起來有點曲折💦。具體步驟有點復雜:
1?? 先在本地部署一個Oracle實例
2?? 然后在本地實例創建DBLINK和DIRECTORY對象
3?? 最后通過 expdp+NETWORK_LINK 實現遠端導出
????雖然過程麻煩了點,但好在通過查看官方文檔📚和參考DeepSeek🤖,解決了這個問題~ 果然辦法總比困難多? (順便夸夸DeepSeek寫得真詳細👍)
????首先看看通過exp怎么實現直接從遠端數據庫備份至本地環境。
通過exp實現從遠端數據庫備份至本地環境:
????通過 exp 遠端備份的前提,本地安裝了 Oracle 客戶端(包含 exp 工具)即可,本地不需要有Oracle實例,就可以直接將遠程數據庫中的數據導出到本地。
exp \"sys/password@<db_alias>:<listener_port>/<instance_name> as sysdba\" compress=n buffer=4096000 feedback=100000 full=y file=exp_orcl_full.dmp log=exp_orcl_full.log
###1、這里直接使用了簡便連接EZCONECT;如果使用TNS(@實例名)連接的話,則需要通過Tnsnames.ora文件的連接描述符來登錄數據庫。tns這種方式必須保證監聽啟動(listener.ora)不然報ORA-12541: TNS:no listener
###2、通過exp遠端備份連接的用戶和密碼都是遠程數據庫的。
????如上可以看到通過exp實現從遠端數據庫備份至本地環境非常簡單,但exp本身有一定的局限性,比如速度不如expdp,以及不支持XMLType數據的完整導出,對某些高級數據類型(如SecureFiles LOB)支持有限等等。
exp相對于expdp的局限性 功能局限性:
- 性能較低:
- exp是單線程操作,而expdp支持并行處理
- expdp使用直接路徑訪問方式,速度更快
- 不支持部分數據庫特性:
- 不支持XMLType數據的完整導出
- 對某些高級數據類型(如SecureFiles LOB)支持有限
- 不支持導出外部表定義
- 元數據處理能力弱:
- 不能選擇性導出特定對象類型(如表但不含索引)
- 重映射功能有限
???架構局限性:
- 服務器端處理:
- exp在客戶端運行,所有數據需通過網絡傳輸
- expdp在服務器端運行,減少網絡流量
- 作業管理:
- exp沒有作業控制功能
- expdp可以暫停、恢復和監控作業
- 空間效率:
- exp生成的轉儲文件通常較大
- expdp使用壓縮技術(可選的),文件更小
???可用性限制:
- 大對象處理:
- exp處理大型數據庫效率低下
- expdp專為處理TB級數據庫設計
- 安全特性:
- expdp支持加密導出數據
- expdp可與Oracle Wallet集成
????因此11g之后建議使用expdp導出impdp導入數據,同樣的11g之后最好也使用expdp實現從遠端數據庫備份至本地環境。
通過expdp實現從遠端數據庫備份至本地環境:
????通過 expdp 遠端備份的前提,本地安裝了 Oracle 客戶端(包含 expdp 工具),以及啟動了本地Oracle實例,因為需要在本地Oracle實例上創建連接到遠程數據庫的dblink。
關于在本地安裝Oracle數據庫軟件,以及啟動和安裝Oracle實例這里博主就不過多說明了,可以參考官方文檔以及網上找部署資料,可以是Windows環境,也可以是Linux環境。
???
步驟 1:在本地創建 Database Link
???首先,在本地數據庫(或 Oracle 客戶端)上創建一個Database Link,用于連接遠程數據庫:sqlplus / as sysdbacreate database link remote_to_liudbywc133 connect to liudbywcs identified by "123456" using -- CONNECT TO是遠程數據庫的認證用戶和密碼 ' (DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(HOST = 192.168.82.133) -- 遠端數據庫的IP地址(PORT = 1521)) ) -- 遠端數據庫的監聽端口(CONNECT_DATA = (SERVICE_NAME = liudbywc) -- 遠端數據庫的連接服務名) )';
????驗證 Database Link 是否可用
SELECT COUNT(*) FROM remote_schema.remote_table@remote_to_liudbywc133;
???
步驟 2:在本地創建 DIRECTORY 對象
????expdp 只能寫入 Oracle 目錄對象(DIRECTORY),因此需要在本地定義一個目錄:sqlplus / as sysdbaCREATE OR REPLACE DIRECTORY remote_liudbywc133 AS '/home/oracle'; grant all on directory remote_liudbywc133 to sys;
???
步驟 3:使用expdp+NETWORK_LINK導出
expdp \"/ as sysdba\" NETWORK_LINK=remote_to_liudbywc133 directory=remote_liudbywc133 dumpfile=expdp_liudbywc_full_%U.dmp logfile=expdp_liudbywc_full.log full=y parallel=2 COMPRESSION=all
參數選項 描述 NETWORK_LINK 允許直接從遠程數據庫導出數據到本地,而無需在遠程服務器上生成轉儲文件。
NETWORK_LINK 基本概念:
NETWORK_LINK 參數指定一個預先定義的數據庫鏈接(database link),通過這個鏈接,expdp 可以:
????1. 訪問遠程數據庫中的數據和元數據
????2. 將數據直接導出到本地系統的轉儲文件中
????3. 完全避免在遠程服務器上存儲臨時文件
工作原理:
當使用 NETWORK_LINK 時,Data Pump 會:
????1. 通過指定的數據庫鏈接連接到遠程數據庫
????2. 從遠程數據庫讀取數據
????3. 通過數據庫鏈接將數據傳輸到本地
????4. 在本地系統上創建轉儲文件這里需要注意:這里"/ as sysdba"是本地Oracle數據庫的登錄用戶名和密碼,而遠程數據庫的訪問是通過NETWORK_LINK對應的 Database Link 配置的(其中已包含遠程數據庫的用戶名和密碼)。
????"/ as sysdba"是本地Oracle數據庫的登錄用戶名和密碼的原因如下:
- 在本地創建和執行 Data Pump 作業的權限(通常需要 DATAPUMP_EXP_FULL_DATABASE 或 EXP_FULL_DATABASE 角色)。
- 對 DIRECTORY=remote_liudbywc133 的讀寫權限。
???###1、expdp的遠端備份不同于exp,不能直接寫簡便連接加上遠端數據庫的密碼和用戶,這樣會導致dmp文件在遠端數據庫的DIRECTORY目錄下,而不是本地。比如在本地數據庫上執行如下命令,本地數據庫和遠端數據庫都有DATA_PUMP_DIR目錄,執行如下命令后dmp文件在遠端數據庫的DATA_PUMP_DIR目錄下,而不是本地數據庫的DATA_PUMP_DIR目錄上:
expdp \"sys/123456@192.168.82.133:1521/liudbywc as sysdba\" directory=DATA_PUMP_DIR dumpfile=expdp_liudbywc_full_%U.dmp logfile=expdp_liudbywc_full.log full=y parallel=2 COMPRESSION=all
###2、通過expdp遠端備份連接的用戶和密碼都是本地數據庫的,原因參考上面;對于遠程數據庫的訪問是通過NETWORK_LINK對應的 Database Link 配置的(其中已包含遠程數據庫的用戶名和密碼)。
????通過expdp實現從遠端數據庫備份至本地環境到這里就算介紹啦!實現起來不難,但就是比較麻煩,獻給有需要的小伙伴。